当前位置: 首页 > news >正文

GD32 CAN1和TIMER0同时开启问题

背景:今天在一个项目调试的时候发现了一些问题,由此贴记录一下问题解决的过程。

使用的芯片是GD32F305VE。使用到了CAN1和TIMER0。在使用这连个外设的时候发送了一些问题。

单独使用CAN1。功能正常。

单独使用TIMER0。配置为输出模式。功能正常。

但是当两个功能同时使用,初始化的时候,就出问题了。


1、引脚配置

//TIMER0 引脚定义
#define   TIMER0_CH2_GPIO_PIN              GPIO_PIN_10
#define   TIMER0_CH1_GPIO_PIN              GPIO_PIN_9
#define   TIMER0_CH2N_GPIO_PIN             GPIO_PIN_15
#define   TIMER0_CH1N_GPIO_PIN             GPIO_PIN_14
//CAN1引脚定义
#define   CAN1_CLOCK                    RCU_GPIOB
#define   CAN1_GPIO                     GPIOB
#define   CAN1_TX_GPIO_PIN              GPIO_PIN_13
#define   CAN1_RX_GPIO_PIN              GPIO_PIN_12

 从引脚上看,每个是没有用到重复的引脚的。都是单独分开。

2、发现问题

但是这时候,会导致一个问题。

CAN1的初始化失败了。

//这是底层的库函数,CAN初始化
ErrStatus can_init(uint32_t can_periph, can_parameter_struct* can_parameter_init)
{uint32_t timeout = CAN_TIMEOUT;ErrStatus flag = ERROR;/* disable sleep mode */CAN_CTL(can_periph) &= ~CAN_CTL_SLPWMOD;/* enable initialize mode */CAN_CTL(can_periph) |= CAN_CTL_IWMOD;/* wait ACK */while((CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)) && (0U != timeout)){timeout--;}/* check initialize working success */if(CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)){flag = ERROR;}else{/* set the bit timing register */CAN_BT(can_periph) = (BT_MODE((uint32_t)can_parameter_init->working_mode) | \BT_SJW((uint32_t)can_parameter_init->resync_jump_width) | \BT_BS1((uint32_t)can_parameter_init->time_segment_1) | \BT_BS2((uint32_t)can_parameter_init->time_segment_2) | \BT_BAUDPSC(((uint32_t)(can_parameter_init->prescaler) - 1U)));/* time trigger communication mode */if(ENABLE == can_parameter_init->time_triggered){CAN_CTL(can_periph) |= CAN_CTL_TTC;}else{CAN_CTL(can_periph) &= ~CAN_CTL_TTC;}/* automatic bus-off managment */if(ENABLE == can_parameter_init->auto_bus_off_recovery){CAN_CTL(can_periph) |= CAN_CTL_ABOR;}else{CAN_CTL(can_periph) &= ~CAN_CTL_ABOR;}/* automatic wakeup mode */if(ENABLE == can_parameter_init->auto_wake_up){CAN_CTL(can_periph) |= CAN_CTL_AWU;}else{CAN_CTL(can_periph) &= ~CAN_CTL_AWU;}/* automatic retransmission mode disable */if(ENABLE == can_parameter_init->no_auto_retrans){CAN_CTL(can_periph) |= CAN_CTL_ARD;}else{CAN_CTL(can_periph) &= ~CAN_CTL_ARD;}/* receive fifo overwrite mode */        if(ENABLE == can_parameter_init->rec_fifo_overwrite){CAN_CTL(can_periph) |= CAN_CTL_RFOD;}else{CAN_CTL(can_periph) &= ~CAN_CTL_RFOD;} /* transmit fifo order */if(ENABLE == can_parameter_init->trans_fifo_order){CAN_CTL(can_periph) |= CAN_CTL_TFO;}else{CAN_CTL(can_periph) &= ~CAN_CTL_TFO;}  /* disable initialize mode */CAN_CTL(can_periph) &= ~CAN_CTL_IWMOD;timeout = CAN_TIMEOUT;/* wait the ACK */while((CAN_STAT_IWS == (CAN_STAT(can_periph) & CAN_STAT_IWS)) && (0U != timeout)){timeout--;}/* check exit initialize mode */if(0U != timeout){flag = SUCCESS;}}  return flag;
}

进入这个函数后,会进入使能初始化工作工作模式。这个查看用户手册可以查到。

下图是进入函数运行中的寄存器状态。这是是出于初始化工作状态的

但退出函数之前,发现并没有退出初始化工作模式。导致初始化失败了。

3、定位问题

在定位问题的过程中,试了一下把TIMER0的初始化先屏蔽掉。结果就又正常了。

因此定位问题发生在TIMER0的初始化。

但是很奇怪,TIMER0的初始化,只初始化了通道1,和通道2,没有初始化通道0,按理说是不应该有影响的。

查看了寄存器

这个地方导致,这个脚被初始化为输出。再看下一个寄存器。

这里导致输出为高电平,和示波器抓到的波形一样。

所以这就是导致CAN1初始化失败的原因。

4、原理

5、解决方法

把通道0配置初始化为输入模式。就能解决问题了。

http://www.xdnf.cn/news/1109629.html

相关文章:

  • 深度学习15(GRU、LSTM+词嵌入+seq2seq+attention)
  • 电子基石:硬件工程师的器件手册 (五) - 三极管:电流放大的基石与开关的利刃
  • 7. JVM类加载器与双亲委派模型
  • 关于两种网络攻击方式XSS和CSRF
  • 二分法寻找无序序列的峰值
  • [Token]Token merging for Vision Generation
  • 学python,PyCharm 和 VSCode哪个更好用?
  • ChatRex RexSeek RexThinker: 结合多模态大语言模型的目标检测模型构建
  • vue3+vit+vue-router路由,侧边栏菜单,面包屑导航设置层级结构
  • 商业机密保卫战:如何让离职员工带不走的客户资源?
  • 六年级数学知识边界总结思考-上册
  • Rust Web 全栈开发(五):使用 sqlx 连接 MySQL 数据库
  • 【赵渝强老师】国产数据库TiDB的代理路由:TiProxy
  • 服务器怎么跑Python项目?
  • 【代码随想录】刷题笔记——哈希表篇
  • MySQL 中图标字符存储问题探究:使用外挂法,毕业论文——仙盟创梦IDE
  • shiro550反序列化漏洞复现(附带docker源)
  • 【Docker基础】Dockerfile指令速览:基础常用指令详解
  • Leetcode百题斩-二分搜索
  • 使用langgraph 构建RAG 智能问答代理
  • springboot AOP面向切面编程
  • 连接池深度解析:原理、实现与最佳实践
  • Hap包引用的Hsp报签名错误怎么解决
  • 使用ESM3蛋白质语言模型进行快速大规模结构预测
  • 每日一SQL 【销售分析 III】
  • Python问题记录`No module named ‘matplotlib‘` 问题解决方案
  • 基于SEP3203微处理器的嵌入式最小硬件系统设计
  • 基于 Python 的数据分析技术综述
  • 剑指offer56_数组中唯一只出现一次的数字
  • 【MogDB】一种基于ctid分片并发查询以提升大表查询性能的方式