STM32
直播中

周必镜

7年用户 909经验值
私信 关注
[问答]

基于usart的HAL库的中断问题有哪些?怎样去解决

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状态 这和中断标志位是不太一样的哦
很久很久前的笔记,终于补上了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分