增加debug标志位和传感器方向标志位存入flash
This commit is contained in:
parent
fda58988ed
commit
3f1a2ee5c4
@ -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
|
||||
|
||||
@ -15,17 +15,17 @@
|
||||
<View>
|
||||
<WinId>38003</WinId>
|
||||
<ViewName>Registers</ViewName>
|
||||
<TableColWidths>150 100</TableColWidths>
|
||||
<TableColWidths>150 80</TableColWidths>
|
||||
</View>
|
||||
<View>
|
||||
<WinId>346</WinId>
|
||||
<ViewName>Code Coverage</ViewName>
|
||||
<TableColWidths>1010 656</TableColWidths>
|
||||
<TableColWidths>1010 160</TableColWidths>
|
||||
</View>
|
||||
<View>
|
||||
<WinId>204</WinId>
|
||||
<ViewName>Performance Analyzer</ViewName>
|
||||
<TableColWidths>1170 175 175 496</TableColWidths>
|
||||
<TableColWidths>1170</TableColWidths>
|
||||
</View>
|
||||
</SECTreeCtrl>
|
||||
|
||||
@ -1822,7 +1822,7 @@
|
||||
<Name>Build</Name>
|
||||
<Buttons>
|
||||
<Len>992</Len>
|
||||
<Data>00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000002001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0000000000000000010000000000000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050000000001061726D5F6A6F696E745F73656E736F72960000000000000001001061726D5F6A6F696E745F73656E736F72000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000</Data>
|
||||
<Data>00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000002001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050000000001061726D5F6A6F696E745F73656E736F72960000000000000001001061726D5F6A6F696E745F73656E736F72000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64DC010000</Data>
|
||||
</Buttons>
|
||||
<OriginalItems>
|
||||
<Len>583</Len>
|
||||
@ -3687,9 +3687,9 @@
|
||||
</Doc>
|
||||
<Doc>
|
||||
<Name>../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_can.c</Name>
|
||||
<ColumnNumber>43</ColumnNumber>
|
||||
<TopLine>1381</TopLine>
|
||||
<CurrentLine>1418</CurrentLine>
|
||||
<ColumnNumber>52</ColumnNumber>
|
||||
<TopLine>1405</TopLine>
|
||||
<CurrentLine>1426</CurrentLine>
|
||||
<Folding>1</Folding>
|
||||
<ContractedFolders></ContractedFolders>
|
||||
<PaneID>0</PaneID>
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -1,24 +1,78 @@
|
||||
#include "flash.h"
|
||||
#include "main.h"
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#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();
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user