修复BOOT丢帧问题,优化标志位的存储

This commit is contained in:
cbb
2026-03-08 01:08:27 +08:00
parent 1e6d47ddae
commit 26cf5af14f
65 changed files with 2290 additions and 2174 deletions
+31 -22
View File
@@ -6,8 +6,6 @@
#include "gd32c10x_dma.h"
#include "gd32c10x_gpio.h"
#include "main.h"
#include <cstdlib>
#include <cstring>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
@@ -176,6 +174,10 @@ u8 CAN_transmiter::init() {
/* initialize receive message */
can_struct_para_init(CAN_RX_MESSAGE_STRUCT, &receive_message);
// 初始化计数器和标志位
can0_receive_count = 0;
can0_send_flag = RESET;
// 初始化DMA缓冲区
memset(can_rx_buffer, 0, sizeof(can_rx_buffer));
memset(can_tx_buffer, 0, sizeof(can_tx_buffer));
@@ -184,28 +186,20 @@ u8 CAN_transmiter::init() {
/**
* @brief CAN通信检查函数
* @retval 0: 无新消息
* 1: 有新消息
* @retval 无
*/
void CAN_transmiter::communication_check() {
// CAN0 发送数据标志
if (SET == can0_send_flag) {
can0_send_flag = RESET;
}
// CAN0 接收数据标志
if (SET == can0_receive_flag) {
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;
// CAN0 接收数据计数器
if (can0_receive_count > 0) {
can0_receive_count--;
// 处理OTA消息(中断处理程序已确保只接收OTA相关ID)
ota.handleOTAMessage(receive_message.rx_efid,
receive_message.rx_data,
receive_message.rx_dlen);
}
}
@@ -225,7 +219,6 @@ 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);
@@ -255,10 +248,26 @@ void CAN0_RX0_IRQHandler(void) {
dma_channel_enable(DMA0, DMA_CH4);
// 读取接收到的数据
can_message_receive(CAN0, CAN_FIFO0, &CAN0_transmiter.receive_message);
can_receive_message_struct temp_message;
can_message_receive(CAN0, CAN_FIFO0, &temp_message);
// 接收标志位置1
CAN0_transmiter.can0_receive_flag = SET;
// 只处理指定的OTA相关ID(硬件过滤器已经确保只接收这些ID)
if (temp_message.rx_efid == CANFD_OTA_DATA_ID ||
temp_message.rx_efid == CANFD_OTA_REQ_ID ||
temp_message.rx_efid == CANFD_OTA_ACK_ID ||
temp_message.rx_efid == CANFD_OTA_WAIT_ID ||
temp_message.rx_efid == CANFD_OTA_CANCEL_ID) {
// 将消息复制到接收缓冲区
CAN0_transmiter.receive_message = temp_message;
// 增加待处理消息计数器
if (CAN0_transmiter.can0_receive_count < 255) {
CAN0_transmiter.can0_receive_count++;
}
} else {
#if CAN_DEBUG
printf("Unknown CAN ID: %X\n", temp_message.rx_efid);
#endif
}
}
// 检查其他可能的中断源
+2 -3
View File
@@ -1,13 +1,12 @@
#ifndef _CAN_H
#define _CAN_H
#include <stdint.h>
#include "cstdint"
#ifdef __cplusplus
extern "C" {
#endif
#include "gd32c10x_can.h"
#include "stdint.h"
#include <stdio.h>
u8 can_gpio_init(void); // CAN引脚初始化
@@ -32,7 +31,7 @@ class CAN_transmiter {
u8 init(void);
can_receive_message_struct receive_message; // 接收消息结构体
FlagStatus can0_receive_flag; // CAN0接收标志
u8 can0_receive_count; // CAN0待处理消息计数器
FlagStatus can0_send_flag; // CAN0发送标志
void communication_check(); // 通信检查