【STM32G0】借助串口非空中断实现空闲中断的功能

1 实现原理

使用串口通信可实现数据帧的收发,完成机器人控制、采集数据的传输等任务。制定串口通信协议并定时发送一帧数据,常见的处理方法是利用空闲中断,但STM32 HAL库好像没有专用的空闲中断,自己实现起来比较麻烦,这里利用非空中断可以实现同样的功能,缺点是效率比较低,稳定性经过测试也还可以,如果有更好的思路欢迎提出。

1.1 制定串口通信协议

制定串口通信协议时一帧数据的长度和内容可以自己定义,STM32的串口传输的数据类型为uint8_t,注意取值不要超过0-255,下面给出一个电机控制的串口通信协议表做示例

字节 定义
0 帧头 0x5A
1 帧长度 10
2 电机1转向 0/1
3 电机1转速 0-255
4 电机2转向 0/1
5 电机2转速 0-255
6 电机3转向 0/1
7 电机3转速 0-255
8 运行时间 0-60
9 帧尾 0xA5

1.2 分析中间变量

  • 创建接收数组g_fUART1_Buf,其长度等于串口通信协议一帧的长度
  • 创建接收一个字节的暂存变量g_fUART1_Byte,配置一个字节中断一次
  • 创建g_fNew_Pack用于主程序中判断是否接收到完整的一帧数据
  • 创建g_fNew_Pack_Cnt记录成功接收一帧数据的次数,方便调试
uint8_t g_fUART1_Byte = 0;
uint8_t g_fUART1_Buf[10] = {
   
   0};

uint8_t g_fNew_Pack = 0;
uint8_t g_fNew_Pack_Cnt = 0;

1.3 接收数据的处理

新接收到的字节g_fUART1_Byte写入接收数组g_fUART1_Buf的末尾,每接收一个字节,就将前一个字节左移,保证新接收到的字节一直往数组里填充,当接收的字节超过接收数组的长度后,继续左移,去掉旧数据,填入新数据

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值