任务分析


串口数据流分配大概如上图所示,黑色的箭头即表示了串口数据流,这都还是好理解的,唯一有些难理解的就是蓝色箭头了。
蓝色箭头指的是舵机驱动板和丝杆驱动板借由STM32F103芯片实现间接的互相通信
STM32F103在其中扮演着相当重要的命令,由其解析树莓派下发的命令,并且将任务准确分配到舵机驱动板和丝杆驱动板,并且其还解析丝杆驱动板和舵机驱动板上发的命令,保证2块驱动板之间也能实现通信。这样才能最终保证整个串口数据流的稳定。

STM32CubeMX配置工程

首先在STM32CubeMX里面选择我们的芯片(STM32F103C8Tx

首先我们来配置SYSSerial Wire,并把基准时钟配置为SysTick

接下来配置RCC

完成了芯片基本配置之后就开始配置串口了,因为舵机驱动板和丝杆驱动板的串口波特率都是9600,因此USART2和USART3的波特率都配置成了9600,那么为了保证一致,我也就将STM32F103与树莓派通信的波特率也配置成了9600,具体配置如下



完成了串口配置之后可以看到芯片的引脚使用图如下所示

那么至此我们以及完成了芯片的配置,接下来就要生成工程了,我用的开发环境是Keil5,因此我选择的IDE是MDK-ARM V5

还有下图2个选项默认是不会勾选的,但是为了减小生成的Keil5工程文件的大小,我建议都勾选上,第一个是只包含必要的库,第二个是将外设文件都按照.c.h进行分类

完成工程配置之后,点下图这个文件就可以生成工程

然后就可以编译生成的工程文件了,如果出现了下图错误,请参照我的另外一篇博客:
STM32CubeMX配置STM32F103C8T6芯片调试串口光电传感器

逻辑撰写

首先我们将各个串口重命名一下,减少程序的耦合性

#define PI_SERIAL huart1
#define SCREW_SERIAL huart2
#define SERVO_SERIAL huart3

接下来就是在程序的主循环里进行的操作了

char pi_serial[7] = {'\0'};
char servo_serial[4] = {'\0'};
char screw_serial[3] = {'\0'};
while (1)
{
    if(!HAL_UART_Receive(&PI_SERIAL,(uint8_t *)pi_serial,6,0XFFFF)){//接收到树莓派的消息
        //解析树莓派的命令

    }
}

程序大概框架如上所示,主要思路就是在接收到树莓派和驱动板的命令之后进行解析,并且进行分发,因为命令收发以及管理较为复杂,我将在另外一篇博客中进行分享


(づ ̄3 ̄)づ╭❤~一键三连,这次一定(๑•̀ㅂ•́)و✧