前言
STM32 HAL库中用定时器加中断的方式进行数据的进行任意字节接收和发送
一 CUBMX初始化配置
定时器的作用只是产生一个1ms的时基,可以是基本定时器,下面以STM32ZET6进行参考
通过图中的配置即可产生1MS的时基
![在这**
开启定时器的中断
然后是串口配置,默认就行
也要开启串口的中断
中断优先级配置不同就行
二、添加代码
1.在主函数中开启定时器和串口的接收中断
代码如下
(示例): 这里是来一个数据就产生一次中断,但在有操作系统的工程中这样的方法就不是很好,不能
一直不停的中断
HAL_UART_Receive_IT(&huart1,&Rx_buff,1);
HAL_TIM_Base_Start_IT(&htim6);
2.编写回调函数
首先定义变量
:
然后写定时器和串口的回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==&htim6)//或者htim->Instance ==TIM2
{
if(RX_Flag==1)
{
timenum++;
if(timenum>=10)
{
i=0;//清除计数,使指针指向开头
RX_Flag =0;//关闭定时器
HAL_UART_Transmit(&huart1,Rx_String,sizeof(Rx_String),100);
printf("接收完毕\r\n");
memset( Rx_String,0,sizeof(Rx_String));//清除定时器
}
}
}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart==&huart1)
{
Rx_String[i++]=Rx_buff;
timenum =0;
if(i==1)
{
RX_Flag =1;
}
HAL_UART_Receive_IT(&huart1,&Rx_buff,1);
}
}
**当有数据来的时候定时器就重新从0开始计时到9,期间有数据来就会从新计数
当计数超过10ms,定时器关闭,i指向数组的头部并打印后清除数据**
---
# 总结
STM32串口发送接收数据也就是us或者几ms的,所以通过10ms判断戳戳有余
通过定时器结合串口中断可以实现任意字节大小的接收数据,不用判断是否有结束符