【无标题】


前言

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判断戳戳有余
通过定时器结合串口中断可以实现任意字节大小的接收数据,不用判断是否有结束符
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值