#include // 1 / 115200 * 640 *1000 ≈ 5.6 ms uint8_t xdata DebugDat[64] = {0}; /** @function UART1_Init @brief 调试串口配置 @date 2025-11-05 */ void UART1_Init(void) { // 使能端口 P05 P06 复用为串口 SetBit(PH_SEL, UART1EN); // 模式1 全/半双工模式 UT_MOD1 = 0; UT_MOD0 = 1; // 多机通讯关闭 SM2 = 0; // 允许接收 REN = 1; // 关闭中断 ES0 = 0; // 优先级配置为最低 ClrBit(IP3, PI2C_UT11 | PI2C_UT10); // 波特率配置 // 参考波特率 115200 --> 0x0C 9600 --> 0x9B UT_BAUD = 0x0C; // DMA发送配置 Conf_DMA(0, XDATA_UART1, DebugDat, 64); ES0 = 1; } void UART2_Init(void) { SetBit(PH_SEL, UART2EN); /* UART模式 UT2_MOD1,UT2_MOD0为: 00 模式0,移位寄存器波特率为 系统时钟 /12 01 模式1,8-bit UART 波特率为 fcpu_clk / ( (16 / (1+ UT2_BAUD[BAUD2_SEL]) ) / (UT2_BAUD+1) ) 10 模式2,9-bit UART 波特率为 fcpu_clk / ( 32 – 16* UT2_BAUD[BAUD2_SEL]) 11 模式3,9-bit UART 波特率为 fcpu_clk / ( (16 / (1+ UT2_BAUD[BAUD2_SEL])) / (UT2_BAUD+1) ) */ UT2MOD1 = 0; // 9位模式 01 UT2MOD0 = 1; /* Does not allow multi-thread cpu operation */ /* UT2_SM2 为 0 - 单机通讯为 1 - 多机通讯 */ UT2SM2 = 0; /* UT2_REN 为 0 - 禁止接收为 1 - 使能接收 */ UT2REN = 1; UT2RI = 0; /* Uart2设置中断优先级 */ SetBit(IP3, PSPI_UT21); ClrBit(IP3, PSPI_UT20); // UART2CH1, UART2CH0 // 00:P3.6 为 RXD、P3.7 为 TXD(P3.6 为单线模式的输入输出) // 01:P4.7 为 RXD、P1.2 为 TXD(P1.2 为单线模式的输入输出) // 1X:P0.1 为 RXD、P0.0 为 TXD(P0.1 为单线模式的输入输出) ClrBit(PH_SEL1, UART2CH1); ClrBit(PH_SEL1, UART2CH0); // 设置波特率 根据 fcpu_clk / ( (16 / (1+ UT2_BAUD[BAUD2_SEL]) ) / (UT2_BAUD+1) )计算 UT2_BAUD |= 1500000 / 9600 - 1; // SetBit(UT2_BAUD,BAUD2_SEL); SetBit(UT2_BAUD, UART2IEN); } /** @function Dabug_Data_Update @brief 调试信息上载 !高字节在前 @date 2025-11-05 */ void Dabug_Data_Update(void) { static uint8_t update_delay_cnt = 0; uint8_t sumcheck = 0, addcheck = 0; uint16_t i = 0, switchTemp = 0; if (++ update_delay_cnt > 9) { update_delay_cnt = 0; *(_IO uint16_t xdata *)(&DebugDat + 0) = 0xABFF; *(_IO uint16_t xdata *)(&DebugDat + 2) = 0xFFF1; *(_IO uint16_t xdata *)(&DebugDat + 4) = 0x3800; *(_IO uint16_t xdata *)(&DebugDat + 6) = (currOffset.IuOffset >> 8) | (currOffset.IuOffset << 8); *(_IO uint16_t xdata *)(&DebugDat + 8) = (currOffset.IvOffset >> 8) | (currOffset.IvOffset << 8); *(_IO uint16_t xdata *)(&DebugDat + 10) = (motorControl.DCBus >> 8) | (motorControl.DCBus << 8); switchTemp = (uint16_t)FOC__ID; *(_IO uint16_t xdata *)(&DebugDat + 12) = (switchTemp >> 8) | (switchTemp << 8); switchTemp = (uint16_t)FOC__IQ; *(_IO uint16_t xdata *)(&DebugDat + 14) = (switchTemp >> 8) | (switchTemp << 8); switchTemp = (uint16_t)FOC__IA; *(_IO uint16_t xdata *)(&DebugDat + 16) = (switchTemp >> 8) | (switchTemp << 8); switchTemp = (uint16_t)FOC__IB; *(_IO uint16_t xdata *)(&DebugDat + 18) = (switchTemp >> 8) | (switchTemp << 8); switchTemp = (uint16_t)FOC__IC; *(_IO uint16_t xdata *)(&DebugDat + 20) = (switchTemp >> 8) | (switchTemp << 8); switchTemp = (uint16_t)FOC_IDREF; *(_IO uint16_t xdata *)(&DebugDat + 22) = (switchTemp >> 8) | (switchTemp << 8); switchTemp = (uint16_t)FOC_IQREF; *(_IO uint16_t xdata *)(&DebugDat + 24) = (switchTemp >> 8) | (switchTemp << 8); switchTemp = (uint16_t)motorControl.ActualSpeed; *(_IO uint16_t xdata *)(&DebugDat + 26) = (switchTemp >> 8) | (switchTemp << 8); // 计算校验 for (i = 0; i < 62; i++) { sumcheck += DebugDat[i]; addcheck += sumcheck; } //将计算出来的校验数据写入数据帧 DebugDat[62] = sumcheck; DebugDat[63] = addcheck; Set_DMA_Data_Package(0, DebugDat, 0x40); Switch_DMA(0); } }