ST意法半导体
直播中

efwedfd

8年用户 1093经验值
擅长:EMC/EMI设计
私信 关注
[问答]

请教大神怎样才能使RX USART1的ISR正常工作呢

我基于 LoRaWAN_AT_Slave_DualCore_CM4 的应用程序。我目前正致力于将 USART1 添加到应用程序中,并已成功使用 LL_USART_TransmitData8() 从 MCU 传输数据。
我遇到了一种我无法解释的奇怪行为。我每秒钟调用以下函数:
  • void GPS_routine(GPS_data *gpsData, uint8_t *GPS_fix, uint16_t currSeconds)
  • {
  •     static uint8_t GPS_activeRx = false;
  •     if (!(*GPS_fix))
  •     {
  •         if (currSeconds > GPS_TIMEOUT_SEC)
  •         {
  •             if (GPS_activeRx){
  •                 GPS_activeRx = false;
  • //                GPIO_setOutputHighOnPin(nGPS_ON_PORT, nGPS_ON_PIN); // Turn off GPS
  •                 LL_USART_DisableIT_RXNE_RXFNE(USART1);
  •             }
  •         } // if (GPS_TIMEOUT_SEC > secondsCtr)
  •         else if (currSeconds > GPS_START_SEC)
  •         {
  •             if (!GPS_activeRx){
  •                 GPS_activeRx = true;
  •                 LL_USART_EnableIT_RXNE_RXFNE(USART1);
  • //                LL_USART_EnableIT_RXNE_RXFNE(USART1);
  •             }
  •             *GPS_fix = GPS_aquireData(gpsData);
  •             if (*GPS_fix){
  • //                GPIO_setOutputHighOnPin(nGPS_ON_PORT, nGPS_ON_PIN); // Turn off GPS
  •                 LL_USART_DisableIT_RXNE_RXFNE(USART1);
  •             }
  •         } // else if (secondsCtr > GPS_START_SEC)
  •     } // if (!GPS_fix)
  • }
出于某种原因,USART1 RX ISR 没有被触发:
  • if(LL_USART_IsActiveFlag_RXNE(USART1) && LL_USART_IsEnabledIT_RXNE(USART1))
  •           {
  •             /* RXNE flag will be cleared by reading of RDR register (done in call) */
  •             /* Call function in charge of handling Character reception */
  •             UART_CharReception_Callback();
  •           }
使 RX USART1 的 ISR 工作的唯一方法是调用 LL_USART_EnableIT_RXNE_RXFNE() 两次:
  • if (!GPS_activeRx){
  •                 GPS_activeRx = true;
  •                 LL_USART_EnableIT_RXNE_RXFNE(USART1);
  •                 LL_USART_EnableIT_RXNE_RXFNE(USART1);
  •             }
如果我只调用一次,则 Rx ISR 永远不会被调用。我想也许RXNE没有被清除,所以我也试过:
  • LL_USART_ReceiveData8(USART1);
  • LL_USART_EnableIT_RXNE_RXFNE(USART1);
想可能需要先清除RXNE,但还是不行。我能让它工作的唯一方法是在 main 中调用 LL_USART_EnableIT_RXNE_RXFNE() 或在 gps_routine 中调用两次:
  • LL_USART_EnableIT_RXNE_RXFNE(USART1);
  • LL_USART_EnableIT_RXNE_RXFNE(USART1);
为什么会这样?优化被关闭,所以编译器没有优化它。

回帖(1)

汪海源

2022-12-26 10:55:14
我不会为所有的资格和回调而烦恼,而是在 IRQ 处理程序中检查状态寄存器中的错误标志,然后明确清除它们。
在任何情况下,您都应该检查状态寄存器以查看标记的内容。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分