21ic问答首页 - GD32F103C8T6,使用ST标准库,CAN初始化失败
GD32F103C8T6,使用ST标准库,CAN初始化失败
本帖最后由 fw19876311 于 2025-1-14 17:01 编辑
STM32F103C8T6正常运行的代码,直接平替GD32F103C8,CAN部分初始化异常,一直返回失败
uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct){
uint8_t InitStatus = CAN_InitStatus_Failed;
uint32_t wait_ack = 0x00000000; /* Check theparameters*/assert_param(IS_CAN_ALL_PERIPH(CANx));assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_TTCM));
assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_ABOM));
assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_AWUM));
assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_NART));
assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_RFLM));
assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_TXFP));
assert_param(IS_CAN_MODE(CAN_InitStruct->CAN_Mode));
assert_param(IS_CAN_SJW(CAN_InitStruct->CAN_SJW));
assert_param(IS_CAN_BS1(CAN_InitStruct->CAN_BS1));
assert_param(IS_CAN_BS2(CAN_InitStruct->CAN_BS2));
assert_param(IS_CAN_PRESCALER(CAN_InitStruct->CAN_Prescaler)); /* Exit from sleep mode */
CANx->MCR &= (~(uint32_t)CAN_MCR_SLEEP); /* Request initialisation */
CANx->MCR |= CAN_MCR_INRQ ; /* Wait the acknowledge */
while (((CANx->MSR & CAN_MSR_INAK) != CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT)) { wait_ack++; } /* Check acknowledge */
if ((CANx->MSR & CAN_MSR_INAK) != CAN_MSR_INAK)
{ InitStatus = CAN_InitStatus_Failed;=====================卡在这个位置 }
请教各位,有遇到过吗?麻烦指导下,谢谢大家!
STM32F103C8T6正常运行的代码,直接平替GD32F103C8,CAN部分初始化异常,一直返回失败
uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct){
uint8_t InitStatus = CAN_InitStatus_Failed;
uint32_t wait_ack = 0x00000000; /* Check theparameters*/assert_param(IS_CAN_ALL_PERIPH(CANx));assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_TTCM));
assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_ABOM));
assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_AWUM));
assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_NART));
assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_RFLM));
assert_param(IS_FUNCTIONAL_STATE(CAN_InitStruct->CAN_TXFP));
assert_param(IS_CAN_MODE(CAN_InitStruct->CAN_Mode));
assert_param(IS_CAN_SJW(CAN_InitStruct->CAN_SJW));
assert_param(IS_CAN_BS1(CAN_InitStruct->CAN_BS1));
assert_param(IS_CAN_BS2(CAN_InitStruct->CAN_BS2));
assert_param(IS_CAN_PRESCALER(CAN_InitStruct->CAN_Prescaler)); /* Exit from sleep mode */
CANx->MCR &= (~(uint32_t)CAN_MCR_SLEEP); /* Request initialisation */
CANx->MCR |= CAN_MCR_INRQ ; /* Wait the acknowledge */
while (((CANx->MSR & CAN_MSR_INAK) != CAN_MSR_INAK) && (wait_ack != INAK_TIMEOUT)) { wait_ack++; } /* Check acknowledge */
if ((CANx->MSR & CAN_MSR_INAK) != CAN_MSR_INAK)
{ InitStatus = CAN_InitStatus_Failed;=====================卡在这个位置 }
请教各位,有遇到过吗?麻烦指导下,谢谢大家!

问答
赞0
评论
2025-11-06
赞0
手动 CAN_DeInit(CAN1)
确保 GPIO 复用和重映射
手动退出 CAN_MCR_SLEEP
可以尝试上面的步骤,看看 CAN_Init 是否可以顺利通过 while 循环。
评论
2025-02-11
赞0
评论
2025-02-11
赞0
某些情况下,GD32 CAN 外设可能 停留在 SLEEP 模式,导致初始化失败。在初始化前,先手动退出 SLEEP:
评论
2025-02-11
赞0
GD32 的 CAN TX/RX 需要 AFIO 复用,确保开启:
相关问题
本周活跃用户
问答专家
tyw
319个答案
天意无罪
288个答案
xch
240个答案
jjjyufan
209个答案
coody
203个答案
LcwSwust
172个答案
chunyang
135个答案
地瓜patch
130个答案
本站介绍 合作联络 欢迎投稿 隐私声明 广告业务 网站地图 联系我们 诚聘英才
21IC电子网 2000- 版权所有
京ICP备11013301号
京公网安备 11010802024343号