硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3218|回复: 11
收起左侧

[BSP视频教程] BSP视频教程第20期:串口专题之玩转HAL库,LL库和寄存器方式实现方法以及参考手册几个关键时序图学习(2022-07-16)

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2022-7-16 04:51:37 | 显示全部楼层 |阅读模式
本期开始录制串口专题视频教程。像bootloader专题一样,这个专题也做透,彻底整明白了。

这个专题还有modbus主从机,含modbus rtu和modbus ascii,还有个modbus over udp,modbus over tcp安排到网络协议栈视频教程里面。

还有客户也需要Xmodem,Ymodem,Zmodem协议支持,用于串口方式的文件传输,我们也一并支持了。


视频:

https://www.bilibili.com/video/BV1DV4y1E7r4




通过下面框图和时序图可以方便了解各种特性:
image.png

image.png

image.png

image.png

参考资料:

【小知识】使用串口8bit,7bit和6bit数据格式的奇偶校验问题
https://www.armbbs.cn/forum.php?mod=viewthread&tid=109848


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
 楼主| 发表于 2022-7-16 05:01:39 | 显示全部楼层
更新完毕。
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2022-7-16 10:56:41 | 显示全部楼层
版主你好,最近使用STM32F407的串口一和串口四遇到一些问题想请教一下,一收到消息通过四发出,四收到消息通过一发出,使用的HAL库,接收和发送都是使用中断方式,结果代码经常从中断处理函数中进入硬件异常错误,自己在中断处理时不使用HAL库只是简单的判断一下就可以正常使用,网上查询了下资料,有的说是HAL库中断处理时使用了锁导致不是全双工的了,我尝试屏蔽HAL_LOCK并不能解决问题,不知道大佬有什么建议?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
 楼主| 发表于 2022-7-16 11:27:05 | 显示全部楼层
flygo 发表于 2022-7-16 10:56
版主你好,最近使用STM32F407的串口一和串口四遇到一些问题想请教一下,一收到消息通过四发出,四收到消息 ...

HAL库判断返回值比较重要看看是否成功,如果成功,说明不是HAL这里的问题。
回复

使用道具 举报

5

主题

192

回帖

212

积分

高级会员

积分
212
发表于 2022-7-16 15:12:35 | 显示全部楼层
flygo 发表于 2022-7-16 10:56
版主你好,最近使用STM32F407的串口一和串口四遇到一些问题想请教一下,一收到消息通过四发出,四收到消息 ...

我用HAL库没遇到这种情况啊?
回复

使用道具 举报

2

主题

14

回帖

20

积分

新手上路

积分
20
发表于 2023-1-19 19:17:44 | 显示全部楼层
image.png
硬汉哥,这里是不是可以改成只关闭串口中断呀
回复

使用道具 举报

19

主题

234

回帖

291

积分

高级会员

积分
291
发表于 2023-1-19 20:33:43 | 显示全部楼层
fcz 发表于 2023-1-19 19:17
硬汉哥,这里是不是可以改成只关闭串口中断呀

如果多个线程都调用这个,那么估计不够。要么加互斥锁配合关串口中断,要么就用这个直接关掉所有中断避免线程切换和中断
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
 楼主| 发表于 2023-1-20 01:02:27 | 显示全部楼层
fcz 发表于 2023-1-19 19:17
硬汉哥,这里是不是可以改成只关闭串口中断呀

可以,注意楼上坛友说的问题。
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2023-4-28 15:07:07 | 显示全部楼层
eric2013 发表于 2022-7-16 11:27
HAL库判断返回值比较重要看看是否成功,如果成功,说明不是HAL这里的问题。

不好意思,硬汉哥,搞错了,我用的是stm32f103的板子,两个串口A串口接收消息通过B发出,B串口接收到消息通过A发出,然后两个串口分别接电脑串口工具,电脑开两个串口工具分别连接A,B并且分别从A,B发消息,理论上是,A串口监视框里不断地显示一条A发出的消息,一条接受到的来自B的消息,B串口的监视框同样如此,在发送过程中大概1-2分钟后就会进入hard fault,打开KEIL的Fault Reports 显示是Bus Faults总线异常导致的Hard Faults 异常,Bus Faults的PRECISERR 和BFARVALID位置位了,LR指针跳转为0xFFFFFFF1,串口波特率是125000,8位1停止位无校验,发包间隔是100ms,检测中断函数中经常从HAL库的CR3_DMAR置位后调用的UART_EndRxTransfer函数中清除CR3_EIE操作中跳转Hard Faults,奇怪的是我没有使用DMA,期望您能给些解决思路或者方法,万分感谢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
 楼主| 发表于 2023-4-29 07:08:30 | 显示全部楼层
flygo 发表于 2023-4-28 15:07
不好意思,硬汉哥,搞错了,我用的是stm32f103的板子,两个串口A串口接收消息通过B发出,B串口接收到消息 ...

没有使用DMA的话,配置好串口后,DR寄存器配合TC发送完成标志,手动发送试试
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2023-5-6 09:48:43 | 显示全部楼层
eric2013 发表于 2023-4-29 07:08
没有使用DMA的话,配置好串口后,DR寄存器配合TC发送完成标志,手动发送试试

现在这样处理后单片机不会进入硬件异常了,我在中断函数中将后面的屏蔽掉只保留接收函数和发送函数
中断1.PNG

中断处理函数发送函数部分

中断处理函数发送函数部分



然后在接收回调函数中对帧错误,ORE溢出错误进行清除,并且重新置位接收,置位失败时会解锁、改变接收状态REDAY,直到置位成功

中断回调函数处理

中断回调函数处理

我使用的是串口4和串口1,现在的问题是串口1的发送过一段时间就不能发送了,原因是我在发送完成回调函数中的一个我设置的变量没有置位,导致应用层在发送数据前检查这个标志不通过就没法送了,也就是这个发送完成回调函数没有执行,也就是发送完成函数没有被执行,但是发送完成TCIE标志位却被清除了,可我清除这个标志的地方就在发送完成函数里

串口状态.PNG 发送完成.PNG
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
 楼主| 发表于 2023-5-6 17:30:53 | 显示全部楼层
flygo 发表于 2023-5-6 09:48
现在这样处理后单片机不会进入硬件异常了,我在中断函数中将后面的屏蔽掉只保留接收函数和发送函数

改HAL库源码不太好,可以考虑自己重新实现个串口中断。
另外MDK这个展示,这个展示不准,尤其要注意下。

不过总的来看,你的串口工作起来后,是不是触发了串口错误标志
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-26 23:23 , Processed in 0.210201 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表