增加debug标志位和传感器方向标志位存入flash
This commit is contained in:
parent
fda58988ed
commit
3f1a2ee5c4
@ -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
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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(¤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;
|
return ¤tCfg;
|
||||||
}
|
}
|
||||||
|
|
||||||
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();
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user