做了一个项目,使用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、过滤器配置完之后没有过滤效果相关推荐

  1. 电脑断电后无法正常启动怎么办?

    电脑断电后无法正常启动是一个很常见的问题,其实除断电外,电脑强制关机后无法正常启动也很常见,出现这个问题一般是由硬件导致,可能是内存.电源.主板.显卡.硬盘等硬件出现问题,尤其是一瞬间断电再来电,电压 ...

  2. linux拷贝文件断电后丢失,linux突然断电重启,配置文件丢失/程序无法打开/文件损坏...

    电脑突然断电,重新开机后发现有的程序无法正常启动,原因是配置文件损坏了.感觉奇怪,为什么在硬盘里的文件会内容丢失? 1.可能:写数据的过程被中断,只完成了一部分.可能会出现乱码(因为只写了几个字节,不 ...

  3. stm32芯片休眠模式_stm32单片机休眠模式后无法程序怎么办

    诈骗stm32单片机的歇眠形式,使单片机间歇的歇眠从而告终低功耗的主意.往往会显现进入歇眠后无法叫醒,导致下一次圭臬烧不进去.时时的办理主意是:寻常的开辟板或单片机最幼编造都邑有复位键,按住复位键,点 ...

  4. javascript模块_6分钟内您需要了解的有关Javascript模块的所有信息

    javascript模块 Note: This post is inspired by and is a summary of this excellent 30-minute video by Ty ...

  5. linux 光功率 模块_基于国产芯片的千兆皮秒脉冲激光器模块研制

    本文内容转载自<激光技术>2019年12月,版权归<激光技术>编辑部所有. 刘云,吴敏,朱向冰,王宝慧,李风雨,马伟,徐焕银 安徽师范大学物理与电子信息学院,安徽问天量子科技股 ...

  6. 问题-[VMware Workstation]断电后,重启电脑,之后就提示“内部错误”

    问题现象:突然断电后,重启电脑,再打开VMware Workstation,启动不了.之后就提示"内部错误". 问题原因:希望高人指点. 问题处理:关闭VMware Worksta ...

  7. 关于IIS正在使用突然断电后,IIS不能使用解决方案

    今天机器断电后,IIS就不能使用了, 只要一用IE访问,InetInfo.exe的CPU就占用很高的内存. asp.net页面浏览就不会在显示. 解决方案:修改IIS的"启用日志记录&quo ...

  8. 服务器断电重启修复,WIN取消100M隐藏分区、异常断电后绕过修复模式

    1,安装win系统时取消100M的前置隐藏分区的办法: 安装系统时,进行到安装Windows界面时,不使用图形界面的新建(E)进行分区,直接按快捷键Shift+F10打开CMD命令行,输入以下命令进行 ...

  9. python 异常处理模块_我的python学习之路-异常处理和模块导入

    本节摘要 一.模块导入 二.导入包 三.异常处理 一.模块导入 文件就是一个模块,文件夹就是一个包 文件夹里面可以有很多文件,就相当于包中有好多的模块. 1.import 引入 模块不会被重复导入,引 ...

最新文章

  1. php百合网,来百合网直播,做最真实的自己
  2. Java应用程序的简单令牌认证
  3. make xdb file.php,SCWS入门使用指南
  4. php token 表单重复提交,PHP生成token防止表单重复提交2个例子
  5. 图片管理系统源码_「程序员分享」基于SpringBoot开发的天猫商城源码
  6. C++设计模式——Composite 组合模式
  7. 阿里云ubuntu服务器安装使用mysql并配置远程连接记录
  8. 涉密计算机终端安全防护,终端安全登录与文件保护系统保密认证设备
  9. RAKsmart日本服务器的综合性能评测
  10. 北大计算机专硕学费,北京大学专业硕士学费被曝高达2.2万元/年
  11. OPPO手机计算机怎么打符号,OPPO手机怎么开启输入的九键快捷符号调频功能
  12. ajax请求是宏任务还是微任务_好程序员web前端学习路线分享了解AJAX是什么
  13. PostgreSQL 源码解读(212)- 后台进程#11(checkpointer-SyncOneBuffer)
  14. 人工生命全景图:如何创造出超越人工智能的生命系统
  15. 天龙八部服务端数据传递
  16. 八种生物成像技术,你青睐谁?
  17. 关于开源神经影像数据集如何使用的协议
  18. ecshop安装检测本地mysql服务器_ecshop 4.0本地服务器安装
  19. 亲测好用!免费英语学习版ChatGPT,国内能直接用!(内测名额有限)
  20. 自学网站 分享一波儿!

热门文章

  1. 【代老婆发】你是中介,你姐是黑中介,你们全家都是我爱我家的中介
  2. 四代增强 (BTE实例详解)
  3. win10的开机启动文件夹
  4. 服务注册中心:Eureka
  5. mysql 日期查询 今天、明天、本周、七天内、本月、后一个月
  6. html5四季特点,美国一年四季天气特点介绍
  7. 关于移动硬盘突然变成RAW格式数据该怎么恢复
  8. 2021-2025年中国军用浮桥行业市场供需与战略研究报告
  9. vscode翻译插件最佳搭配、翻译变量、划词翻译、中译英(提高生产效率)
  10. 详解UniSwap、无聊猿、PlatoFarm空投的逻辑