feat(ota): 修复备份APP区域恢复功能和OTA流程优化、启用BRS、减小延时

- 添加sendBackup方法用于在备份APP激活时发送确认消息
- 优化OTA跳转逻辑,在jumpToApplication中清除复位标志
- 修复move_app_data函数中数据源地址错误,从备份区域正确读取数据
- 在OTA流程中正确设置APP状态标志,确保应用验证状态管理

refactor(can): 清理调试代码和函数签名优化

- 移除调试用的printf语句和未使用的cstdio头文件
- 统一函数参数类型为u8和u32,提高代码一致性
- 优化CAN通信检查逻辑,移除冗余的调试输出

perf(ota): 优化OTA处理中的延时函数

- 将delay_1ms(1)改为delay_1us(100),提高延时精度
- 添加微秒级延时函数delay_1us实现
- 增加OTA超时时间从10秒到100秒

fix(ota): 修复OTA状态管理和错误处理

- 在各种错误情况下正确设置ota_state为OTA_STATE_IDLE
- 在eraseApplicationArea中正确初始化APP状态标志
- 添加CRC校验失败时的调试输出选项
- 修复数据包大小验证逻辑
This commit is contained in:
cbb
2026-01-07 23:14:15 +08:00
parent c7c4451d57
commit aefb7d4ee4
18 changed files with 1384 additions and 1328 deletions
+5 -13
View File
@@ -6,7 +6,6 @@
#include "gd32c10x_dma.h"
#include "gd32c10x_gpio.h"
#include "main.h"
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <stdint.h>
@@ -191,30 +190,19 @@ u8 CAN_transmiter::init() {
void CAN_transmiter::communication_check() {
// CAN0 发送数据标志
if (SET == can0_send_flag) {
// printf("\r\n can0 %X receive data:", receive_message.rx_efid);
// CAN0_transmiter.CAN_all_Send();
// CANFD_all_Send();
can0_send_flag = RESET;
}
// CAN0 接收数据标志
if (SET == can0_receive_flag) {
// printf("can0 %X receive data,length%d:", receive_message.rx_efid,
// receive_message.rx_dlen);
// for (int i = 0; i < receive_message.rx_dlen; i++) {
// printf(" 0x%02x", receive_message.rx_data[i]);
// }
// printf("\n");
if (receive_message.rx_efid == CANFD_OTA_DATA_ID or
receive_message.rx_efid == CANFD_OTA_REQ_ID) {
ota.handleOTAMessage(receive_message.rx_efid,
receive_message.rx_data,
receive_message.rx_dlen);
} else {
#if CAN_DEBUG
printf("Unknown CAN ID: %X\n", receive_message.rx_efid);
#endif
}
can0_receive_flag = RESET;
@@ -233,6 +221,11 @@ u8 CAN_transmiter::sendDATA_ACK(u32 packet_num, u8 *data) { // 握手的时候
return CANFD_AsyncSend(CANFD_OTA_ACK_ID, 6, transmit_data);
}
u8 CAN_transmiter::sendBackup() { // 握手的时候
return CANFD_AsyncSend(CANFD_OTA_ACK_ID, 0, transmit_data);
}
u8 CAN_transmiter::sendDATA_ACK(u32 packet_num,
bool if_success) { // 发送数据的时候
memset(transmit_data, 0, 4);
@@ -361,7 +354,6 @@ u8 CAN_transmiter::CANFD_AsyncSend(u32 id, u8 length, u8 *data) {
} else {
#if CAN_DEBUG
printf("CANFD data length error\r\n");
#endif
return 0;
}
+2 -1
View File
@@ -38,7 +38,8 @@ class CAN_transmiter {
void communication_check(); // 通信检查
u8 CANFD_AsyncSend(u32 ID, u8 length, u8 *data); // CANFD异步发送(使用DMA)
u8 sendDATA_ACK(u32 packet_num, bool if_success);
u8 sendDATA_ACK(u32 packet_num, u8* data); // 恢复原函数签名
u8 sendDATA_ACK(u32 packet_num, u8 *data); // 恢复原函数签名
u8 sendBackup();
};
#ifdef __cplusplus