feat(cbuild): 更新GD32C10x_DFP包到1.5.0版本并修复多个设备驱动文件
更新了项目中使用的GD32C10x_DFP包从1.0.1版本升级到1.5.0版本, 同时更新了多个RTE设备驱动文件以匹配新版本固件,包括ADC、BKP、CAN、CRC、CTC、DAC、DBG、DMA、EXMC、EXTI、FMC等外设驱动。修复了CAN驱动中的消息传输逻辑,改进了错误处理机制,并统一了标志位获取函数的返回值处理方式。
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
/*!
|
||||
|
||||
Reference in New Issue
Block a user