【485 IO板 源码调试】
事件:
原本的io板是在之前的同时的基础上进行开发的。由于本人在此之前还是单片机小白,所以该篇博客先对原本基于开发的代码进行分析。包括基于GD32F1X0的环境配置,一些概念梳理,原代码书写逻辑等
代码结构
整个项目project分为3个部分,主要的部分是app, bootloader。
bootloader是为了后面进行ota升级开发用的。
整个代码运行时先运行bootloader部分,如果没有接收到上位机升级的命令,则跳转到app的地方开始运行代码
io板的通信基于串口485 + transportcrc协议来实现的
单片机的代码先进行初始化,时钟初始化,gpio引脚初始化,TC5020led驱动芯片引脚初始化,RS485串口初始化,(业务逻辑初始化)
时钟初始化
这里主要是时钟的初始化,可以理解为滴答时钟,即靠节拍数来计时。
SysTick_Config()来配置多少下节拍进入中断函数
us_cnts 表示 多少下节拍是1us。
TC5020初始化
之前的开发人员和TC5020通信是用的SPI进行通信的,因为原理图中和TC5020相连的是SDI CLK,可以使用SPI通信。
RS485 初始化
这里对RS485串口进行初始化,结合原理图,可以看到主要配置 RX TX 还有一些发送接收寄存器。和DE引脚
主逻辑
主要流程是通过RS485_recv_task()来接收transportcrc数据包。
以下是485的串口接收中断函数,每当有数据过来,就会先检查USART寄存器的RBNE标志位。
如果可以接收,就将一个字节的数据加入缓冲区。
所有数据都放在ringbuffer里面
主流程里面把每个字节往transportcrc的状态机里面送
并把解析出来的数据帧存储来
io_info_update_task()是用来把帧里面的指令数据解析到具体的每个io配置操作io_action里面.
然后每过固定几个tick,就向TC5020led驱动芯片的锁存器里面写入当前的操作。
一些概念
- 单片机里面中断,可以简单理解为是线程,这样可以防止自己的主程序被阻塞。
- 学会看芯片的使用手册,和引脚定义。