feat(can): 增加CAN睡眠与唤醒功能并优化通信检查逻辑

- 在CAN通信类中添加了CAN_Sleep()和CAN_Wakeup()方法,支持设备进入低功耗模式
- 优化CAN通信检查逻辑,通过解析接收数据的首字节和末字节实现多种控制命令
- 支持远程复位电机、保存角度、清零角度、进入睡眠等操作
- 解决CAN发送邮箱满时可能导致的通信阻塞问题,增加重初始化机制
- 调整mailbox不可用计数逻辑,防止持续打印错误信息

refactor(flash): 移除软件CRC计算模块,改用硬件CRC外设
- 删除自定义CRC.cpp和CRC.h文件及其相关类实现
- 使用GD32硬件CRC模块替代软件算法,提高效率和可靠性
- 更新FlashEEPROM类中的CRC校验方式,调用crc_block_data_calculate进行计算
- 修正Flash地址遍历范围以适配新CRC逻辑及页面管理策略
- 修改save_angle接口签名,不再手动传入角度值,改为内部读取FOC实时角度

feat(timer): 新增RTC闹钟中断处理函数声明

- 在Timer.h中声明rtc_set_wakeup_interval和RTC_ALARM_IRQHandler
- 为后续实现基于RTC的定时唤醒功能做准备

chore(config): 同步csolution工具版本更新并调整组件配置

- 更新RTE_Components.h生成工具版本至2.12.0
- 启用BKP、CRC、RTC等标准外设组件宏定义
- 从项目配置文件中移除旧CRC源文件引用
- 添加SystemCoreClockUpdate调用确保系统时钟同步

refactor(main): 主循环任务调度重构并增强初始化流程

- 将主循环中的任务处理提取为独立do_task函数,提升代码可读性
- 提前执行电机初始化,并根据看门狗复位标志决定是否立即进入深度睡眠
- 调整EEPROM初始化顺序,保证依赖关系正确
- 添加sys/initial.h头文件包含以支持新增系统初始化逻辑
This commit is contained in:
cbb
2025-12-20 19:53:52 +08:00
parent 7c2860f302
commit 7354a71c51
19 changed files with 366 additions and 418 deletions
-133
View File
@@ -1,133 +0,0 @@
#include "CRC.h"
#include <cstring>
#include <stdint.h>
CRC_Calculator CRC_Calculator;
// 静态成员初始化
bool CRC_Calculator::table_initialized = false;
u32 CRC_Calculator::crc_table[256];
/**
* @brief 初始化CRC表
*/
void CRC_Calculator::init_crc_table() {
if (table_initialized) {
return;
}
uint32_t polynomial = 0xEDB88320; // CRC-32 IEEE 802.3标准多项式
for (int i = 0; i < 256; i++) {
uint32_t crc = i;
for (int j = 0; j < 8; j++) {
if (crc & 1) {
crc = (crc >> 1) ^ polynomial;
} else {
crc >>= 1;
}
}
crc_table[i] = crc;
}
table_initialized = true;
}
/**
* @brief 更新CRC值
* @param crc 当前CRC值
* @param data 要处理的数据
* @return 更新后的CRC值
*/
uint32_t CRC_Calculator::update_crc(uint32_t crc, uint8_t data) {
// 确保表已初始化
if (!table_initialized) {
init_crc_table();
}
uint8_t table_index = (crc ^ data) & 0xFF;
return (crc >> 8) ^ crc_table[table_index];
}
/**
* @brief 计算单个float值的CRC32
* @param data float值
* @return CRC32校验值
*/
uint32_t CRC_Calculator::calculate(const float& data) {
// 强制初始化CRC表(如果尚未初始化)
if (!table_initialized) {
init_crc_table();
}
uint32_t crc = 0xFFFFFFFF;
// 将float值按字节处理
const uint8_t* bytes = reinterpret_cast<const uint8_t*>(&data);
for (size_t i = 0; i < sizeof(float); i++) {
crc = update_crc(crc, bytes[i]);
}
return crc ^ 0xFFFFFFFF;
}
/**
* @brief 计算float数组的CRC32
* @param data float数组指针
* @param length 数组长度
* @return CRC32校验值
*/
uint32_t CRC_Calculator::calculate(const float* data, size_t length) {
// 强制初始化CRC表(如果尚未初始化)
if (!table_initialized) {
init_crc_table();
}
uint32_t crc = 0xFFFFFFFF;
// 处理每个float值
for (size_t i = 0; i < length; i++) {
const uint8_t* bytes = reinterpret_cast<const uint8_t*>(&(data[i]));
for (size_t j = 0; j < sizeof(float); j++) {
crc = update_crc(crc, bytes[j]);
}
}
return crc ^ 0xFFFFFFFF;
}
/**
* @brief 验证单个float值的CRC32
* @param data float值
* @param expected_crc 期望的CRC值
* @return true表示校验成功,false表示校验失败
*/
bool CRC_Calculator::verify(const float& data, uint32_t expected_crc) {
return calculate(data) == expected_crc;
}
/**
* @brief 验证float数组的CRC32
* @param data float数组指针
* @param length 数组长度
* @param expected_crc 期望的CRC值
* @return true表示校验成功,false表示校验失败
*/
bool CRC_Calculator::verify(const float* data, size_t length, uint32_t expected_crc) {
return calculate(data, length) == expected_crc;
}
/**
* @brief 获取CRC表初始化状态
* @return true表示已初始化,false表示未初始化
*/
bool CRC_Calculator::isInitialized() {
return table_initialized;
}
/**
* @brief 强制重新初始化CRC表
*/
void CRC_Calculator::reinitialize() {
table_initialized = false;
init_crc_table();
}
-85
View File
@@ -1,85 +0,0 @@
#ifndef __CRC_H
#define __CRC_H
#include <cstdint>
#ifdef __cplusplus
extern "C" {
#endif
#include "gd32c10x.h"
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
#include <cstddef>
class CRC_Calculator {
private:
static bool table_initialized;
static uint32_t crc_table[256];
/**
* @brief 初始化CRC表
*/
static void init_crc_table();
/**
* @brief 更新CRC值
* @param crc 当前CRC值
* @param data 要处理的数据
* @return 更新后的CRC值
*/
static uint32_t update_crc(uint32_t crc, uint8_t data);
public:
/**
* @brief 计算单个float值的CRC32
* @param data float值
* @return CRC32校验值
*/
static uint32_t calculate(const float& data);
/**
* @brief 计算float数组的CRC32
* @param data float数组指针
* @param length 数组长度
* @return CRC32校验值
*/
static uint32_t calculate(const float* data, size_t length);
/**
* @brief 验证单个float值的CRC32
* @param data float值
* @param expected_crc 期望的CRC值
* @return true表示校验成功,false表示校验失败
*/
static bool verify(const float& data, uint32_t expected_crc);
/**
* @brief 验证float数组的CRC32
* @param data float数组指针
* @param length 数组长度
* @param expected_crc 期望的CRC值
* @return true表示校验成功,false表示校验失败
*/
static bool verify(const float* data, size_t length, uint32_t expected_crc);
/**
* @brief 获取CRC表初始化状态
* @return true表示已初始化,false表示未初始化
*/
static bool isInitialized();
/**
* @brief 强制重新初始化CRC表
*/
static void reinitialize();
};
#endif // __cplusplus
#endif // __CRC_H
+25
View File
@@ -0,0 +1,25 @@
#ifndef PID_H
#define PID_H
class PIDController
{
public:
PIDController(float P, float I, float D, float ramp, float limit);
~PIDController() = default;
float operator() (float error);
void set_PID(float P, float I, float D);
float P; //!< 比例增益(P环增益)
float I; //!< 积分增益(I环增益)
float D; //!< 微分增益(D环增益)
float output_ramp;
float limit;
protected:
float error_prev; //!< 最后的跟踪误差值
float output_prev; //!< 最后一个 pid 输出值
float integral_prev; //!< 最后一个积分分量值
unsigned long timestamp_prev; //!< 上次执行时间戳
};
#endif