stm32f103串口发送接收学习笔记1(学习参考:正点原子的代码)

最近打算利用stm32f103做串口发送或者接收数据。
1、接收数据主要是接收外部单片机的命令,比如外部单片机发送一个停止命令,那么电机停止,发送开始命令,电机开启,发送清0的命令,相应的变量清零。
2、发送的数据,主要是stm32的正交编码功能进行电机的测速和脉冲测量,然后通过发送数据的形式发送给没有这个功能的单片机。比如51单片机。
接收和发送都需要制定一定的指令格式,并包括简单的校验和,进行数据的校核校验。
接收的格式目前自定义为
三个指令,
0x7c+0x11+校验和,作用为A
0x7c+0x22+校验和,作用为B
0x7c+0x33+校验和,作用为C。
其他后续如果有其他的命令,可以进行扩充。
这个是自定义格式,后续研究下数据格式的指定,保证更加可靠。
目前主要是用了三个手段来保证数据的接收校验。第一个手段,加帧头0x7c,第二个手段用一个字节0x11作为命令A的具体命令,00010001,两个1间隔较远,假如有错发或者漏发的话,不会影响误判,校验和主要是0x7c+0x11的十进制和,除以256,取模作为校验和,比如0x7c+0x11=0x8d=141,校验和为141,0x7c+0x22=0x9E=158,校验和为158,0x7c+0x33=0xAF=175。
当三者都检测到正确的时候,接收数据成功,进行相关功能控制。
由于stm32的串口接收功能,主要是控制内部的测速测距的。因此要起到控制的作用,必须优先级为最高。
当然也可以用外部中断进行外部触发,然后起到这个作用,比如用单片机的某个口电平变化,触发外部中断引脚,起到上面的三个指令ABC功能。但是这个会增加外部单片机的负担。因此还是用32的串口接受命令吧。这样外部的单片机,就仅仅需要一个串口,就能起到和这个stm32进行通信了。

在这里插入图片描述
上面是正点原子的库函数开发手册的串口实验的相关介绍。感谢正点原子的教程,写得不错,深入浅出。
现在是需要利用串口做接收数据的中断,那么需用利用图中的函数。
回到中断优先等级的设置问题。如何设置串口的接收中断优先级是最高呢?规划一下自己的代码的使用到中断的其他内外需求。做个优先级规划排序。
主要用到
1、串口的接收中断起到控制内部目的;
2、定时器1:定时10ms进入一次定时程序,每隔20ms时间测量脉冲数,计算相对脉冲量,运动方向,电机转速;到0.2s=200ms的时候,停止定时器3和定时器4测速,通过滤波和其他手段计算脉冲量和速度,转速等,另外计算结果乘以100倍之后,拆为高字节和低字节,再发送,避免不同单片机编译系统关于浮点数的大端和小端知识,通过串口发送计算结果,再开启TIM3和TIM4。外部单片机接收到数据的时候,再合并数据,然后除以100,做浮点数的强制类型转换,得到实际的数值。
3、定时器3:用到正交编码功能,对电机1测脉冲;中断时候,溢出次数+1,
4、定时器4、用到正交编码功能,对电机2测脉冲;中断的时候,溢出次数+1.
目前主要用到上面四个中断。
中断优先级顺序:
串口中断>定时器1>(定时器3=定时器4)
后面第二篇分析笔记续上。

猜你喜欢

转载自blog.csdn.net/lmf666/article/details/100035170