diff --git a/Core/Src/main.c b/Core/Src/main.c index d53b6fd..1d75643 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -132,6 +132,10 @@ int main(void) init_cmd(); flashConfig = Flash_ReadConfig(); _dbg_printf("Current CAN ID: 0x%02X\r\n", flashConfig->can_id); + _dbg_printf("Current Direction: 0x%02X\r\n", flashConfig->sensorDir); + _dbg_printf("Current Debug Level: 0x%02X\r\n", flashConfig->debugFlag); + g_direction = flashConfig->sensorDir; + g_debugLevel = flashConfig->debugFlag; status = -1; /* USER CODE END 2 */ @@ -161,7 +165,7 @@ int main(void) HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_SET); prev_tick_ms = HAL_GetTick(); angle = AS5600_GetAngle(); - HAL_Delay(5); // 10ms采样周期 + HAL_Delay(10); // 10ms采样周期 uint32_t now_ms = HAL_GetTick(); uint32_t dt_ms = now_ms - prev_tick_ms; if (dt_ms > 0U) @@ -203,7 +207,6 @@ int main(void) transmitResult = can_node_transmit(flashConfig->can_id, canData); if (transmitResult != 0) { - status = -1; // 发送失败,回到初始化状态 status = 2; // 直接进入错误状态,持续闪烁蓝灯 } else diff --git a/MDK-ARM/arm_joint_sensor.uvguix.66437 b/MDK-ARM/arm_joint_sensor.uvguix.66437 index 9f665d0..3d61425 100644 --- a/MDK-ARM/arm_joint_sensor.uvguix.66437 +++ b/MDK-ARM/arm_joint_sensor.uvguix.66437 @@ -15,17 +15,17 @@ 38003 Registers - 150 100 + 150 80 346 Code Coverage - 1010 656 + 1010 160 204 Performance Analyzer - 1170 175 175 496 + 1170 @@ -1822,7 +1822,7 @@ Build 992 - 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000002001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0000000000000000010000000000000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050000000001061726D5F6A6F696E745F73656E736F72960000000000000001001061726D5F6A6F696E745F73656E736F72000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 + 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000002001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050000000001061726D5F6A6F696E745F73656E736F72960000000000000001001061726D5F6A6F696E745F73656E736F72000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000 583 @@ -3687,9 +3687,9 @@ ../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_can.c - 43 - 1381 - 1418 + 52 + 1405 + 1426 1 0 diff --git a/devices/can_node.c b/devices/can_node.c index 33d3bc0..e8fb55a 100644 --- a/devices/can_node.c +++ b/devices/can_node.c @@ -64,11 +64,12 @@ int can_node_transmit(uint32_t canID, uint8_t *TxData) canTransmitErrorCount ++; if(canTransmitErrorCount > 1000) { - _dbg_printf("CAN transmit timeout\r\n"); + // _dbg_printf("CAN transmit timeout\r\n"); canTransmitErrorCount = 0; return -1; } }; + canTransmitErrorCount = 0; HAL_CAN_AddTxMessage(&hcan1, &txHeader, TxData, &txMailbox); return 0; } diff --git a/devices/cmd.c b/devices/cmd.c index 605b2c4..61d5b05 100644 --- a/devices/cmd.c +++ b/devices/cmd.c @@ -33,7 +33,6 @@ void UART_CommandHandler(char *data, uint16_t len) { _dbg_printf("Current ID: 0x%02X, New ID: 0x%02X\n", currentConfig->can_id, id); currentConfig->can_id = id; - currentConfig->crc = id ^ 0xFF; // 简单校验 Flash_WriteConfig(currentConfig); } else @@ -50,6 +49,16 @@ void UART_CommandHandler(char *data, uint16_t len) { g_debugLevel = debug; _dbg_printf("Set debug level: 0x%02X\n", g_debugLevel); + currentConfig = Flash_ReadConfig(); + if(currentConfig->debugFlag != g_debugLevel) + { + currentConfig->debugFlag = g_debugLevel; + Flash_WriteConfig(currentConfig); + } + else + { + _dbg_printf("Debug level unchanged: 0x%02X\n", g_debugLevel); + } } } else if(strncmp(data, "SETDIR", 6) == 0) @@ -59,6 +68,16 @@ void UART_CommandHandler(char *data, uint16_t len) { g_direction = dir; _dbg_printf("Set direction: 0x%02X\n", g_direction); + currentConfig = Flash_ReadConfig(); + if(currentConfig->sensorDir != g_direction) + { + currentConfig->sensorDir = g_direction; + Flash_WriteConfig(currentConfig); + } + else + { + _dbg_printf("Direction unchanged: 0x%02X\n", g_direction); + } } } else diff --git a/devices/flash.c b/devices/flash.c index 4b667cb..c4f53c8 100644 --- a/devices/flash.c +++ b/devices/flash.c @@ -1,24 +1,78 @@ #include "flash.h" #include "main.h" #include -#include -#include #define FLASH_BASE_ADDR 0x08000000UL // #define FLASH_PAGE_SIZE 0x800 // 2KB #define FLASH_PAGE_NUM 128 #define FLASH_USER_PAGE (FLASH_PAGE_NUM - 1) #define FLASH_USER_ADDR (FLASH_BASE_ADDR + FLASH_USER_PAGE * FLASH_PAGE_SIZE) +#define FLASH_EMPTY_DWORD 0xFFFFFFFFFFFFFFFFULL + +static uint16_t Flash_CalcCrc(const FlashConfig_t *cfg) +{ + uint16_t crc = 0xA55A; + crc ^= cfg->can_id; + crc ^= ((uint16_t)cfg->sensorDir << 8) | cfg->debugFlag; + return crc; +} + +static void Flash_LoadDefaultConfig(FlashConfig_t *cfg) +{ + cfg->can_id = 0x01; + cfg->sensorDir = 0; + cfg->debugFlag = 0; + cfg->crc = Flash_CalcCrc(cfg); +} + +static uint64_t Flash_PackConfig(const FlashConfig_t *cfg) +{ + uint64_t data = 0; + + data |= (uint64_t)(cfg->can_id & 0xFFFFU); + data |= ((uint64_t)cfg->sensorDir << 16); + data |= ((uint64_t)cfg->debugFlag << 24); + data |= ((uint64_t)cfg->crc << 32); + + return data; +} + +static void Flash_UnpackConfig(uint64_t data, FlashConfig_t *cfg) +{ + cfg->can_id = (uint16_t)(data & 0xFFFFU); + cfg->sensorDir = (uint8_t)((data >> 16) & 0xFFU); + cfg->debugFlag = (uint8_t)((data >> 24) & 0xFFU); + cfg->crc = (uint16_t)((data >> 32) & 0xFFFFU); +} FlashConfig_t currentCfg; FlashConfig_t *Flash_ReadConfig(void) { - memcpy(¤tCfg, (void *)FLASH_USER_ADDR, sizeof(currentCfg)); + uint64_t rawData = *(volatile uint64_t *)FLASH_USER_ADDR; + + if (rawData == FLASH_EMPTY_DWORD) + { + Flash_LoadDefaultConfig(¤tCfg); + return ¤tCfg; + } + + Flash_UnpackConfig(rawData, ¤tCfg); + + if ((currentCfg.can_id > 0x7FFU) || (currentCfg.crc != Flash_CalcCrc(¤tCfg))) + { + Flash_LoadDefaultConfig(¤tCfg); + } + return ¤tCfg; } void Flash_WriteConfig(FlashConfig_t *cfg) { + uint64_t data; + + cfg->crc = Flash_CalcCrc(cfg); + data = Flash_PackConfig(cfg); + HAL_FLASH_Unlock(); FLASH_EraseInitTypeDef erase; @@ -31,8 +85,6 @@ void Flash_WriteConfig(FlashConfig_t *cfg) HAL_FLASHEx_Erase(&erase, &page_error); uint32_t addr = FLASH_USER_ADDR; - uint64_t data = ((uint64_t)cfg->crc << 16) | cfg->can_id; - HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, addr, data); HAL_FLASH_Lock(); diff --git a/devices/flash.h b/devices/flash.h index a73b930..79fa37d 100644 --- a/devices/flash.h +++ b/devices/flash.h @@ -5,6 +5,8 @@ typedef struct { uint16_t can_id; + uint8_t sensorDir; // 0: 正常,1: 反转 + uint8_t debugFlag; // 0: 无调试信息,1: 输出调试信息 uint16_t crc; // 可选,简单校验 } FlashConfig_t;