feat(ota): OTA功能测试通过,CANFD解包效率优化
- 添加OTA固件升级功能,包括应用程序验证和跳转机制 - 实现CANFD数据传输协议,支持加密和CRC校验 - 优化CAN通信处理,添加调试输出和错误处理 - 更新RTE组件配置,升级csolution版本到2.12.0 - 增加Flash擦除和写入的安全验证机制 - 添加应用程序区域扫描和验证功能 refactor(can): 重构CAN通信模块和OTA数据处理 - 移除未使用的常量定义和辅助函数 - 改进数据解包和加密解密流程 - 添加条件编译调试输出 - 优化Flash操作的安全性和可靠性 chore(build): 更新项目配置和忽略文件 - 添加tmp/和out/目录到.gitignore - 扩展ROM0_SIZE从0x0020000到0x08005000 - 添加bin输出格式支持
This commit is contained in:
+22
-9
@@ -14,11 +14,6 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
constexpr u16 CANX = CAN0;
|
||||
constexpr u16 DEV_CAN0_ID = 0x0000;
|
||||
constexpr u16 DEV_CAN0_MASK = 0x0000;
|
||||
constexpr u16 DEV_CAN_LOOPBACK_ID = 0x0000;
|
||||
|
||||
CAN_transmiter CAN0_transmiter; // CAN初始化
|
||||
extern BootloaderSystem sys;
|
||||
extern OTAHandler ota;
|
||||
@@ -93,9 +88,6 @@ void can_dma_init(void) {
|
||||
// 使能DMA通道
|
||||
dma_channel_enable(DMA0, DMA_CH4);
|
||||
dma_channel_enable(DMA0, DMA_CH5);
|
||||
|
||||
// 使能CAN接收DMA
|
||||
// can_dma_enable(CAN0, CAN_DMA_RECEIVE);
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -221,7 +213,11 @@ void CAN_transmiter::communication_check() {
|
||||
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,7 +229,7 @@ u8 CAN_transmiter::sendDATA_ACK(u32 packet_num, u8 *data) { // 握手的时候
|
||||
transmit_data[1] = 0xC0;
|
||||
// 修复原始代码中不完整的循环
|
||||
for (int i = 2; i < 6; i++) {
|
||||
transmit_data[i] = data[i-2];
|
||||
transmit_data[i] = data[i - 2];
|
||||
}
|
||||
|
||||
return CANFD_AsyncSend(CANFD_OTA_ACK_ID, 6, transmit_data);
|
||||
@@ -278,13 +274,18 @@ void CAN0_RX0_IRQHandler(void) {
|
||||
if (can_interrupt_flag_get(CAN0, CAN_INT_FLAG_RFF0) != RESET) {
|
||||
// FIFO0满中断
|
||||
can_interrupt_flag_clear(CAN0, CAN_INT_FLAG_RFF0);
|
||||
#if CAN_DEBUG
|
||||
printf("CAN FIFO0 full\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
if (can_interrupt_flag_get(CAN0, CAN_INT_FLAG_RFO0) != RESET) {
|
||||
// FIFO0溢出中断
|
||||
can_interrupt_flag_clear(CAN0, CAN_INT_FLAG_RFO0);
|
||||
#if CAN_DEBUG
|
||||
printf("CAN FIFO0 overflow\n");
|
||||
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -328,13 +329,18 @@ u8 CAN_transmiter::CANFD_AsyncSend(u32 id, u8 length, u8 *data) {
|
||||
u8 valid_length = length;
|
||||
// 检查CANFD模式是否启用
|
||||
if (!(CAN_CTL(CAN0) & CAN_CTL_DFZ)) {
|
||||
#if CAN_DEBUG
|
||||
printf("CANFD mode not enabled\r\n");
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 检查数据指针是否有效
|
||||
if (data == nullptr) {
|
||||
#if CAN_DEBUG
|
||||
printf("Invalid data pointer\r\n");
|
||||
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -355,7 +361,10 @@ u8 CAN_transmiter::CANFD_AsyncSend(u32 id, u8 length, u8 *data) {
|
||||
} else if (length > 48 and length < 65) {
|
||||
valid_length = 64;
|
||||
} else {
|
||||
#if CAN_DEBUG
|
||||
printf("CANFD data length error\r\n");
|
||||
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -384,9 +393,13 @@ u8 CAN_transmiter::CANFD_AsyncSend(u32 id, u8 length, u8 *data) {
|
||||
|
||||
// 检查是否成功获取mailbox
|
||||
if (transmit_mailbox == CAN_NOMAILBOX) {
|
||||
|
||||
#if CAN_DEBUG
|
||||
// 没有可用的mailbox,启用发送中断以便在邮箱可用时重试
|
||||
printf("No available mailbox for CANFD transmission, enabling TX "
|
||||
"interrupt\r\n");
|
||||
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -11,36 +11,6 @@ extern "C" {
|
||||
#include <stdio.h>
|
||||
#include "sys/config.h"
|
||||
|
||||
|
||||
|
||||
// 添加辅助函数用于将u16类型数据打包到u8数组中
|
||||
static inline void pack_u16_to_bytes(u8 *buffer, u16 offset, u16 value) {
|
||||
buffer[offset] = (u8)(value & 0xFF);
|
||||
buffer[offset + 1] = (u8)((value >> 8) & 0xFF);
|
||||
}
|
||||
|
||||
// 添加辅助函数用于将float类型数据打包到u8数组中
|
||||
static inline void pack_u32_to_bytes(u8 *buffer, u16 offset,
|
||||
u32_union_t &u32_union) {
|
||||
buffer[offset] = u32_union.b[0];
|
||||
buffer[offset + 1] = u32_union.b[1];
|
||||
buffer[offset + 2] = u32_union.b[2];
|
||||
buffer[offset + 3] = u32_union.b[3];
|
||||
}
|
||||
|
||||
// 添加辅助函数用于从u8数组中解包short类型数据
|
||||
static inline short unpack_bytes_to_short(u8 *buffer, u16 offset) {
|
||||
short value = (short)(buffer[offset] | (buffer[offset + 1] << 8));
|
||||
return value;
|
||||
}
|
||||
|
||||
// 添加辅助函数用于从u8数组中解包u16类型数据
|
||||
static inline u16 unpack_bytes_to_u16(u8 *buffer, u16 offset) {
|
||||
u16 value = (u16)(buffer[offset] | (buffer[offset + 1] << 8));
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
u8 can_gpio_init(void); // CAN引脚初始化
|
||||
void canfd_config(void); // CANFD初始化
|
||||
void can_dma_init(void); // CAN DMA初始化
|
||||
|
||||
Reference in New Issue
Block a user