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

发布时间:2024-01-15  

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

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


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    ~1FFFF 输入寄存器 30001~3FFFF 保持寄存器 40001~4FFFF 举例:Modbus协议中寄存器地址从1开始,而实际存储中地址从0开始。假如要读取寄存器......
    行时,USART1->DR发生改变,那a和b的值肯定也不相等。 所以,如果你有变量是读取寄存器的值,最好也用volatile关键词修饰下。 四.最后总结 简单来说,volatile就是......
    = spich0_readwrite_byte(ECSPI3, 0XFF);  /* 读取寄存器的值          */     ICM20608_CSN(1......
    mpu6050对应i2c地址是什么_如何读取数据;  MPU6050其实就是一个 I2C 器件,里面有很多寄存器(但是我们用到的只有几个),我们通过读写寄存器来操作这个芯片。所以......
    ADxCR 寄存器 AD0CR & AD1CR 分别用于通道 0 和通道 1。它是一个 32 位寄存器。下表显示了 ADCR 寄存器的位域。 让我们看看如何配置单个寄存器 1. SEL......
    发送给从机或从机发送给主机的地址等。例如,功能码告诉从机读取寄存器的值,则数据区必须包含要读取寄存器的起始地址及读取长度。对于不同的从机,地址和数据信息都不相同。 (4)错误校验码 主机......
    ,也就是可以直接读取寄存器里面的值,而F1是秒计数寄存器的值,需要通过相关算法下才能得到时间的值。 本文提供的软件工程里面还包含一个BKP模块,主要是用于掉电保持RTC数值(第一次上电初始化RTC......
    第一个字节),如果要将数据交织存储到连续内存块中,则需要访问列。 为了避免我在上一篇内容中描述的时间跨越问题,我们需要将指令分成几个“节拍”,先读取寄存器的 [63:0] 位,然后在下一个周期读取 [127......
    内部的操作是通过将CR_LOCK_Set(宏定义的值)设置到FLASH- >CR寄存器的LOCK位,从而锁定Bank1的访问权限。具体来说,使用按位或操作符将CR_LOCK_Set设置到FLASH- >CR寄存器的LOCK位......
    值0x31,再读取寄存器0x00的值,通过Watch窗口观察变量qn8027_read_byte值为0X31.说明I2C读写正确。 如果读出的值和写入的值一致,说明I2C时序和8027硬件都没有问题。那么......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>