打印
[STM32F1]

GD32F103C8T6,使用ST标准库,CAN初始化失败

[复制链接]
4274|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fw19876311|  楼主 | 2025-1-14 14:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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;=====================卡在这个位置  }
请教各位,有遇到过吗?麻烦指导下,谢谢大家!














使用特权

评论回复
沙发
laocuo1142| | 2025-1-21 16:35 | 只看该作者
时钟配置有误?

使用特权

评论回复
板凳
Amazingxixixi| | 2025-1-21 16:43 | 只看该作者
GD为啥用ST的库,有点搞笑

使用特权

评论回复
地板
powerantone| | 2025-1-21 21:00 | 只看该作者
CAN引脚配置为复用功能输出和复用功能输入。

使用特权

评论回复
5
stormwind123| | 2025-1-21 22:00 | 只看该作者
可能是硬件故障

使用特权

评论回复
6
夜阑风雨| | 2025-2-10 01:19 | 只看该作者
我觉得是这样,尽管GD32F103系列与STM32F103系列在功能和外设上高度相似,但两者在寄存器的具体实现、默认值以及某些细节上可能存在差异

使用特权

评论回复
7
一秒落纱| | 2025-2-10 02:34 | 只看该作者
仔细对比STM32F103GD32F103CAN控制器寄存器设置。尽管两者功能相近,但寄存器名和位定义可能有所不同

使用特权

评论回复
8
光辉梦境| | 2025-2-10 03:26 | 只看该作者
特别注意MCR(主控制寄存器)、MSR(主状态寄存器)及相关CAN配置寄存器

使用特权

评论回复
9
三生万物| | 2025-2-10 04:24 | 只看该作者
INAK(初始化模式应答)标志用于确认CAN控制器是否已进入初始化模式。在STM32中,该标志在MSR寄存器中设置

使用特权

评论回复
10
淡漠安然| | 2025-2-10 05:25 | 只看该作者
GD32中,确认INAK标志是否也在MSR寄存器中,并且其行为是否与STM32一致

使用特权

评论回复
11
暖了夏天蓝了海| | 2025-2-10 06:36 | 只看该作者
一般来说,INAK_TIMEOUT的值可能需要根据GD32的硬件特性进行调整。确保该值足够长,以等待硬件响应。如果GD32CAN控制器响应速度较慢,可能需要增加超时时间

使用特权

评论回复
12
江河千里| | 2025-2-10 07:37 | 只看该作者
确认GD32CAN控制器复位和初始化序列是否与STM32相同。在某些情况下,可能需要先使能CAN时钟,然后才能进行复位和初始化

使用特权

评论回复
13
冰春彩落下| | 2025-2-10 08:48 | 只看该作者
检查GD32的时钟配置,确保CAN控制器的时钟已正确使能。不同的MCU可能需要不同的时钟配置来使能CAN外设

使用特权

评论回复
14
别乱了阵脚| | 2025-2-10 09:49 | 只看该作者
如果你使用的是HAL库或类似的抽象层,请确保它支持GD32F103。如果没有官方支持,你可能需要使用第三方库或自己编写底层驱动

使用特权

评论回复
15
远山寻你| | 2025-2-10 10:38 | 只看该作者
确认CAN总线的物理连接是否正确。检查终端电阻、CAN收发器等外设是否连接正确

使用特权

评论回复
16
wahahaheihei| | 2025-2-11 10:51 | 只看该作者
GD32F103 的 CAN 需要 PCLK1 >= 8 MHz 才能正常工作,你需要确认 APB1(PCLK1)时钟是否正确设置。

使用特权

评论回复
17
wahahaheihei| | 2025-2-11 10:51 | 只看该作者
// 确保 APB1 时钟大于 8 MHz
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq(&RCC_Clocks);
printf("PCLK1: %lu MHz\r\n", RCC_Clocks.PCLK1 / 1000000);

使用特权

评论回复
18
wahahaheihei| | 2025-2-11 10:52 | 只看该作者
复位 CAN 外设
有些情况下,GD32 CAN 外设在复位后没有正确初始化,建议手动复位:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
CAN_DeInit(CAN1);

使用特权

评论回复
19
wahahaheihei| | 2025-2-11 10:52 | 只看该作者
使能 GPIO 复用功能
GD32 的 CAN TX/RX 需要 AFIO 复用,确保开启:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);

如果使用 PB8(CAN_RX)/PB9(CAN_TX),需要 重映射:
GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);

使用特权

评论回复
20
wahahaheihei| | 2025-2-11 10:52 | 只看该作者
确保 CAN 在未挂起状态
某些情况下,GD32 CAN 外设可能 停留在 SLEEP 模式,导致初始化失败。在初始化前,先手动退出 SLEEP:
CAN1->MCR &= ~CAN_MCR_SLEEP;  
CAN1->MCR |= CAN_MCR_INRQ;  // 进入初始化模式

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

4

帖子

0

粉丝