打印
[信息]

【实战经验】一个UART应用异常案例分析

[复制链接]
571|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 香水城 于 2017-8-11 14:26 编辑

UART应用异常案例分析

前言
在Cube软件包中,为不同系列MCU、不同外设提供了对应的例程方便开发参考。其中,针对STM324xG-EVAL平台提供了UART中断发送接收的例程。开发者参考了这个例程进行UART功能开发,并且为了实现不间断的接收功能,在接收回调函数中,再次调用中断接收函数。在这种情况下,出现了例程执行异常。本文分析了这种情况出现原因及解决方法。

问题描述
测试验证板: STM3240G-EVAL
参考例程路径:STM32Cube_FW_F4_V1.15.0\Projects\STM324xG_EVAL\Examples\UART\UART_Hyperterminal_IT

基于上述例程,出于前言中交代的应用目的,在接收回调函数HAL_UART_RxCpltCallback中,再次调用HAL_UART_Receive_IT。
随后出现例程执**死在下面红色标识的语句处,导致了UART中断发送无**确被执行。

问题分析及解决
根据描述,首先考虑到是否由于UART始终处于接收忙状态,导致中断发送收到影响。但是UART外设具有发送数据寄存器和接收数据寄存器,以及互不影响的接收、发送中断。
继续对问题进行定位,发现在HAL_UART_GetState函数中,会同时获取发送和接收状态。这意味着,只有在发送和接收同时处于就绪状态时,中断发送函数才会被执行。而开发者的应用实现中,使得UART始终处于接收状态,从而判断无法通过。
清楚了产生原因后,问题解决就一目了然了。只需将对发送和接收状态的判断,改写成仅对发送的状态的判断,如下所示。其中gState对应着发送状态。

总结
在使用Cube软件包例程时,最好能够对各驱动接口函数有一定认识。例如上述问题,对于例程来说,没有问题。但是转移到应用时,就需要考虑到例程中调用的判断函数是否符合应用目的了。
而对于各驱动接口函数,在函数定义处,都给出了介绍,包括各参数说明。同时,在Cube软件包的Drivers目录下,提供了对驱动接口函数介绍的文档。


更多实战经验请看:【ST MCU实战经验汇总贴】
沙发
mmuuss586| | 2017-5-19 13:29 | 只看该作者

使用特权

评论回复
板凳
734774645| | 2017-5-19 15:45 | 只看该作者
楼上酱油党,鉴定完毕,下载一下城主的资料学习学习。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:STM32技术专家

596

主题

17099

帖子

287

粉丝