我基于 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);
为什么会这样?优化被关闭,所以编译器没有优化它。