你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CUBE UART中断注意事项

[复制链接]
stmcuman 提问时间:2016-5-9 16:45 /
我用的芯片是STM32F405

在主函数之前定义了一个3字节数组
uint8_t uart_receive[3]={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

STM32F405.rar

下载

6.72 MB, 下载次数: 17, 下载积分: ST金币 -1

STM32CUBEMX,UART实验

收藏 评论6 发布时间:2016-5-9 16:45

举报

6个回答
荣丰宇 回答时间:2016-5-10 09:12:54
楼主,最好把涉及到源文件发上来看看

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

chenbourne 回答时间:2016-5-10 09:20:37
感谢 楼主 分享 最近正在学习STM32Cube 正好遇到串口收发的问题
jinglixixi 回答时间:2016-5-10 11:40:54
第一种方法好像滞后了一个节拍。

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

wtliu 回答时间:2016-5-10 12:22:37
对,要先接收再赋值就对了。

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

power568 回答时间:2016-5-10 14:35:29
我觉得肯定是第二种方式正确,进入中断后肯定要先接收数据,再调用发送函数吧接收到的数据发送出来,这才是合理的流程...

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

watershade 回答时间:2016-5-10 21:17:10
本帖最后由 watershade 于 2016-5-10 21:23 编辑

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

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版