STM32 CAN模块问题:1、CAN收发器断电后重新上电,CAN模块死机(离线)现象;2、过滤器配置完之后没有过滤效果
做了一个项目,使用STM32F103VBT6来做GPS终端,在调试过程中发现两个问题,记录下来以便今后参考!
问题一:
给电路板上电,CAN模块正常收发,然后断电,此时因为有电池原因CPU不断电,正常工作。但硬件上CAN模块断电,此硬件设计没问题,就是这种方式。再次给电路板上电,CAN模块不能收发,但此时CPU正常,量CAN收发器电压正常!解决方法:
百度了一下,发现有不少人遇到类似问题,他们大多是因为开启了错误中断,在CANH和CANL短接或者其他原因造成CAN模块收发有误,在错误帧没有得到处理的时候CAN模块会因为错误中断而进入死循环。解决链接:https://blog.csdn.net/u014515202/article/details/54135882
我把错误中断使能禁止 CAN_ITConfig(CAN1,CAN_IT_ERR,DISABLE);(库函数)发现还是不行,,后来查阅STM32数据手册发现就算用户不去禁止,他默认也是关闭的
之前的中断错误被排除了,查看数据手册中有这么一段
当CAN收发器断电后,STM32 CAN模块会进行发送错误计数,当TEC大于255时CAN模块进入离线状态,此时并不用产生错误中断就可以让CAN模块停止发送和接收。
后来看到一篇专门讲出错管理的一篇文章:https://blog.csdn.net/flydream0/article/details/8161418
于是修改了程序
void CAN_Mode_Init(void)
{ GPIO_InitTypeDef GPIO_InitStructure; CAN_InitTypeDef CAN_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA, ENABLE);//使能PORTA时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化IOGPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化IONVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 主优先级为1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 次优先级为0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);//CAN单元设置CAN_InitStructure.CAN_TTCM=DISABLE; //非时间触发通信模式 CAN_InitStructure.CAN_ABOM=ENABLE; //软件自动离线管理 CAN_InitStructure.CAN_AWUM=DISABLE; //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)CAN_InitStructure.CAN_NART=DISABLE; //不使能非自动重传模式CAN_InitStructure.CAN_RFLM=DISABLE; //报文不锁定,新的覆盖旧的 CAN_InitStructure.CAN_TXFP=DISABLE; //优先级由报文标识符决定 CAN_InitStructure.CAN_Mode= CAN_Mode_Normal;//模式设置: CAN_Mode_Normal,普通模式;CAN_Mode_LoopBack,回环模式;//设置波特率250KbpsCAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tqCAN_InitStructure.CAN_BS1=CAN_BS1_8tq; //Tbs1=tbs1+1个时间单位CAN_BS1_1tq ~CAN_BS1_16tqCAN_InitStructure.CAN_BS2=CAN_BS2_7tq; //Tbs2=tbs2+1个时间单位CAN_BS2_1tq ~ CAN_BS2_8tqCAN_InitStructure.CAN_Prescaler=8; //分频系数(Fdiv)为brp+1 CAN_Init(CAN1, &CAN_InitStructure); //初始化CAN1 CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE); //接收中断允许. CAN_ITConfig(CAN1,CAN_IT_ERR,DISABLE); //禁止错误中断}
CAN_InitStructure.CAN_ABOM=ENABLE; //软件自动离线管理
CAN_ITConfig(CAN1,CAN_IT_ERR,DISABLE); //禁止错误中断
修改以上两个语句,问题得到解决。
- 问题二:
之前学程序时候参考了一份非常有价值的文章
1、https://blog.csdn.net/flydream0/article/details/8148791
2、https://blog.csdn.net/bonson2004/article/details/68942442
程序编写完之后验证时发现过滤器根本不起作用,又是一个坑,以后写程序得先看一遍官方数据手册是很有必要的!
发现STM32的CAN过滤器在配置时必须要进入初始化,才能对其进行配置。
/***********************************************************
函数名称:CANFilterConfig_List_Extend(u8 FGrop,u32 Ext_Id1,u32 Ext_Id2)
函数功能:设置过滤器与屏蔽寄存器 列表模式
入口参数:FGrop 过滤器组,Ext_Id1、Ext_Id2 需要过滤的扩展ID
出口参数:无
备 注:32位列表模式下,屏蔽寄存器也被当作标识符寄存器用,即两个寄存器各作为过滤值用
***********************************************************/
void CANFilterConfig_List_Extend(u8 FGrop,u32 Ext_Id1,u32 Ext_Id2)
{ CAN_FilterInitTypeDef CAN_FilterInitStructure;CAN1->FMR |= 1; //过滤器组工作在初始化模式CAN_FilterInitStructure.CAN_FilterNumber = FGrop; //设置过滤器组0,范围为0~13CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList; //设置过滤器组0为标识符列表模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //设置过滤器组0位宽为32位//设置标识符寄存器CAN_FilterInitStructure.CAN_FilterIdHigh=((Ext_Id1<<3)>>16)&0xffff ; //设置标识符寄存器高字节CAN_FilterInitStructure.CAN_FilterIdLow=((Ext_Id1<<3)&0xffff)|CAN_Id_Extended;//设置标识符寄存器低字节,CAN_FilterIdLow的ID位可以随意设置,在此模式下不会有效。//设置屏蔽寄存器,这里当标识符寄存器用CAN_FilterInitStructure.CAN_FilterMaskIdHigh=((Ext_Id2<<3)>>16)&0xffff; //设置屏蔽寄存器高字节CAN_FilterInitStructure.CAN_FilterMaskIdLow=((Ext_Id2<<3)&0xffff)|CAN_Id_Extended; //设置屏蔽寄存器低字节CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0; //此过滤器组关联到接收FIFO0CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活此过滤器组CAN_FilterInit(&CAN_FilterInitStructure); //设置过滤器CAN1->FMR &=~1; //过滤器组正常工作}
重要的两句:CAN1->FMR |= 1; //过滤器组工作在初始化模式
CAN1->FMR &=~1; //过滤器组正常工作
实测可以进行过滤|
STM32 CAN模块问题:1、CAN收发器断电后重新上电,CAN模块死机(离线)现象;2、过滤器配置完之后没有过滤效果相关推荐
- 电脑断电后无法正常启动怎么办?
电脑断电后无法正常启动是一个很常见的问题,其实除断电外,电脑强制关机后无法正常启动也很常见,出现这个问题一般是由硬件导致,可能是内存.电源.主板.显卡.硬盘等硬件出现问题,尤其是一瞬间断电再来电,电压 ...
- linux拷贝文件断电后丢失,linux突然断电重启,配置文件丢失/程序无法打开/文件损坏...
电脑突然断电,重新开机后发现有的程序无法正常启动,原因是配置文件损坏了.感觉奇怪,为什么在硬盘里的文件会内容丢失? 1.可能:写数据的过程被中断,只完成了一部分.可能会出现乱码(因为只写了几个字节,不 ...
- stm32芯片休眠模式_stm32单片机休眠模式后无法程序怎么办
诈骗stm32单片机的歇眠形式,使单片机间歇的歇眠从而告终低功耗的主意.往往会显现进入歇眠后无法叫醒,导致下一次圭臬烧不进去.时时的办理主意是:寻常的开辟板或单片机最幼编造都邑有复位键,按住复位键,点 ...
- javascript模块_6分钟内您需要了解的有关Javascript模块的所有信息
javascript模块 Note: This post is inspired by and is a summary of this excellent 30-minute video by Ty ...
- linux 光功率 模块_基于国产芯片的千兆皮秒脉冲激光器模块研制
本文内容转载自<激光技术>2019年12月,版权归<激光技术>编辑部所有. 刘云,吴敏,朱向冰,王宝慧,李风雨,马伟,徐焕银 安徽师范大学物理与电子信息学院,安徽问天量子科技股 ...
- 问题-[VMware Workstation]断电后,重启电脑,之后就提示“内部错误”
问题现象:突然断电后,重启电脑,再打开VMware Workstation,启动不了.之后就提示"内部错误". 问题原因:希望高人指点. 问题处理:关闭VMware Worksta ...
- 关于IIS正在使用突然断电后,IIS不能使用解决方案
今天机器断电后,IIS就不能使用了, 只要一用IE访问,InetInfo.exe的CPU就占用很高的内存. asp.net页面浏览就不会在显示. 解决方案:修改IIS的"启用日志记录&quo ...
- 服务器断电重启修复,WIN取消100M隐藏分区、异常断电后绕过修复模式
1,安装win系统时取消100M的前置隐藏分区的办法: 安装系统时,进行到安装Windows界面时,不使用图形界面的新建(E)进行分区,直接按快捷键Shift+F10打开CMD命令行,输入以下命令进行 ...
- python 异常处理模块_我的python学习之路-异常处理和模块导入
本节摘要 一.模块导入 二.导入包 三.异常处理 一.模块导入 文件就是一个模块,文件夹就是一个包 文件夹里面可以有很多文件,就相当于包中有好多的模块. 1.import 引入 模块不会被重复导入,引 ...
最新文章
- php百合网,来百合网直播,做最真实的自己
- Java应用程序的简单令牌认证
- make xdb file.php,SCWS入门使用指南
- php token 表单重复提交,PHP生成token防止表单重复提交2个例子
- 图片管理系统源码_「程序员分享」基于SpringBoot开发的天猫商城源码
- C++设计模式——Composite 组合模式
- 阿里云ubuntu服务器安装使用mysql并配置远程连接记录
- 涉密计算机终端安全防护,终端安全登录与文件保护系统保密认证设备
- RAKsmart日本服务器的综合性能评测
- 北大计算机专硕学费,北京大学专业硕士学费被曝高达2.2万元/年
- OPPO手机计算机怎么打符号,OPPO手机怎么开启输入的九键快捷符号调频功能
- ajax请求是宏任务还是微任务_好程序员web前端学习路线分享了解AJAX是什么
- PostgreSQL 源码解读(212)- 后台进程#11(checkpointer-SyncOneBuffer)
- 人工生命全景图:如何创造出超越人工智能的生命系统
- 天龙八部服务端数据传递
- 八种生物成像技术,你青睐谁?
- 关于开源神经影像数据集如何使用的协议
- ecshop安装检测本地mysql服务器_ecshop 4.0本地服务器安装
- 亲测好用!免费英语学习版ChatGPT,国内能直接用!(内测名额有限)
- 自学网站 分享一波儿!