STM32
登录
直播中
温暖镜头
9年用户
971经验值
擅长:电源/新能源 制造/封装
私信
关注
[问答]
如何对STM32CubeMx串口收发程序进行测试呢
开启该帖子的消息推送
stm32cubemx
串口
程序
演示程序有何功能?
如何对
STM32
CubeMx串口收发程序进行测试呢?
回帖
(1)
赵文娜
2021-12-13 13:54:44
2.1
程序规划
演示程序的功能:通过中断接收串口数据,在1750us时间内没有收到新的字节的话,将收到的数据原封不动地发送出去,以测试串口的完整收发流程。
2.2
函数说明
STM32CubeMx自动生成的初始化函数,这里不再做说明。
(1)HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
对于这个函数,认为这是一个配置函数,配置串口号、接收缓存区的指针和每次接收的数量,并使能接收中断。
图2-1是此测试程序的该函数的调用,每次接收一个字节,存在ucUartTempBuf中。
图2-1
(2)HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)
此函数在串口的中断服务程序中调用,作用是将接收到的字节放到接收缓存区,判断整个数据是否已接收完整(是否已达到配置的数量),接收完整的话调用HAL_UART_RxCpltCallback(),并禁止接收中断。
(3)HAL_UART_RxCpltCallback()
此函数是一个回调函数,需要用户编写,在此函数中,可以将收到的数据进行转移,如果需要继续接收的话,还要再次调用HAL_UART_Receive_IT(),由于这个回调函数有可能会被多个串口中断服务程序调用,因此在函数中需要区分串口。
此篇文章的测试程序中,在此函数中启动定时器,用于1750us的定时。代码如图2-2所示。
图2-2
(4)HAL_TIM_PeriodElapsedCallback()
此函数是一个回调函数,当定时器产生溢出中断时调用,需要用户编写,此测试程序中,定时1750us的时间到,说明一个完整数据帧已接收完成,调用HAL_UART_Transmit_IT()函数,将收到的数据,原封不动地发送回去。
图2-3
(5)HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
认为,此函数也是一个配置函数,将发送数据指针和数量赋给相应的寄存器,然后使能发送缓存区为空中断,以便通过中断的方式将数据逐个字节的发送出去。
(6)HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart)
此函数在uart的中断服务程序中调用,将数据发到uart硬件缓存区,并监视已发送数量,发送数量达到目标值后,禁止发送缓存区为空中断。
2.3
函数调用顺序
函数调用顺序如图2-4所示。此图只是大体上展示了各个函数的调用顺序和调用关系,并不完全准确,由于中断的存在,有的进程是并行进行的。
图2-4
2.4
测试结果
准备两帧数据:01 03 00 00 00 0A C5 CD;
01 10 00 00 00 05 0A 00 01 00 02 00 03 00 04 00 05 EA 6A;
各发送两帧,查看目标板的回复数据,如图2-5所示。自此,uart的收发流程就演示完毕,这也类似于Modbus串口通信的一个基本框架。
图2-5
2.1
程序规划
演示程序的功能:通过中断接收串口数据,在1750us时间内没有收到新的字节的话,将收到的数据原封不动地发送出去,以测试串口的完整收发流程。
2.2
函数说明
STM32CubeMx自动生成的初始化函数,这里不再做说明。
(1)HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
对于这个函数,认为这是一个配置函数,配置串口号、接收缓存区的指针和每次接收的数量,并使能接收中断。
图2-1是此测试程序的该函数的调用,每次接收一个字节,存在ucUartTempBuf中。
图2-1
(2)HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)
此函数在串口的中断服务程序中调用,作用是将接收到的字节放到接收缓存区,判断整个数据是否已接收完整(是否已达到配置的数量),接收完整的话调用HAL_UART_RxCpltCallback(),并禁止接收中断。
(3)HAL_UART_RxCpltCallback()
此函数是一个回调函数,需要用户编写,在此函数中,可以将收到的数据进行转移,如果需要继续接收的话,还要再次调用HAL_UART_Receive_IT(),由于这个回调函数有可能会被多个串口中断服务程序调用,因此在函数中需要区分串口。
此篇文章的测试程序中,在此函数中启动定时器,用于1750us的定时。代码如图2-2所示。
图2-2
(4)HAL_TIM_PeriodElapsedCallback()
此函数是一个回调函数,当定时器产生溢出中断时调用,需要用户编写,此测试程序中,定时1750us的时间到,说明一个完整数据帧已接收完成,调用HAL_UART_Transmit_IT()函数,将收到的数据,原封不动地发送回去。
图2-3
(5)HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
认为,此函数也是一个配置函数,将发送数据指针和数量赋给相应的寄存器,然后使能发送缓存区为空中断,以便通过中断的方式将数据逐个字节的发送出去。
(6)HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart)
此函数在uart的中断服务程序中调用,将数据发到uart硬件缓存区,并监视已发送数量,发送数量达到目标值后,禁止发送缓存区为空中断。
2.3
函数调用顺序
函数调用顺序如图2-4所示。此图只是大体上展示了各个函数的调用顺序和调用关系,并不完全准确,由于中断的存在,有的进程是并行进行的。
图2-4
2.4
测试结果
准备两帧数据:01 03 00 00 00 0A C5 CD;
01 10 00 00 00 05 0A 00 01 00 02 00 03 00 04 00 05 EA 6A;
各发送两帧,查看目标板的回复数据,如图2-5所示。自此,uart的收发流程就演示完毕,这也类似于Modbus串口通信的一个基本框架。
图2-5
举报
更多回帖
rotate(-90deg);
回复
相关问答
stm32cubemx
串口
程序
如何对基于
stm32cubeMX
的
串口
进行
设置
呢
2021-11-25
695
STM32CubeMX
串口
中断偶校验,
串口
接
收发
生了Over-Run错误怎么解决?
2022-02-18
1635
如何用
STM32CUBEMX
去配置USART
串口
进行
数据的
收发
呢
2021-12-14
1448
怎样使用
STM32CubeMX
串口
输出调试信息
呢
2021-12-08
916
如何对
STM32cubeMX
的HAL库
串口
进行
配置
呢
2021-12-08
1440
STM32CubeMX
串口
怎么使用?
2021-12-06
1032
如何对基于
STM32CubeMX
的UART
进行
配置
呢
2021-11-26
1525
如何去实现USB模拟
串口
收发
的功能
呢
2021-12-06
1970
如何使用
STM32CubeMX
去配置一个
串口
呢
2021-12-02
855
分享一个不错的
STM32F103C8T6-CubeMx
串口
收发
程序
详细设计与
测试
2021-12-13
689
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分