From d120fa0d179c3571b07ed0ffb4840ed31c3d7f28 Mon Sep 17 00:00:00 2001 From: SkyLi Date: Sun, 7 Jun 2026 11:42:15 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E9=80=9A=E4=B8=B2=E5=8F=A3=E4=B8=8E?= =?UTF-8?q?=E4=B8=8A=E4=BD=8D=E6=9C=BA=E5=8F=8C=E5=90=91=E9=80=9A=E4=BF=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - UART2 TX: 硬件FIFO+DMA+块传输模式,非阻塞发送 - UART2 RX: 硬件FIFO+中断+软件FIFO,状态机解析协议帧 - 协议: [SOF:0xA7][cmd:1][checksum:1],支持自动/手动/调试模式切换 - 更新.gitignore忽略*.log文件 --- .gitignore | 19 ++-- project/code/Command.c | 202 +++++++++++++++++++++++++++------------- project/code/Command.h | 26 +++--- project/user/src/main.c | 4 +- 4 files changed, 165 insertions(+), 86 deletions(-) diff --git a/.gitignore b/.gitignore index d05a3da..3b8be9c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,11 @@ -/libraries/sdk/ti_config/excluded - -/project/keil/Listings/ -/project/keil/Objects/ - -uv4.log -uv4.log.lock -keil-assistant.log - +/libraries/sdk/ti_config/excluded + +/project/keil/Listings/ +/project/keil/Objects/ + +uv4.log +uv4.log.lock +keil-assistant.log +*.log + CLAUDE.md \ No newline at end of file diff --git a/project/code/Command.c b/project/code/Command.c index 5c11324..095b768 100644 --- a/project/code/Command.c +++ b/project/code/Command.c @@ -1,66 +1,138 @@ -#include "Command.h" -#include "zf_driver_uart.h" -#include "zf_common_interrupt.h" -#include "ti/driverlib/dl_uart_main.h" -#include "zf_common_fifo.h" - -volatile fifo_struct command_fifo = {0}; -volatile uint8_t command_fifo_buffer[COMMAND_FIFO_BUFFER_SIZE] = {0}; -uint8_t command_sum(uint8_t* data,int len); - -void command_callback(uint32 state, void *ptr) -{ - while(false == DL_UART_isRXFIFOEmpty(UART2))//读取到一个数据 - { - fifo_write_element((fifo_struct*)&command_fifo,DL_UART_Main_receiveData(UART2));//写入软件FIFO - } -} -void command_init() -{ - uart_init(UART_2,115200,UART2_TX_B15,UART2_RX_B16); - uart_set_interrupt_config(UART_2,UART_INTERRUPT_CONFIG_RX_ENABLE); - interrupt_set_priority(UART2_INT_IRQn,1);//设置为与主要任务平行的优先级 - - //开启发送DMA - - //开启硬件FIFO - DL_UART_Main_enableFIFOs(UART2); - DL_UART_Main_setRXFIFOThreshold(UART2,DL_UART_MAIN_RX_FIFO_LEVEL_1_2_FULL); - - //设置软件FIFO - fifo_init((fifo_struct *)&command_fifo,FIFO_DATA_8BIT,(void*)command_fifo_buffer,COMMAND_FIFO_BUFFER_SIZE); - //设置中断回调 - uart_set_callback(UART_2,command_callback,NULL); -} -//从软件FIFO中解析数据包并执行 -void command_task() -{ - -} -//DMA发送使用的地址 -uint8_t angle_velocity_data[6] = {0}; -//发送速度前馈 -void command_send_angle_velocity(float* pointer_angle_velocity) -{ - //等待上一次DMA发送完成 - - //填充数据 - uint8_t* p = (uint8_t*)pointer_angle_velocity; - angle_velocity_data[0]=0xA1; - angle_velocity_data[1]=*(p++); - angle_velocity_data[2]=*(p++); - angle_velocity_data[3]=*(p++); - angle_velocity_data[4]=*(p++); - angle_velocity_data[5]=command_sum(angle_velocity_data,5); - //DMA发送(非阻塞) - -} -uint8_t command_sum(uint8_t* data,int len) -{ - uint8_t sum = 0; - for(int i=0;i 0) + { + switch(state) + { + case 0: // 等待SOF 0xA7 + fifo_read_element((fifo_struct*)&command_fifo, &byte, FIFO_READ_AND_CLEAN); + if(byte == 0xA7) state = 1; + break; + case 1: // 读取cmd + fifo_read_element((fifo_struct*)&command_fifo, &cmd, FIFO_READ_AND_CLEAN); + state = 2; + break; + case 2: // 校验checksum = SOF + cmd + fifo_read_element((fifo_struct*)&command_fifo, &byte, FIFO_READ_AND_CLEAN); + if(byte == (uint8_t)(0xA7 + cmd)) + { + switch(cmd) + { + case 0x01: SwitchToAutoMode(); break; + case 0x02: SwitchToManualMode(); break; + case 0x03: SwitchToDebugMode(); break; + } + } + state = 0; + break; + } + } +} + +//切换到自动模式 +void SwitchToAutoMode() +{ + beep_on_time(100); +} + +//切换到手动模式 +void SwitchToManualMode() +{ + beep_on_time(200); +} + +//切换到调试模式 +void SwitchToDebugMode() +{ + beep_on_time(300); +} +//DMA发送使用的地址 +uint8_t angle_velocity_data[6] = {0}; +//发送速度前馈 +void command_send_angle_velocity(float* pointer_angle_velocity) +{ + //等待上一次DMA发送完成 + while(DL_DMA_isChannelEnabled(DMA, 0)); + //等待UART物理发送完成 + while(!DL_UART_isTXFIFOEmpty(UART2)); + + //填充数据 + uint8_t* p = (uint8_t*)pointer_angle_velocity; + angle_velocity_data[0]=0xA9; + angle_velocity_data[1]=*(p++); + angle_velocity_data[2]=*(p++); + angle_velocity_data[3]=*(p++); + angle_velocity_data[4]=*(p++); + angle_velocity_data[5]=command_sum(angle_velocity_data,5); + //DMA发送(非阻塞) + DL_DMA_setSrcAddr(DMA, 0, (uint32_t)angle_velocity_data); + DL_DMA_setDestAddr(DMA, 0, (uint32_t)&UART2->TXDATA); + DL_DMA_setTransferSize(DMA, 0, 6); + DL_DMA_enableChannel(DMA, 0); + // UART TX FIFO为空,DMA触发条件已满足,使能通道即自动开始传输 + +} +uint8_t command_sum(uint8_t* data,int len) +{ + uint8_t sum = 0; + for(int i=0;i