GD32E508RE 64pin 芯片can问题

[复制链接]
11409|7
happymecn 发表于 2025-9-2 18:56 | 显示全部楼层 |阅读模式
Hi,最近这个问题困扰我很长时间了。(采用 GD32E508RE, 64引脚)
1)将PA11, PA12配置为can功能:如下:
gpio_init(GPIOA,GPIO_MODE_AF_OD,GPIO_OSPEED_50MHZ,GPIO_PIN_11);
gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_12);               

2)将timer0的ch0, ch1, ch2通道配置为PWM输出,电机驱动脉冲;
timer0_ch3的pwm配置为触发 adc中断采样电机电流;
以上配置下,电机运行无任何问题。但是在PA11引脚出现与PWM频率一样的脉冲,造成can0_rx(PA11),出错,无法实现canopen通信。查原因,是因为timer0_ch3功能也在PA11引脚。于是,屏蔽timer0_ch3功能(timer_ocintpara.outputstate  = TIMER_CCX_DISABLE;        ),改用timer3,设置为与timer0同步功能,让timer3触发ADC中断。出现2个结果,采样到的电机电流非常小,电流环没有闭环,电机电流会持续攀升直到过流保护;另外,因为屏蔽了timer0_ch3功能,本质上似乎禁止了PA11的复用功能,造成can无法产生接收中断(can通信是以接收中断来执行的)。
以上问题,有没有大神帮忙解答给些思路?如何才能既实现can通信(基于PA11,PA12),又可以正常电机运行?
谢谢。


jcky001 发表于 2025-9-23 16:57 | 显示全部楼层
重新分配引脚,如果可能,使用其他定时器来生成 PWM 信号,特别是那些不与 CAN 通信引脚冲突的定时器。
classroom 发表于 2025-9-23 18:57 | 显示全部楼层
优化定时器配置,同步定时器 ,TIMER3 的 PWM 输出配置是否正确,包括频率、占空比和极性。
cr315 发表于 2025-9-23 18:58 | 显示全部楼层
检查 ADC 的采样时间是否足够长,以捕获稳定的电机电流值。
duo点 发表于 2025-9-23 20:59 | 显示全部楼层
检查硬件连接。
elephant00 发表于 2025-9-23 16:59 | 显示全部楼层
解决这个问题的关键在于确保引脚配置没有冲突,并且所有功能都正确配置和同步。
jcky001 发表于 2025-9-23 20:00 | 显示全部楼层
建议查阅GD32E508RE的官方文档和示例代码。
sunjd 发表于 2025-10-27 15:50 | 显示全部楼层

GD32E508RE 64pin 芯片can问题

PA11引脚同时被CAN0_RX和TIMER0_CH3复用,造成信号干扰。
问题:屏蔽TIMER0_CH3功能会影响PA11的复用功能配置

方案1:更换CAN引脚

// 使用PB8, PB9作为CAN0引脚
gpio_pin_remap_config(GPIO_CAN0_FULL_REMAP, ENABLE);  // 完全重映射
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);   // CAN0_RX
gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_9);   // CAN0_TX


方案2:使用CAN1替代
如果PB8,PB9不可用,可以使用CAN1


// CAN1使用PB12, PB13
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);  // CAN1_RX  
gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_13);  // CAN1_TX

方案3:保持当前配置但优化同步触发
如果必须使用PA11,PA12,需要确保TIMER3与TIMER0正确同步

// TIMER0作为主定时器
timer_master_output_trigger_source_select(TIMER0, TIMER_TRI_OUT_SRC_UPDATE);
timer_primary_output_config(TIMER0, ENABLE);
// TIMER3作为从定时器,与TIMER0同步
timer_slave_mode_select(TIMER3, TIMER_SLAVE_MODE_EXTERNAL0);
timer_input_trigger_source_select(TIMER3, TIMER_SMCFG_TRGSEL_ITI0);
// 确保TIMER3的CH3配置正确用于ADC触发
timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
timer_ocintpara.outputstate = TIMER_CCX_ENABLE;
timer_channel_output_config(TIMER3, TIMER_CH_3, &timer_ocintpara);
// ADC配置使用TIMER3_CH3作为触发源
adc_external_trigger_config(ADC_REGULAR_CHANNEL, ENABLE);
adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXT_TRIG_REGULAR_T3_CH3);


建议项目开始就制作一个引脚功能分配表,避免类似冲突。GD32E508RE的引脚复用功能比较丰富,通常可以找到不冲突的配置方案。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

11

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部