STM32
登录
直播中
周必镜
7年用户
909经验值
私信
关注
[问答]
基于usart的HAL库的中断问题有哪些?怎样去解决
开启该帖子的消息推送
HAL库
USART
中断
HAL库中的中断的流程是怎样的?
基于usart的HAL库的中断问题有哪些?怎样去解决?
回帖
(1)
李兵
2021-12-10 13:35:01
【stm32MXcube+HAL库笔记】HAL库中中断的问题(基于usart)
前段时间做hal库的东西时候遇到的一点小问题,然后仔细研究学习了一下做了一个笔记
1 HAL库中中断的流程
hal库中断流程是比标准库中断要多的。
分为
中断服务程序
:和标准库里的一样的,一般放置在it.c文件里
中断通用处理函数
:hal库下特有的中断处理函数,用于判断这对这个中断源,是哪个具体的中断引起,比如串口,中断通用处理函数判断是usart1出发中断,但是并不知道是什么中断,可能是发送中断,也可能是接受中断
中断接收函数
:hal库特有,由中断通用处理函数引导出来,处理具体的中断信号(比如usart1的发送中断),在完成之后会自动调用中断回调函数
==
中断回调函数
:hal库特有,用户可以编写。我的个人理解就是,标准库中放在中断服务函数里的东西,放在这个函数里,具体就是执行中断触发接下来要干啥,也不需要你清空标志位,在上一个函数中就清完了,用户层想干啥就往里面塞就完事了。
2 中断中一些特别的地方(usart为例)
1、在每次回调函数中要加下代码
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); 要重新是能中断,因为在中断接受函数中,会自动把中断使能关了。
2、当进入接受回调函数之后,状态就是准备状态 然后
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); //再开启接收中断 之后就会改变状态为接受正忙,然后我们此时还要发送数据的话,就会导致发送和接受状态一起工作处于buzy状态 ,这和中断标志位是不太一样的哦
这个地方还是蛮恶心的,有两种标志位,一种是用户手册那个里的标志位,还有一个是hal库里的定义的标志位
3 以下是杂乱的学习笔记
第九章:串口通讯
1、串行和并行通讯
2、串行通讯:同步串行和异步串行
3、波特率:每秒传送二进制数码的为数,以bit/s(bps)为单位
4、字符格式:字符中数据的传输形式 波特率
5、
6、串口收发单元功能框图:
发送数据寄存器TDR 发送移位寄存器TC接受数据寄存器RDR 接受移位寄存器
数据寄存器DR
通讯状态标志位:TXE TC RXNE
TC为1时才表示数据真正地发送完成
7、 HAL库外设初始化设计思想
8、串口初始化数据类型
Parity:设置奇偶校验
9、外设初始化设计思想
初始化外设句柄 句柄参数写入寄存器 与MCU相关的初始化
10、
11、实验:串口重定向
添加头文件“stdio.h”
HAL_MAX_DALAY超时无限循环等待
12、串口中断方式通讯
串口中断通用处理函数
串口发送中断回调函数 串口接受中断回调函数
13、
14、
15、
16、基础任务:固定长度的数据收发
17、对于USART的中断发送模式的一些小的注意
首先这一句直接表明是中断方式通讯发送,表明发送的串口,数据,以及数据长度
上述函数直接在完成时候使能发送寄存器为空中断,一旦发送寄存器为空就会进入中断服务函数void USART1_IRQHandler(void)
进入中断服务函数后直接进入hal库的中断通用函数
通用函数的作用用来判断是什么类型的中断,因为usart1发生的所有中断都会进入usart1的中断服务函数,所以这里我们要进行判断再进行下一步的操作
这里首先如果发送寄存器为空 则进入发送数据
如果发送移位寄存器为空,则结束发送
这个函数是用于发送数据
发送完成的数据又要已经入中断服务函数
18、
这个地方搞死我了,原因在于发送寄存器发送需要时间,而直接继续发送会导致发送不出去下面需要的命令。所以需要添加延迟
19、
这里使用的printf函数输出打印,发现如果要输出字符和%d输出asc2码是不一样的,同时后面应该要加变量而不是地址,所以不需要对RxBuffer加取地址符号,而是应该*RxBuffer才对
20、编写的usart-led
这里需要注意的是,对于usart需要设置一个数组去存储接收到的数据,然后再进行判断,用完之后要记得对该数组进行清空,有命令memset();l
21、之前所说的需要一个延迟让发送完成
这里有一个点是hal_busy和tx_rxbuzy是不一样的,具体原因我还没看等下
但是要学会这个while循环和清空临时数组的操作
22、关于上一个问题的解释:
我们发现:当进入接受回调函数之后,状态就是准备状态
然后 HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); //再开启接收中断
之后就会改变状态为接受正忙,然后我们此时还要发送数据的话,就会导致发送和接受状态一起工作处于buzy状态 这和中断标志位是不太一样的哦
很久很久前的笔记,终于补上了。
【stm32MXcube+HAL库笔记】HAL库中中断的问题(基于usart)
前段时间做hal库的东西时候遇到的一点小问题,然后仔细研究学习了一下做了一个笔记
1 HAL库中中断的流程
hal库中断流程是比标准库中断要多的。
分为
中断服务程序
:和标准库里的一样的,一般放置在it.c文件里
中断通用处理函数
:hal库下特有的中断处理函数,用于判断这对这个中断源,是哪个具体的中断引起,比如串口,中断通用处理函数判断是usart1出发中断,但是并不知道是什么中断,可能是发送中断,也可能是接受中断
中断接收函数
:hal库特有,由中断通用处理函数引导出来,处理具体的中断信号(比如usart1的发送中断),在完成之后会自动调用中断回调函数
==
中断回调函数
:hal库特有,用户可以编写。我的个人理解就是,标准库中放在中断服务函数里的东西,放在这个函数里,具体就是执行中断触发接下来要干啥,也不需要你清空标志位,在上一个函数中就清完了,用户层想干啥就往里面塞就完事了。
2 中断中一些特别的地方(usart为例)
1、在每次回调函数中要加下代码
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); 要重新是能中断,因为在中断接受函数中,会自动把中断使能关了。
2、当进入接受回调函数之后,状态就是准备状态 然后
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); //再开启接收中断 之后就会改变状态为接受正忙,然后我们此时还要发送数据的话,就会导致发送和接受状态一起工作处于buzy状态 ,这和中断标志位是不太一样的哦
这个地方还是蛮恶心的,有两种标志位,一种是用户手册那个里的标志位,还有一个是hal库里的定义的标志位
3 以下是杂乱的学习笔记
第九章:串口通讯
1、串行和并行通讯
2、串行通讯:同步串行和异步串行
3、波特率:每秒传送二进制数码的为数,以bit/s(bps)为单位
4、字符格式:字符中数据的传输形式 波特率
5、
6、串口收发单元功能框图:
发送数据寄存器TDR 发送移位寄存器TC接受数据寄存器RDR 接受移位寄存器
数据寄存器DR
通讯状态标志位:TXE TC RXNE
TC为1时才表示数据真正地发送完成
7、 HAL库外设初始化设计思想
8、串口初始化数据类型
Parity:设置奇偶校验
9、外设初始化设计思想
初始化外设句柄 句柄参数写入寄存器 与MCU相关的初始化
10、
11、实验:串口重定向
添加头文件“stdio.h”
HAL_MAX_DALAY超时无限循环等待
12、串口中断方式通讯
串口中断通用处理函数
串口发送中断回调函数 串口接受中断回调函数
13、
14、
15、
16、基础任务:固定长度的数据收发
17、对于USART的中断发送模式的一些小的注意
首先这一句直接表明是中断方式通讯发送,表明发送的串口,数据,以及数据长度
上述函数直接在完成时候使能发送寄存器为空中断,一旦发送寄存器为空就会进入中断服务函数void USART1_IRQHandler(void)
进入中断服务函数后直接进入hal库的中断通用函数
通用函数的作用用来判断是什么类型的中断,因为usart1发生的所有中断都会进入usart1的中断服务函数,所以这里我们要进行判断再进行下一步的操作
这里首先如果发送寄存器为空 则进入发送数据
如果发送移位寄存器为空,则结束发送
这个函数是用于发送数据
发送完成的数据又要已经入中断服务函数
18、
这个地方搞死我了,原因在于发送寄存器发送需要时间,而直接继续发送会导致发送不出去下面需要的命令。所以需要添加延迟
19、
这里使用的printf函数输出打印,发现如果要输出字符和%d输出asc2码是不一样的,同时后面应该要加变量而不是地址,所以不需要对RxBuffer加取地址符号,而是应该*RxBuffer才对
20、编写的usart-led
这里需要注意的是,对于usart需要设置一个数组去存储接收到的数据,然后再进行判断,用完之后要记得对该数组进行清空,有命令memset();l
21、之前所说的需要一个延迟让发送完成
这里有一个点是hal_busy和tx_rxbuzy是不一样的,具体原因我还没看等下
但是要学会这个while循环和清空临时数组的操作
22、关于上一个问题的解释:
我们发现:当进入接受回调函数之后,状态就是准备状态
然后 HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); //再开启接收中断
之后就会改变状态为接受正忙,然后我们此时还要发送数据的话,就会导致发送和接受状态一起工作处于buzy状态 这和中断标志位是不太一样的哦
很久很久前的笔记,终于补上了。
举报
更多回帖
rotate(-90deg);
回复
相关问答
HAL库
USART
中断
怎样
去
开发STM32L053R8
USART
Hal
库
2021-10-09
667
怎样
去
使用
HAL
库
中断
接收函数呢
2021-11-16
999
怎样
去
解决
HAL
库
外部
中断
的程序出bug的问题呢
2022-01-20
1156
怎样
去
使用STM32F746_
HAL
库
呢
2021-10-14
1035
怎样
去
使用串口空闲
中断
避免数据丢失呢
2021-12-09
2258
STM32
HAL
库
与标准
库
的区别有哪些
2021-10-25
2076
如何
去
实现基于
HAL
库
的Printf函数功能重定向呢
2021-10-15
2769
基于
HAL
库
中的串口
中断
接收函数该如何
去
实现呢
2021-12-06
1583
低功耗串口LPUART的
HAL
库
该
怎样
去
使用呢
2021-12-10
1790
为什么STM32CUBE
HAL
库
的串口加入接收
中断
后开始出bug了
2021-12-14
1015
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分