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

STM32L4零基础学习笔记(六)串口通讯之踩到的坑

[复制链接]
D5Power 发布时间:2017-11-12 10:40
本帖最后由 D5Power 于 2017-11-16 16:45 编辑


总结下这几天踩过的坑

一、第一个坑,中断设置

一直天真的以为,串口的中断是可以“无需人工设置,自主自发自动”进行的。结果自然是被打脸了。无论如何调试,也进不到中断里去。查阅资料后发现,依然是需要在STM32CubeMX中设置好。设置的位置就在Configuration中的USART2设置(对应你自己要用的串口),如下图所示,将NVIC Setting中的USART2 global interrupt 勾选Enabled,启用中断。英语学习时间:NVIC=
Nested Vectored Interrupt Controller ,即嵌套中断向量控制器。
0.jpg

二、第二个坑 波特率

如笔记五所记录的内容,在使用开发板发数据到电脑的时候(通过printf方法),数据完全正常,没有任何问题。而当我试着把电脑发送过来的数据进行解析时,却发现开发板收到的数据一直和接收的数据不一致。猜测是波特率不符的原因。但是从表面上看,开发板和SSCOM设置的波特率都是115200,应该没错。想起自己没有设置时钟频率,又跑去STM32CubeMX中,把时钟频率设置成了80MHz,依旧无效。最后考虑是不是达不到这么高的波特率,在把波特率降低到4800后,终于成功了。

根据网上查到的资料,波特率和时钟频率是有关系的,至于具体的关系是怎样的,现在没有去深究。或许不久就会回过头来继续研究这个问题。

三、波特率和HAL_UART_Transmit

HAL_UART_Transmit的第三个参数,用来指定最大的发送时间。如果超过这个发送时间还没有发送成功,那么就会返回发送超时。更郁闷的是,如果产生了发送超时,那么后面连接收中断都不会触发了(本问题有待深究)。

由于我设置的波特率是4800,也就是说,每秒可以发送4800Bit数据,也就是600字节(Byte)。那么,发送1个字节所需要的时间即为1000/600,大约为1.6毫秒。所以,如果我的传送代码直接复制网上的代码:

HAL_UART_Transmit(&huart,(uint8_t *)p,1);

给定1毫秒的最大发送时间,那么必然会进入超时。结果就是数据发送出去了,但不会再触发接收中断。因此,需要针对波特率进行调整。代码如下:

#define BAUDRATE 4800
#define SEND_TIME_PER_BYTE 2

定义波特率和发送1个字节所需要的最小时间(2毫秒)

void send(uint8_t *p,uint8_t size)
{
        HAL_UART_Transmit(&huart2,p,size,size*SEND_TIME_PER_BYTE);
}

定义一个发送方法,自动根据发送的数据尺寸来计算最小发送时间。但是我觉得这只能算是个临时的方法,最终还是要解决超时而导致接收中断不能触发的问题。这笔暂且记下。



----------------我是淫荡的分割线----------------

编写中的笔记会在我个人的公众号进行,请各位高手斧正。

083956bwddhh6ankua6poh.jpg
关于单片机、H5游戏开发和微信小程序

收藏 1 评论2 发布时间:2017-11-12 10:40

举报

2个回答
joezhuang007 回答时间:2018-7-29 08:24:24
学习
熊猫仙 回答时间:2019-7-2 09:19:20
设置串口全局中断后,资源占用一下多了3.4k,导致FLASH不够用了,有解吗?

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版