增加debug标志位和传感器方向标志位存入flash

This commit is contained in:
shen 2026-04-03 16:57:59 +08:00
parent fda58988ed
commit 3f1a2ee5c4
6 changed files with 93 additions and 16 deletions

View File

@ -132,6 +132,10 @@ int main(void)
init_cmd(); init_cmd();
flashConfig = Flash_ReadConfig(); flashConfig = Flash_ReadConfig();
_dbg_printf("Current CAN ID: 0x%02X\r\n", flashConfig->can_id); _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; status = -1;
/* USER CODE END 2 */ /* USER CODE END 2 */
@ -161,7 +165,7 @@ int main(void)
HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_SET);
prev_tick_ms = HAL_GetTick(); prev_tick_ms = HAL_GetTick();
angle = AS5600_GetAngle(); angle = AS5600_GetAngle();
HAL_Delay(5); // 10ms采样周期 HAL_Delay(10); // 10ms采样周期
uint32_t now_ms = HAL_GetTick(); uint32_t now_ms = HAL_GetTick();
uint32_t dt_ms = now_ms - prev_tick_ms; uint32_t dt_ms = now_ms - prev_tick_ms;
if (dt_ms > 0U) if (dt_ms > 0U)
@ -203,7 +207,6 @@ int main(void)
transmitResult = can_node_transmit(flashConfig->can_id, canData); transmitResult = can_node_transmit(flashConfig->can_id, canData);
if (transmitResult != 0) if (transmitResult != 0)
{ {
status = -1; // 发送失败,回到初始化状态
status = 2; // 直接进入错误状态,持续闪烁蓝灯 status = 2; // 直接进入错误状态,持续闪烁蓝灯
} }
else else

View File

@ -15,17 +15,17 @@
<View> <View>
<WinId>38003</WinId> <WinId>38003</WinId>
<ViewName>Registers</ViewName> <ViewName>Registers</ViewName>
<TableColWidths>150 100</TableColWidths> <TableColWidths>150 80</TableColWidths>
</View> </View>
<View> <View>
<WinId>346</WinId> <WinId>346</WinId>
<ViewName>Code Coverage</ViewName> <ViewName>Code Coverage</ViewName>
<TableColWidths>1010 656</TableColWidths> <TableColWidths>1010 160</TableColWidths>
</View> </View>
<View> <View>
<WinId>204</WinId> <WinId>204</WinId>
<ViewName>Performance Analyzer</ViewName> <ViewName>Performance Analyzer</ViewName>
<TableColWidths>1170 175 175 496</TableColWidths> <TableColWidths>1170</TableColWidths>
</View> </View>
</SECTreeCtrl> </SECTreeCtrl>
@ -1822,7 +1822,7 @@
<Name>Build</Name> <Name>Build</Name>
<Buttons> <Buttons>
<Len>992</Len> <Len>992</Len>
<Data>00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000002001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0000000000000000010000000000000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050000000001061726D5F6A6F696E745F73656E736F72960000000000000001001061726D5F6A6F696E745F73656E736F72000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000</Data> <Data>00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000002001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050000000001061726D5F6A6F696E745F73656E736F72960000000000000001001061726D5F6A6F696E745F73656E736F72000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000</Data>
</Buttons> </Buttons>
<OriginalItems> <OriginalItems>
<Len>583</Len> <Len>583</Len>
@ -3687,9 +3687,9 @@
</Doc> </Doc>
<Doc> <Doc>
<Name>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_can.c</Name> <Name>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_can.c</Name>
<ColumnNumber>43</ColumnNumber> <ColumnNumber>52</ColumnNumber>
<TopLine>1381</TopLine> <TopLine>1405</TopLine>
<CurrentLine>1418</CurrentLine> <CurrentLine>1426</CurrentLine>
<Folding>1</Folding> <Folding>1</Folding>
<ContractedFolders></ContractedFolders> <ContractedFolders></ContractedFolders>
<PaneID>0</PaneID> <PaneID>0</PaneID>

View File

@ -64,11 +64,12 @@ int can_node_transmit(uint32_t canID, uint8_t *TxData)
canTransmitErrorCount ++; canTransmitErrorCount ++;
if(canTransmitErrorCount > 1000) if(canTransmitErrorCount > 1000)
{ {
_dbg_printf("CAN transmit timeout\r\n"); // _dbg_printf("CAN transmit timeout\r\n");
canTransmitErrorCount = 0; canTransmitErrorCount = 0;
return -1; return -1;
} }
}; };
canTransmitErrorCount = 0;
HAL_CAN_AddTxMessage(&hcan1, &txHeader, TxData, &txMailbox); HAL_CAN_AddTxMessage(&hcan1, &txHeader, TxData, &txMailbox);
return 0; return 0;
} }

View File

@ -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); _dbg_printf("Current ID: 0x%02X, New ID: 0x%02X\n", currentConfig->can_id, id);
currentConfig->can_id = id; currentConfig->can_id = id;
currentConfig->crc = id ^ 0xFF; // 简单校验
Flash_WriteConfig(currentConfig); Flash_WriteConfig(currentConfig);
} }
else else
@ -50,6 +49,16 @@ void UART_CommandHandler(char *data, uint16_t len)
{ {
g_debugLevel = debug; g_debugLevel = debug;
_dbg_printf("Set debug level: 0x%02X\n", g_debugLevel); _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) else if(strncmp(data, "SETDIR", 6) == 0)
@ -59,6 +68,16 @@ void UART_CommandHandler(char *data, uint16_t len)
{ {
g_direction = dir; g_direction = dir;
_dbg_printf("Set direction: 0x%02X\n", g_direction); _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 else

View File

@ -1,24 +1,78 @@
#include "flash.h" #include "flash.h"
#include "main.h" #include "main.h"
#include <stdint.h> #include <stdint.h>
#include <string.h>
#include <stdio.h>
#define FLASH_BASE_ADDR 0x08000000UL #define FLASH_BASE_ADDR 0x08000000UL
// #define FLASH_PAGE_SIZE 0x800 // 2KB // #define FLASH_PAGE_SIZE 0x800 // 2KB
#define FLASH_PAGE_NUM 128 #define FLASH_PAGE_NUM 128
#define FLASH_USER_PAGE (FLASH_PAGE_NUM - 1) #define FLASH_USER_PAGE (FLASH_PAGE_NUM - 1)
#define FLASH_USER_ADDR (FLASH_BASE_ADDR + FLASH_USER_PAGE * FLASH_PAGE_SIZE) #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 currentCfg;
FlashConfig_t *Flash_ReadConfig(void) FlashConfig_t *Flash_ReadConfig(void)
{ {
memcpy(&currentCfg, (void *)FLASH_USER_ADDR, sizeof(currentCfg)); uint64_t rawData = *(volatile uint64_t *)FLASH_USER_ADDR;
if (rawData == FLASH_EMPTY_DWORD)
{
Flash_LoadDefaultConfig(&currentCfg);
return &currentCfg;
}
Flash_UnpackConfig(rawData, &currentCfg);
if ((currentCfg.can_id > 0x7FFU) || (currentCfg.crc != Flash_CalcCrc(&currentCfg)))
{
Flash_LoadDefaultConfig(&currentCfg);
}
return &currentCfg; return &currentCfg;
} }
void Flash_WriteConfig(FlashConfig_t *cfg) void Flash_WriteConfig(FlashConfig_t *cfg)
{ {
uint64_t data;
cfg->crc = Flash_CalcCrc(cfg);
data = Flash_PackConfig(cfg);
HAL_FLASH_Unlock(); HAL_FLASH_Unlock();
FLASH_EraseInitTypeDef erase; FLASH_EraseInitTypeDef erase;
@ -31,8 +85,6 @@ void Flash_WriteConfig(FlashConfig_t *cfg)
HAL_FLASHEx_Erase(&erase, &page_error); HAL_FLASHEx_Erase(&erase, &page_error);
uint32_t addr = FLASH_USER_ADDR; 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_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, addr, data);
HAL_FLASH_Lock(); HAL_FLASH_Lock();

View File

@ -5,6 +5,8 @@
typedef struct typedef struct
{ {
uint16_t can_id; uint16_t can_id;
uint8_t sensorDir; // 0: 正常1: 反转
uint8_t debugFlag; // 0: 无调试信息1: 输出调试信息
uint16_t crc; // 可选,简单校验 uint16_t crc; // 可选,简单校验
} FlashConfig_t; } FlashConfig_t;