你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

修改只读寄存器之用外设复位

[复制链接]
攻城狮Melo 发布时间:2023-4-27 18:40
微信图片_20230427184008.png
- e9 k4 f' s9 }5 C
有STM32开发者用到STM32F429芯片开发产品,并用到其中的CAN外设。在CAN应用过程中有个专门针对收发出错情况进行次数统计的两个计数器,其值通过错误状态寄存器CAN_ESR中的REC[7:0]和TEC[7:0]两个字段来体现,CAN硬件会根据错误数据大小做适当响应或处理。
1 l; K! |0 i% a/ Q9 d* [
微信图片_20230427184004.png

' k' q9 t1 Y0 L6 R- x
根据寄存器描述得知,TEC[7:0]和REC[7:0]的值在这个寄存器里面是只读的。而此时的STM32用户有个强烈的需求,就是期望能适时地对这两个出错记录字段做清零。他自己也尝试编写一些代码想让二者清零,均以失败告终,便邮件咨询有无解决办法。
我们在阅读CAN_ESR寄存器内容时倒有个发现,即该寄存器的复位值是0x00000000。

8 T% {7 U& B& D9 {% X' Y
微信图片_20230427183952.png
  i2 [( @7 Z3 L$ S6 Q9 @+ e
也就是说,芯片每次复位后其值一定是0,自然那两个出错计数器的值也是0。可客户明确表明,不接受通过对芯片级复位的方式来实现对二者清零。
那怎么办呢?对整个芯片复位不接受,直接写又不起作用。还有别的办法吗?
其实,STM32芯片除了各种芯片级的复位外,还有专门针对各个外设模块的复位。也就是说,既然这样我们可以考虑仅针对CAN外设做复位而达到目的。客户也接受这个做法。
以STM32F4芯片为例,下面寄存器就是负责对部分APB1外设进行复位操作的控制寄存器。
; M) ~; _3 {* }. G
微信图片_20230427183948.png

- _; v8 T% m7 F- w5 q7 M- }8 |
其中,CAN1/CAN2外设就是被其中的两个控制位所管控。
" c* F2 q1 p2 {* ]
微信图片_20230427183938.png

6 h8 s% f, }& O( R$ }. H# c
我们对相应控制位置1或清零达到对外设模块强制复位或做复位释放的操作。我们不妨以这里的CAN1为例,相应的Cube库函数代码如下:
__HAL_RCC_CAN1_FORCE_RESET(); //对CAN1外设实施强制复位
__HAL_RCC_CAN1_RELEASE_RESET();//释放对CAN1外设的强制复位
这里提醒并强调下,针对外设的强制复位和复位释放指令原则上要成对使用。如果做了强制复位而不释放的话,后面的配置不保证有效。
后来,客户按照上面推荐的方法操作后,可靠有效,符合心意。我在这里将该案例分享出来,说不定哪天你能派上用场。毕竟书到用时方恨少嘛。

/ m5 _: a# }! Y* h9 v/ Y转载自: MilerShao6 D9 ?' z1 m) J5 R3 p
如有侵权请联系删除
; Z3 D, l% W* e$ s
0 U7 ?2 i9 f. r) Y* E' p* ^0 ~
赞 收藏 评论0 发布时间:2023-4-27 18:40

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版