0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

茶话MCU 来源:茶话MCU 2023-04-28 13:59 次阅读

STM32开发者用到STM32F429芯片开发产品,并用到其中的CAN外设。在CAN应用过程中有个专门针对收发出错情况进行次数统计的两个计数器,其值通过错误状态寄存器CAN_ESR中的REC[7:0]和TEC[7:0]两个字段来体现,CAN硬件会根据错误数据大小做适当响应或处理。

8a160ae4-e582-11ed-ab56-dac502259ad0.png

根据寄存器描述得知,TEC[7:0]和REC[7:0]的值在这个寄存器里面是只读的。而此时的STM32用户有个强烈的需求,就是期望能适时地对这两个出错记录字段做清零。他自己也尝试编写一些代码想让二者清零,均以失败告终,便邮件咨询有无解决办法。

我们在阅读CAN_ESR寄存器内容时倒有个发现,即该寄存器的复位值是0x00000000。

8a437dc6-e582-11ed-ab56-dac502259ad0.png

也就是说,芯片每次复位后其值一定是0,自然那两个出错计数器的值也是0。可客户明确表明,不接受通过对芯片级复位的方式来实现对二者清零。

那怎么办呢?对整个芯片复位不接受,直接写又不起作用。还有别的办法吗?

其实,STM32芯片除了各种芯片级的复位外,还有专门针对各个外设模块的复位。也就是说,既然这样我们可以考虑仅针对CAN外设做复位而达到目的。客户也接受这个做法。

以STM32F4芯片为例,下面寄存器就是负责对部分APB1外设进行复位操作的控制寄存器。

8a53279e-e582-11ed-ab56-dac502259ad0.png

其中,CAN1/CAN2外设就是被其中的两个控制位所管控。

8a68335a-e582-11ed-ab56-dac502259ad0.png

我们对相应控制位置1或清零达到对外设模块强制复位或做复位释放的操作。我们不妨以这里的CAN1为例,相应的Cube库函数代码如下:

__HAL_RCC_CAN1_FORCE_RESET(); //对CAN1外设实施强制复位

__HAL_RCC_CAN1_RELEASE_RESET();//释放对CAN1外设的强制复位

这里提醒并强调下,针对外设的强制复位和复位释放指令原则上要成对使用。如果做了强制复位而不释放的话,后面的配置不保证有效。

后来,客户按照上面推荐的方法操作后,可靠有效,符合心意。我在这里将该案例分享出来,说不定哪天你能派上用场。毕竟书到用时方恨少嘛。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16017

    浏览量

    343631
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117723
  • CAN
    CAN
    +关注

    关注

    56

    文章

    2467

    浏览量

    459246
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348755
  • STM32F429
    +关注

    关注

    0

    文章

    40

    浏览量

    10322

原文标题:巧用外设复位修改只读寄存器

文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    怎么设置蜂鸟E203 soc外设的可配置寄存器读写属性?

    想请问怎么设置蜂鸟E203 soc外设的可配置寄存器读写属性?可读可写、只写、只读三种模式具体怎么设置呢?目前是默认情况,新添加的外设寄存器
    发表于 01-10 06:24

    怎么设置蜂鸟E203 soc外设的可配置寄存器读写属性?

    想请问怎么设置蜂鸟E203 soc外设的可配置寄存器读写属性?可读可写、只写、只读三种模式具体怎么设置呢?目前是默认情况,新添加的外设寄存器
    发表于 01-15 08:08

    RCC时钟控制寄存器

    RCC 时钟控制寄存器(RCC CR)RCC PLL配置寄存器(RCC PLLCFGR)RCC 时钟配置寄存器(RCC CFGR)RCC 时钟中断寄存器 (RCC CIR)RCC AH
    发表于 08-13 08:14

    如何操作外设寄存器

    如何操作外设寄存器
    发表于 02-11 06:02

    什么样的寄存器不需要复位呢?哪些寄存器是CPU能够访问的

    会比较大,所以建议在设计初期都加上复位,后面要抠面积时,再回来修改。同步复位or异步复位在电路结构上,同步复位是要比异步
    发表于 07-08 17:43

    ARM寄存器详解

    ARM有37个寄存器,其中31个通用寄存器,6个状态寄存器。   这里尤其要注意区别的是ARM自身寄存器和它的一些外设
    发表于 07-10 10:04 2647次阅读

    FPGA 调试 – 外设寄存器视图

    作为设计者,在 FPGA 设计中您可以访问众多外设器件的内部 寄存器 。一旦将FPGA设计下载到目标器件中并且代码已经运行在相应处理器上,与这些寄存器进行交互的典型方法是通过嵌入
    发表于 05-15 11:49 3017次阅读
    FPGA 调试 – <b class='flag-5'>外设</b><b class='flag-5'>寄存器</b>视图

    STM32寄存器外设驱动x_实验四

    主要介绍STM32寄存器——外设驱动,图文详情,非常合适看
    发表于 02-22 15:46 0次下载

    51单片机复位电路及复位寄存器的状态

    这是一个有关于51单片机复位电路的介绍以及复位寄存器状态的讲解,有助于我们更好的了解复位电路。
    发表于 05-09 14:16 2次下载

    STM32复位来源(寄存器版)

    一篇很简单,有必要了解的文章 - STM32复位来源(寄存器版)
    的头像 发表于 03-14 14:13 1w次阅读
    STM32<b class='flag-5'>复位</b>来源(<b class='flag-5'>寄存器</b>版)

    修改寄存器默认值的方法

    寄存器默认值,也叫复位值,是当reset或者set有效时寄存器输出的值。对于一个DFF来说,如下图,当reset为0时,Q输出0;当set为0时,Q输出为1(外部使用时保证reset与set不同时为0)。
    的头像 发表于 09-28 14:13 1047次阅读

    修改寄存器默认值的方法有哪些

    寄存器默认值,也叫复位值,是当reset或者set有效时寄存器输出的值。对于一个DFF来说,如下图,当reset为0时,Q输出0;当set为0时,Q输出为1(外部使用时保证reset与set不同时为0)。
    的头像 发表于 01-30 16:30 1755次阅读
    <b class='flag-5'>修改寄存器</b>默认值的方法有哪些

    修改寄存器默认值有几种方法?

    寄存器默认值,也叫复位值,是当reset或者set有效时寄存器输出的值。对于一个DFF来说,如下图,当reset为0时,Q输出0;当set为0时,Q输出为1(外部使用时保证reset与set不同时为0)。
    的头像 发表于 05-05 14:28 1697次阅读
    <b class='flag-5'>修改寄存器</b>默认值有几种方法?

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

    有STM32开发者用到STM32F429芯片开发产品,并用到其中的CAN外设。在CAN应用过程中有个专门针对收发出错情况进行次数统计的两个计数器,其值通过错误状态寄存器CAN_ESR中的REC
    的头像 发表于 06-21 16:11 400次阅读
    如何用<b class='flag-5'>外设</b><b class='flag-5'>复位</b><b class='flag-5'>修改</b><b class='flag-5'>只读</b><b class='flag-5'>寄存器</b>

    干货满满:ARM的内核寄存器讲解

    内核寄存器外设寄存器: 内核寄存器外设寄存器是完全不同的概念。内核
    发表于 04-17 11:47 145次阅读
    干货满满:ARM的内核<b class='flag-5'>寄存器</b>讲解