【发布时间】:2015-09-18 08:30:16
【问题描述】:
我正在使用与 xbee 连接的 STM32f4 发现板来接收来自远程温度传感器的温度数据。使用的代码是 CMIS UART 示例代码。我将接收数据包数据,一次 1 个字节。换句话说,只要接收到每个字节,就会调用 UART 接收中断。一旦我得到完整的数据包,我将复制温度数据。我的 UART 回调函数可以正常工作。但是几个小时后,UART接收中断停止工作,UART无法接收任何东西。但是 UART 传输仍然有效。我正在使用波特率为 115200 的 UART1。我已将 UART 中断优先级设置为 0,并且没有其他中断共享此优先级。所有其他中断优先级均低于 UART。谁能告诉我为什么UART中断停止触发?
#define PACKET_DELIMETER 0x7E
uint8_t g_frame_ok=0; //flag to indicate complete packet received
uint8_t g_index_of_aoBuf=0; //Index of receive buffer
uint8_t g_aoBuf_of_xbee[100]={0};//Receive Buffer
uint8_t r_byte=0; //Receiving byte
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *allUartHandle)
{
__HAL_UART_FLUSH_DRREGISTER(allUartHandle);
if(HAL_UART_Receive_IT(allUartHandle, (uint8_t *)&r_byte, 1) == HAL_OK) //Interrupt occurs when each byte arrives
{
if(r_byte==PACKET_DELIMETER)
{
//start receiving packet
}
if( g_index_of_aoBuf>=g_aoBuf_of_xbee[2]+4)
{
g_frame_ok=1;
BSP_LED_On(LED4);
}
}
}
【问题讨论】:
-
如果我理解正确,您的代码是从 CMSIS UART 示例派生的?你能附上这个例子的链接吗?我从来没有使用过这些 API,但看起来你真的做错了……
-
我已经从这个链接下载了示例代码。 st.com/web/en/catalog/tools/PF259243。示例代码接收中断回调函数与我的代码不同。在示例代码中,将针对特定数量的缓冲区大小调用接收中断。但是在我的代码中,每个字节都会调用接收中断。你能告诉我我在这里做错了什么吗?
-
如果 UART 外设与 stm32f0 系列上的相同/相似,您确实需要检查溢出和帧错误并适当地“清除”条件。否则,一个位错误可能会锁定外围设备,直到您重新启动。 ST 的免费软件和示例几乎从不为强大的生产代码提供足够的错误处理。
-
你找到这个问题的解决方案了吗?就我而言,它仅在 10 - 15 分钟后停止!
标签: c embedded stm32f4discovery cmsis