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

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

3天内不再提示

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

麦辣鸡腿堡 来源:茶话MCU 作者:茶话MCU 2023-06-21 16:11 次阅读

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外设的强制复位

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

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

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

    关注

    455

    文章

    50771

    浏览量

    423396
  • STM32
    +关注

    关注

    2270

    文章

    10897

    浏览量

    355863
  • 控制
    +关注

    关注

    4

    文章

    1011

    浏览量

    122662
收藏 人收藏

    评论

    相关推荐

    无法向外设寄存器写入数值是怎么回事?

    我使用的是 TCxxx 微控制。 我试图更改 QSPI 寄存器中的值,但无法修改外设已在 CLC 寄存器中启用。 但我无法
    发表于 05-31 07:19

    寄存器,寄存器是什么意思

    寄存器,寄存器是什么意思 寄存器定义  寄存器是中央处理内的组成部分。寄存器是有限存贮容量
    发表于 03-08 14:26 2.2w次阅读

    数据寄存器,数据寄存器是什么意思

    数据寄存器,数据寄存器是什么意思 数据寄存器数据寄存器包括累加AX、基址寄存器BX、计数
    发表于 03-08 14:38 1.3w次阅读

    ARM寄存器详解

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

    FPGA 调试 – 外设寄存器视图

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

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

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

    DSP2407片内外设寄存器定义

    DSP2407片内外设寄存器定义,有需要的下来看看
    发表于 05-06 15:29 25次下载

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

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

    STM32复位来源(寄存器版)

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

    GPIO寄存器

    ,一般高16位保留BSRR寄存器32位分为低16位BSRRL和高16位BSRRH,BSRRL配置一组IO口的16个IO口的状态(1),BSRRH配置复位状态(0)。每组GPIO端口的寄存器包括:4个32位配置
    发表于 12-08 17:06 5次下载
    GPIO<b class='flag-5'>寄存器</b>

    配置STM32寄存器控制GPIO点亮LED

    【8-15】端口配置寄存器 32位IDR 数据寄存器 32位 输入ODR 数据寄存器 32位 输出BSRR 置位/复位寄存器 32位BRR
    发表于 01-13 16:15 3次下载
    配置STM32<b class='flag-5'>寄存器</b>控制GPIO点亮LED

    修改寄存器默认值的方法

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

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

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

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

    有STM32开发者用到STM32F429芯片开发产品,并用到其中的CAN外设。在CAN应用过程中有个专门针对收发出错情况进行次数统计的两个计数,其值通过错误状态寄存器CAN_ESR中的REC[7:0]和TEC[7:0]两个字段
    的头像 发表于 04-28 13:59 778次阅读
    巧用<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 3637次阅读
    干货满满:ARM的内核<b class='flag-5'>寄存器</b>讲解