有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外设的强制复位
这里提醒并强调下,针对外设的强制复位和复位释放指令原则上要成对使用。如果做了强制复位而不释放的话,后面的配置不保证有效。
后来,客户按照上面推荐的方法操作后,可靠有效,符合心意。我在这里将该案例分享出来,说不定哪天你能派上用场。毕竟书到用时方恨少嘛。
关键字:STM32
引用地址:
如何用外设复位修改只读寄存器
推荐阅读最新更新时间:2024-11-11 16:23
stm32采用dma方式的ADC
# define M 3 #define N 10 uint16_t AD_Value ; void ADC_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; ADC_DeInit (ADC1 );//将外设adc1的全部寄存器设置为默认值 ADC_InitStructure .ADC_Mode =ADC_Mode_Independent ;//设置为独立ADC模式 ADC_InitStructure .ADC_ScanConvMode =ENABLE ;//adc工作在扫描模式 ADC_InitStructure .ADC_ContinuousConvMode =
[单片机]
手把手之STM32中断
●中断 中断,在单片机中占有非常重要的地位。代码默认地从上向下执行,遇到条件或者其他语句,会按照指定的地方跳转。而在单片机执行代码的过程中,难免会有一些突发的情况需要处理,这样就会打断当前的代码,待处理完突发情况之后,程序会回到被打断的地方继续执行。 ●关于STM32的中断 几乎任何一款单片机都会有中断。以STM32F407VE来说,这是一款基于Cortex-M4内核的芯片,在CM4内核中有关于中断的一些管理,在STM32芯片中也有关于中断的一些管理。因此可以总结出一条规律,STM32的中断是有两层控制器分别控制的,如果你想使用中断,那么必须同时配置内核和芯片。 ●CM4内核中断 从内核架构图可以看到,NVIC控制器来管
[单片机]
PT2272-M4--4键无线遥控器(STM32)
一、前期准备 单片机:STM32F103ZET6 开发环境:MDK5.14 库函数:标准库V3.5 PT2272-M4模块:淘宝有售 二、实验效果 三、驱动原理 PT2272-M4是5V信号输出的,所以必要找到单片机带FT脚的作为接收口。按下按键,对应的输出端口输出高电平,反之输出低电平。A,B,C,D对应D2,D0,D3和D1。 需要完整工程或者有问题的请加QQ:1002521871,验证:呵呵。 四、驱动代码 wirelesskey.h #ifndef __WIRELESS_KEY_H__ #define __WIRELESS_KEY_H__ #include stm32f10x.h #include gpi
[单片机]
STM32驱动ADC0809详解
开发环境与工具 Keil 5主芯片为 STM32F103RET6下载工具为 JLINKXCOM V2.0 串口助手PC 为 Win10 准备工作 购买 ADC0809 芯片 习惯购买元器件多买一个,方便替换验证。 因为做过一次验证之后,这个板子就没有用了,所以购买 DIP-28 宽体底座,让底座焊板子上,芯片插底座上,方便芯片的二次使用,节约成本。 PCB 打板 下图这种模块: STM32 要想驱动 ADC0809 这个芯片需要很多个引脚(不考虑复用的话,需要 16 个引脚),如果这些引脚都用杜邦线连接的话会很乱,如果哪个杜邦线再接触不好,那么对于程序的调试很不方便,所以我就采用核心板+底板的形式来实现,避
[单片机]
stm32_1.GPIO的几种模式
GPIO配置模式 输入方式 浮空输入 GPIO_Mode_IN_FLOATING 上拉GPIO_Mode_IPU 下拉GPIO_Mode_IPD 模拟输入 GPIO_Mode_AIN 输出方式 开漏输出GPIO_Mode_AF_OD 开漏复用GPIO_Mode_AF_OD 推挽式输出GPIO_Mode_Out_PP 推挽式复用功能GPIO_Mode_AF_PP 模式详解 GPIO基本结构包括输入输出寄存器、ESD静电保护二极管,和输入输出控制电路与驱动器。请注意图中右边IO口接的二极管,这是保护二极管的上拉电位,对于具有模拟输入的管脚,这里上拉到内部的3.3V电位,所以具有模拟输入的管脚不是5V容忍管脚
[单片机]
关于STM32的这几个寄存器,你知道吗?
1Flash容量寄存器 这个问题是之前有人问过,说:我的芯片被抹掉,看不清了,我怎么知道这块芯片容量大小? 解决办法: 1.通过读寄存器 在STM32的“参考手册”中有Flash size data register这么一个寄存器(一般在手册最后),明确写了寄存器的基地址。 提示:不同芯片型号,可能这个寄存器地址不同。比如F103的基地址为:0x1FFFF7E0。 是一个16位的数值,出厂写入,程序只能读取。读取方法很简单,可以如下: uint16_t Flash_size; Flash_size = *(uint16_t *)0x1FFFF7E0; 说到这里,可以参看我之前分享的一篇文章《 你的STM32
[单片机]
STM32高级开发(4)-ubuntu的简介和命令
在也许大家历经了诸多困难终于安装并设置好了系统平台。但是在新的系统下两眼一抹黑,不知道怎么用,我们接下来便来介绍一些ubuntu的基础特性、操作和终端的基础指令,来为接下来的编程开发做好铺垫。 Ubuntu GUI的基础设计理念 首先记住这个:Linux的核心思想即一切皆是文件,设备是文件,系统是文件。比如在我们插入一个USB设备,/etc的目录下多一个USB设备的文件夹。而对USB所有的操作都是通过读写这个文件进行。 可以说ubuntu的操作和显示基本上是融合了OSX 和windows两者的特性。 ubuntu下,基础的双击打开、右键是菜单,这些操作与windows和OSX基本是无异的。 窗口的放大缩小与关闭在左
[单片机]
基于STM32和CC2520的TinyOS移植方法
TinyOS系统以其组件结构模型、事件驱动、并发型等优点成为目前最受关注的无线传感器网络操作系统。但TinyOS不支持STM32和CC2 520芯片。因此在分析TinyOS基本原理、NesC编程语言实现机制及其编译过程的基础上,介绍了基于STM32和CC2520的TinyOS移植方法,完成了STM32的I/O组件、Timer组件、USART组件、SPI组件和CC2520芯片驱动的移植。在实现CC2520的基本通信功能基础上,实现简单MAC协议。最后测试了各组件的移植效果。实验测试结果表明,节点可以稳定可靠地通信。 无线传感器网络(Wireless Sensor Network,WSN)是一种应用相关的网络。需要对某些操
[单片机]