有stm32开发者用到stm32f429芯片开发产品,并用到其中的can外设。在can应用过程中有个专门针对收发出错情况进行次数统计的两个计数器,其值通过错误状态寄存器can_esr中的rec[7:0]和tec[7:0]两个字段来体现,can硬件会根据错误数据大小做适当响应或处理。
根据寄存器描述得知,tec[7:0]和rec[7:0]的值在这个寄存器里面是只读的。而此时的stm32用户有个强烈的需求,就是期望能适时地对这两个出错记录字段做清零。他自己也尝试编写一些代码想让二者清零,均以失败告终,便邮件咨询有无解决办法。
我们在阅读can_esr寄存器内容时倒有个发现,即该寄存器的复位值是0x00000000。
也就是说,芯片每次复位后其值一定是0,自然那两个出错计数器的值也是0。可客户明确表明,不接受通过对芯片级复位的方式来实现对二者清零。
那怎么办呢?对整个芯片复位不接受,直接写又不起作用。还有别的办法吗?
其实,stm32芯片除了各种芯片级的复位外,还有专门针对各个外设模块的复位。也就是说,既然这样我们可以考虑仅针对can外设做复位而达到目的。客户也接受这个做法。
以stm32f4芯片为例,下面寄存器就是负责对部分apb1外设进行复位操作的控制寄存器。
其中,can1/can2外设就是被其中的两个控制位所管控。
我们对相应控制位置1或清零达到对外设模块强制复位或做复位释放的操作。我们不妨以这里的can1为例,相应的cube库函数代码如下:
__hal_rcc_can1_force_reset(); //对can1外设实施强制复位
__hal_rcc_can1_release_reset();//释放对can1外设的强制复位
这里提醒并强调下,针对外设的强制复位和复位释放指令原则上要成对使用。如果做了强制复位而不释放的话,后面的配置不保证有效。
后来,客户按照上面推荐的方法操作后,可靠有效,符合心意。我在这里将该案例分享出来,说不定哪天你能派上用场。毕竟书到用时方恨少嘛。
一种新的水和锌基电池可以与锂电池竞争
暑期购机推荐:努比亚Z17、小米6、三星S8、一加5、荣耀9总有你的菜!
浙江成为全国农业“机器换人”示范省 大力推进农业全程机械化发展
智慧物联网边缘协同感知(EICS)技术方案: 无线场景感知
看意法半导体如何实现空中运动控制功能
如何用外设复位修改只读寄存器
OpenAI新模型Sparse Transformer,预测长度超过去30倍
SiC FET — “图腾” 象征?
用声发射和电机电流检测技术实现刀具破损的监测
电蚊拍的工作过程_电蚊拍基本电路图
领航全屋吸尘/洗地一体机新时代,莱克新品天狼星重磅发布
酷派双棒T1拆解 做工用料如何
华为行业感知精彩亮相湖北省安全技术防范行业协会20周年庆
一文读懂是什么DCS(集散控制系统)
热过载继电器好坏判断方法
全球首个PSA认证的软硬件一体物联网解决方案发布
浅析C++基础语法梳理之计算机网络中传输管理(TCP)
DC-DC电压调整器CS5517T的特性及应用
如何在3D机器视觉应用中利用DLP?
l波段_l波段波长