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;