0721de 发表于 2016-5-9 16:45:05

STM32CUBE UART中断注意事项

我用的芯片是STM32F405

在主函数之前定义了一个3字节数组
uint8_t uart_receive={0};
uint16_t uart_len =3;
uint8_t*uart_recv =(uint8_t*)&uart_receive;

在主函数里启动UART中断
HAL_UART_Receive_IT(&huart2,uart_recv, uart_len);//开接收中断
while(1);

在接收中断中向上位机发送接到的数据一次发3字节
(1)第一种方式上位机接到的数据不准确
void USART2_IRQHandler(void)
{HAL_UART_Transmit(&huart2,uart_recv, uart_len,10);
HAL_UART_IRQHandler(&huart2);}

    发送bb,接到00 00 00
再发送bb,接到bb 00 00
再发送bb,接到bb bb 00
(2)第二种接到的数据正确
void USART2_IRQHandler(void)   
{ HAL_UART_IRQHandler(&huart2);
HAL_UART_Transmit(&huart2,uart_recv, uart_len,10);}
    发送bb,接到bb 00 00
再发送bb,接到bb bb 00
再发送bb,接到bb bb bb

所以中断里HAL_UART_IRQHandler(&huart2);运行完之后,
数组uart_receive才会被赋与接收到的值

环境:STM32CUBEMX,MDK-4
硬件:STM32F405RGTx,LQFP64封装
UART1:A9和A10

荣丰宇 发表于 2016-5-10 09:12:54

楼主,最好把涉及到源文件发上来看看

chen_hang 发表于 2016-5-10 09:20:37

感谢 楼主 分享 最近正在学习STM32Cube 正好遇到串口收发的问题

jinglixixi 发表于 2016-5-10 11:40:54

第一种方法好像滞后了一个节拍。

wtliu 发表于 2016-5-10 12:22:37

对,要先接收再赋值就对了。

power568 发表于 2016-5-10 14:35:29

我觉得肯定是第二种方式正确,进入中断后肯定要先接收数据,再调用发送函数吧接收到的数据发送出来,这才是合理的流程...

watershade 发表于 2016-5-10 21:17:10

本帖最后由 watershade 于 2016-5-10 21:23 编辑

楼主个人觉得这样接收数据可能是不对的。如果你的确想收到三个数再中断或者时间到了再中断,你的中断处理函数最好用HAL_UART_RxCpltCallback()来处理。
而且既然要用中断,那你就要考虑中断怎么用。硬件上每接收到一帧数据就触发一次中断,那么官方的库函数如果还让你每次中断就处理一下数据那意义就不打了。在终端处理函数那里国防接管了简单的数据处理。你倒是可以添加一些触发标识计数之类的。
另外还有这样一条函数HAL_UART_RxHalfCpltCallback()能想到它的意思吗。若用F可以看看UM725,其他系列也有。你自己找一下吧

页: [1]
查看完整版本: STM32CUBE UART中断注意事项