feat: 更新CMSIS和GD32C10x_DFP包版本并优化代码

- 升级ARM::CMSIS从4.5.0到6.1.0版本
- 添加ARM::CMSIS-DSP@1.16.2依赖包
- 升级GigaDevice::GD32C10x_DFP从1.0.1到1.5.0版本
- 移除FOC.cpp中未使用的systick.h头文件
- 移除pid.cpp中未使用的<algorithm>头文件
- 更新GD32C10x固件库至V1.7.0版本(2026-01-30)
- 修复ADC驱动中的无符号整数运算问题
- 优化BKP、CAN、CTC等外设驱动中的FlagStatus返回逻辑
- 改进CAN驱动的消息发送和传输停止函数实现
- 修复CRC、DMA、FMC等驱动中的数据类型和变量声明问题
- 清理和修正各驱动文件中的文档注释
This commit is contained in:
cbb
2026-05-06 00:14:16 +08:00
parent f4fb23d640
commit 94d5fda0b6
30 changed files with 409 additions and 327 deletions
+137 -99
View File
@@ -2,11 +2,11 @@
\file gd32c10x_can.c
\brief CAN driver
\version 2025-08-07, V1.6.0, firmware for GD32C10x
\version 2026-01-30, V1.7.0, firmware for GD32C10x
*/
/*
Copyright (c) 2025, GigaDevice Semiconductor Inc.
Copyright (c) 2026, GigaDevice Semiconductor Inc.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
@@ -33,7 +33,6 @@ OF SUCH DAMAGE.
*/
#include "gd32c10x_can.h"
#include "stdio.h"
#include <stdlib.h>
#define CAN_ERROR_HANDLE(s) do{}while(1)
@@ -301,10 +300,11 @@ ErrStatus can_fd_init(uint32_t can_periph, can_fdframe_struct *can_fdframe_init)
{
uint32_t timeout = CAN_TIMEOUT;
uint32_t tempreg = 0U;
ErrStatus reval = SUCCESS;
/* check null pointer */
if(0 == can_fdframe_init) {
return ERROR;
reval = ERROR;
}
/* disable sleep mode */
CAN_CTL(can_periph) &= ~CAN_CTL_SLPWMOD;
@@ -316,7 +316,7 @@ ErrStatus can_fd_init(uint32_t can_periph, can_fdframe_struct *can_fdframe_init)
}
/* check initialize working success */
if(CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)) {
return ERROR;
reval = ERROR;
} else {
/* set the data bit timing register */
CAN_DBT(can_periph) = (BT_DSJW((uint32_t)can_fdframe_init->data_resync_jump_width) | \
@@ -342,7 +342,7 @@ ErrStatus can_fd_init(uint32_t can_periph, can_fdframe_struct *can_fdframe_init)
CAN_FDTDC(can_periph) = (FDTDC_TDCF(can_fdframe_init->p_delay_compensation->tdc_filter) | FDTDC_TDCO(
can_fdframe_init->p_delay_compensation->tdc_offset));
} else {
return ERROR;
reval = ERROR;
}
} else {
/* Transmitter delay compensation mode is disabled */
@@ -366,11 +366,11 @@ ErrStatus can_fd_init(uint32_t can_periph, can_fdframe_struct *can_fdframe_init)
}
/* check exit initialize mode */
if(0U == timeout) {
return ERROR;
reval = ERROR;
}
}
return SUCCESS;
return reval;
}
/*!
@@ -747,90 +747,89 @@ uint8_t can_message_transmit(uint32_t can_periph, can_trasnmit_message_struct *t
} else {
mailbox_number = CAN_NOMAILBOX;
}
/* return no mailbox empty */
if(CAN_NOMAILBOX == mailbox_number) {
return CAN_NOMAILBOX;
}
/* got one empty mailbox */
if(CAN_NOMAILBOX != mailbox_number) {
CAN_TMI(can_periph, mailbox_number) &= CAN_TMI_TEN;
if(CAN_FF_STANDARD == transmit_message->tx_ff) {
/* set transmit mailbox standard identifier */
CAN_TMI(can_periph, mailbox_number) |= (uint32_t)(TMI_SFID(transmit_message->tx_sfid) | \
transmit_message->tx_ft);
} else {
/* set transmit mailbox extended identifier */
CAN_TMI(can_periph, mailbox_number) |= (uint32_t)(TMI_EFID(transmit_message->tx_efid) | \
transmit_message->tx_ff | \
transmit_message->tx_ft);
}
if(CAN_FDF_CLASSIC == transmit_message->fd_flag) {
/* set the data length */
CAN_TMP(can_periph, mailbox_number) &= ~(CAN_TMP_DLENC | CAN_TMP_ESI | CAN_TMP_BRS | CAN_TMP_FDF);
/* Classic CAN frame data length does not exceed 8 */
if (transmit_message->tx_dlen > 8U) {
transmit_message->tx_dlen = 8U;
CAN_TMI(can_periph, mailbox_number) &= CAN_TMI_TEN;
if(CAN_FF_STANDARD == transmit_message->tx_ff) {
/* set transmit mailbox standard identifier */
CAN_TMI(can_periph, mailbox_number) |= (uint32_t)(TMI_SFID(transmit_message->tx_sfid) | \
transmit_message->tx_ft);
} else {
/* set transmit mailbox extended identifier */
CAN_TMI(can_periph, mailbox_number) |= (uint32_t)(TMI_EFID(transmit_message->tx_efid) | \
transmit_message->tx_ff | \
transmit_message->tx_ft);
}
CAN_TMP(can_periph, mailbox_number) |= transmit_message->tx_dlen;
/* set the data */
CAN_TMDATA0(can_periph, mailbox_number) = TMDATA0_DB3(transmit_message->tx_data[3]) | \
TMDATA0_DB2(transmit_message->tx_data[2]) | \
TMDATA0_DB1(transmit_message->tx_data[1]) | \
TMDATA0_DB0(transmit_message->tx_data[0]);
CAN_TMDATA1(can_periph, mailbox_number) = TMDATA1_DB7(transmit_message->tx_data[7]) | \
TMDATA1_DB6(transmit_message->tx_data[6]) | \
TMDATA1_DB5(transmit_message->tx_data[5]) | \
TMDATA1_DB4(transmit_message->tx_data[4]);
} else {
canfd_en = CAN_FDCTL(can_periph) & CAN_FDCTL_FDEN;
/* check FD function has been enabled */
if(canfd_en) {
if(transmit_message->tx_dlen <= 8U) {
/* set the data length */
reg_temp |= transmit_message->tx_dlen;
} else {
/* data length greater than 8 */
for(i = 0U; i < 7U; i++) {
if(transmit_message->tx_dlen == g_can_fdlength_table[i]) {
hit = 1U;
break;
if(CAN_FDF_CLASSIC == transmit_message->fd_flag) {
/* set the data length */
CAN_TMP(can_periph, mailbox_number) &= ~(CAN_TMP_DLENC | CAN_TMP_ESI | CAN_TMP_BRS | CAN_TMP_FDF);
/* Classic CAN frame data length does not exceed 8 */
if (transmit_message->tx_dlen > 8U) {
transmit_message->tx_dlen = 8U;
}
CAN_TMP(can_periph, mailbox_number) |= transmit_message->tx_dlen;
/* set the data */
CAN_TMDATA0(can_periph, mailbox_number) = TMDATA0_DB3(transmit_message->tx_data[3]) | \
TMDATA0_DB2(transmit_message->tx_data[2]) | \
TMDATA0_DB1(transmit_message->tx_data[1]) | \
TMDATA0_DB0(transmit_message->tx_data[0]);
CAN_TMDATA1(can_periph, mailbox_number) = TMDATA1_DB7(transmit_message->tx_data[7]) | \
TMDATA1_DB6(transmit_message->tx_data[6]) | \
TMDATA1_DB5(transmit_message->tx_data[5]) | \
TMDATA1_DB4(transmit_message->tx_data[4]);
} else {
canfd_en = CAN_FDCTL(can_periph) & CAN_FDCTL_FDEN;
/* check FD function has been enabled */
if(canfd_en) {
if(transmit_message->tx_dlen <= 8U) {
/* set the data length */
reg_temp |= transmit_message->tx_dlen;
} else {
/* data length greater than 8 */
for(i = 0U; i < 7U; i++) {
if(transmit_message->tx_dlen == g_can_fdlength_table[i]) {
hit = 1U;
break;
}
}
/* data length is valid */
if(1U == hit) {
reg_temp |= 9U + i;
} else {
CAN_ERROR_HANDLE("dlen is invalid \r\n");
}
}
/* data length is valid */
if(1U == hit) {
reg_temp |= 9U + i;
} else {
CAN_ERROR_HANDLE("dlen is invalid \r\n");
reg_temp |= (((uint32_t)transmit_message->fd_brs << 5U) | ((uint32_t)transmit_message->fd_esi << 4U) | ((uint32_t)transmit_message->fd_flag << 7U));
CAN_TMP(can_periph, mailbox_number) = reg_temp;
/* set the data */
i = transmit_message->tx_dlen / 4U;
/* data length is 5-7 need send 2 word */
if((1U == i) && (4U != transmit_message->tx_dlen)) {
i++;
}
}
reg_temp |= (((uint32_t)transmit_message->fd_brs << 5U) | ((uint32_t)transmit_message->fd_esi << 4U) | ((uint32_t)transmit_message->fd_flag << 7U));
CAN_TMP(can_periph, mailbox_number) = reg_temp;
/* set the data */
i = transmit_message->tx_dlen / 4U;
/* data length is 5-7 need send 2 word */
if((1U == i) && (4U != transmit_message->tx_dlen)) {
i++;
}
p_temp = (uint32_t)transmit_message->tx_data;
if((0U == i)) {
CAN_TMDATA0(can_periph, mailbox_number) = *(uint32_t *)p_temp;
} else {
for(; i > 0U; i--) {
p_temp = (uint32_t)transmit_message->tx_data;
if((0U == i)) {
CAN_TMDATA0(can_periph, mailbox_number) = *(uint32_t *)p_temp;
p_temp = ((uint32_t)((uint32_t)p_temp + 4U));
} else {
for(; i > 0U; i--) {
CAN_TMDATA0(can_periph, mailbox_number) = *(uint32_t *)p_temp;
p_temp = ((uint32_t)((uint32_t)p_temp + 4U));
}
}
} else {
CAN_ERROR_HANDLE("CAN FD function disabled \r\n");
}
} else {
CAN_ERROR_HANDLE("CAN FD function disabled \r\n");
}
/* enable transmission */
CAN_TMI(can_periph, mailbox_number) |= CAN_TMI_TEN;
}
/* enable transmission */
CAN_TMI(can_periph, mailbox_number) |= CAN_TMI_TEN;
return mailbox_number;
}
@@ -901,25 +900,63 @@ can_transmit_state_enum can_transmit_states(uint32_t can_periph, uint8_t mailbox
only one parameter can be selected which is shown as below:
\arg CAN_MAILBOXx(x=0,1,2)
\param[out] none
\retval none
\retval ErrStatus: ERROR or SUCCESS
*/
void can_transmission_stop(uint32_t can_periph, uint8_t mailbox_number)
ErrStatus can_transmission_stop(uint32_t can_periph, uint8_t mailbox_number)
{
ErrStatus reval = SUCCESS;
/* timeout for CAN_TSTAT_MSTx bits */
uint32_t timeout = CAN_TIMEOUT;
uint32_t reg_value0 = 0U;
uint32_t reg_value1 = 0U;
/* get the status of transmit FIFO order */
reg_value0 = CAN_CTL(can_periph) & CAN_CTL_TFO;
if(CAN_MAILBOX0 == mailbox_number) {
CAN_TSTAT(can_periph) |= CAN_TSTAT_MST0;
while(CAN_TSTAT_MST0 == (CAN_TSTAT(can_periph) & CAN_TSTAT_MST0)) {
reg_value1 = CAN_TSTAT(can_periph) & (CAN_TSTAT_TMLS0 | CAN_ALL_MAILBOX_EMPTY);
if((CAN_CTL_TFO == reg_value0) && (CAN_TSTAT_TMLS0 == reg_value1)){
reval = ERROR;
} else {
CAN_TSTAT(can_periph) |= CAN_TSTAT_MST0;
while((CAN_TSTAT_MST0 == (CAN_TSTAT(can_periph) & CAN_TSTAT_MST0)) && (0U != timeout)) {
timeout--;
}
if(CAN_TSTAT_MST0 == (CAN_TSTAT(can_periph) & CAN_TSTAT_MST0)){
reval = ERROR;
}
}
} else if(CAN_MAILBOX1 == mailbox_number) {
CAN_TSTAT(can_periph) |= CAN_TSTAT_MST1;
while(CAN_TSTAT_MST1 == (CAN_TSTAT(can_periph) & CAN_TSTAT_MST1)) {
reg_value1 = CAN_TSTAT(can_periph) & (CAN_TSTAT_TMLS1 | CAN_ALL_MAILBOX_EMPTY);
if((CAN_CTL_TFO == reg_value0) && (CAN_TSTAT_TMLS1 == reg_value1)){
reval = ERROR;
}else{
CAN_TSTAT(can_periph) |= CAN_TSTAT_MST1;
while((CAN_TSTAT_MST1 == (CAN_TSTAT(can_periph) & CAN_TSTAT_MST1)) && (0U != timeout)) {
timeout--;
}
if(CAN_TSTAT_MST1 == (CAN_TSTAT(can_periph) & CAN_TSTAT_MST1)){
reval = ERROR;
}
}
} else if(CAN_MAILBOX2 == mailbox_number) {
CAN_TSTAT(can_periph) |= CAN_TSTAT_MST2;
while(CAN_TSTAT_MST2 == (CAN_TSTAT(can_periph) & CAN_TSTAT_MST2)) {
reg_value1 = CAN_TSTAT(can_periph) & (CAN_TSTAT_TMLS2 | CAN_ALL_MAILBOX_EMPTY);
if((CAN_CTL_TFO == reg_value0) && (CAN_TSTAT_TMLS2 == reg_value1)){
reval = ERROR;
}else{
CAN_TSTAT(can_periph) |= CAN_TSTAT_MST2;
while((CAN_TSTAT_MST2 == (CAN_TSTAT(can_periph) & CAN_TSTAT_MST2)) && (0U != timeout)) {
timeout--;
}
if(CAN_TSTAT_MST2 == (CAN_TSTAT(can_periph) & CAN_TSTAT_MST2)){
reval = ERROR;
}
}
} else {
/* illegal parameters */
}
return reval;
}
/*!
@@ -976,13 +1013,10 @@ void can_message_receive(uint32_t can_periph, uint8_t fifo_number, can_receive_m
receive_message->rx_data[5] = (uint8_t)(GET_RFIFOMDATA1_DB5(CAN_RFIFOMDATA1(can_periph, fifo_number)));
receive_message->rx_data[6] = (uint8_t)(GET_RFIFOMDATA1_DB6(CAN_RFIFOMDATA1(can_periph, fifo_number)));
receive_message->rx_data[7] = (uint8_t)(GET_RFIFOMDATA1_DB7(CAN_RFIFOMDATA1(can_periph, fifo_number)));
} else {
printf("CAN FD function disabled but FD frame received\r\n");
// CAN_ERROR_HANDLE("CAN FD function disabled \r\n");
} else {
CAN_ERROR_HANDLE("CAN FD function disabled \r\n");
}
} else {
/* check FD function has been enabled */
/* get receive data length */
canfd_recv_cnt = (uint8_t)(GET_RFIFOMP_DLENC(CAN_RFIFOMP(can_periph, fifo_number)));
@@ -1322,12 +1356,14 @@ void can_interrupt_disable(uint32_t can_periph, uint32_t interrupt)
*/
FlagStatus can_flag_get(uint32_t can_periph, can_flag_enum flag)
{
FlagStatus retval;
/* get flag and interrupt enable state */
if(RESET != (CAN_REG_VAL(can_periph, flag) & BIT(CAN_BIT_POS(flag)))) {
return SET;
retval = SET;
} else {
return RESET;
retval = RESET;
}
return retval;
}
/*!
@@ -1390,6 +1426,7 @@ void can_flag_clear(uint32_t can_periph, can_flag_enum flag)
*/
FlagStatus can_interrupt_flag_get(uint32_t can_periph, can_interrupt_flag_enum flag)
{
FlagStatus retval;
uint32_t ret1 = RESET;
uint32_t ret2 = RESET;
@@ -1406,10 +1443,11 @@ FlagStatus can_interrupt_flag_get(uint32_t can_periph, can_interrupt_flag_enum f
/* get the status of interrupt enable bit */
ret2 = CAN_INTEN(can_periph) & BIT(CAN_BIT_POS1(flag));
if(ret1 && ret2) {
return SET;
retval = SET;
} else {
return RESET;
retval = RESET;
}
return retval;
}
/*!