刷写数据通过RS485在上位机和MCU之间进行通信。
- 为了兼容APP的download请求帧,上位机的握手帧和刷写帧,本设计提供了三种类型通信帧DOWNLOAD_REQUEST_FRAME,HANDSHAKE_FRAME和PROGRAM_FRAME,由系统状态机根据相应状态进行切换。切换函数分别为Uart_Download_Request_Init(),Uart_Handshake_Init()和Uart_Program_Init();
- 底层的数据传输通过DMA来实现;
- 底层数据池采用乒乓buffer来实现,从而解决消费者和生产者在读写共享区域的问题;
帧类型
- 刷写请求
刷写请求帧 上位机 -> MCU
13bytes AA01BEEF000000000000000000
请求回复帧 MCU -> 上位机
app 13bytes AA01BEEF010000000000000000
boot 8bytes AA01BEEF01000000 - 握手
握手请求帧 上位机 -> MCU
8bytes 1357135713571357
握手回复帧 MCU -> 上位机
8bytes 2468246824682468 - 刷写包长度
刷写包长度帧 上位机 -> MCU
8bytes AABBCCDDXXXXXXXX
回复帧 MCU -> 上位机
8bytes 1234567887654321 - 刷写数据
刷写数据帧 上位机 -> MCU
256bytes
回复帧 MCU -> 上位机
8bytes 1234567887654321
通信主要函数分析
- 模式初始化函数 Uart_XXX_Init
通过初始化函数将通信模式初始化为DOWNLOAD_REQUEST_FRAME,HANDSHAKE_FRAME和PROGRAM_FRAME。
- 中断回调函数 HAL_UART_RxCpltCallback
当DMA完成数据接收时,会触发硬件中断,调用该回调函数。该函数根据当前通信所处的帧类型,切换乒乓buffer的存储区,并更新相应的状态。
- 获取乒乓缓存中当前ready的缓冲区
遍历乒乓缓存的两个缓冲区,返回ready的缓冲区