STM32失能时钟和复位外设的区别

在stm32参考手册中,都有reset and clock control(rcc)复位和时钟控制的章节。
在这一章节就可以看到有两类寄存器:
peripheral reset register(rstr)外设复位寄存器。
peripheral clock enable register(enr)外设时钟使能寄存器。
我们拿stm32f1参考手册为例,可以看到如下图寄存器:
一种是控制外设时钟的寄存器,一种是复位外设的寄存器。
外设时钟使能和失能
我们都知道,配置stm32外设,会先开启对应的时钟(也就是使能外设时钟)。
比如使能usart1时钟:
rcc_apb2periphclockcmd(rcc_apb2periph_usart1, enable);  
失能usart1时钟:
rcc_apb2periphclockcmd(rcc_apb2periph_usart1, disable);  
前面分享过一篇文章《stm32为什么要先开启外设时钟?》,里面有说:为什么我们要先开启stm32外设时钟。
从时钟使能和失能来说,这里再简单总结一下:使能外设时钟,我们就可以操作(读写)对应的外设;失能外设时钟,则我们无法操作对应的外设。
所以说,我们要操作外设,就必须要先开启(使能)其外设时钟。
复位外设
复位外设相信大部分朋友都能理解,如果使用寄存器开发过的朋友,更应该明白。
简单来说,复位外设就是恢复外设所有寄存器为上电默认值,也可以说复位了我们的配置。
可能有些地方你会也会发现xx外设配置之前有“重新初始化”外设的操作,如:
usart_deinit(usart1);dma_deinit(dma1_channel1);  
这重新初始化代码里面,其实就是调用了复位外设代码。
失能外设时钟和复位外设区别
上面说了失能外设时钟,我们就不能操作外设了。那么复位外设,我们还能操作外设吗?外设的时钟也会被复位吗?
可能许多人没有深入分析过,我这里简单总结一下:
1、外设时钟未使能(失能状态),不能配置(读写)外设;
2、复位外设,会复位外设的所有寄存器,但外设时钟不会被复位;
3、外设时钟使能,复位外设,再清除复位外设,可以继续配置(读写)外设。如usart1重新初始化:
rcc_apb2periphresetcmd(rcc_apb2periph_usart1, enable);rcc_apb2periphresetcmd(rcc_apb2periph_usart1, disable);usart_init(usart1, usart_initstructure);  
4、复位外设,但不清除复位外设,则不能继续配置(读写)外设。
rcc_apb2periphresetcmd(rcc_apb2periph_usart1, enable);usart_init(usart1, usart_initstructure);  
在stm32的库函数中,外设复位和清除都是成对的,所以,我们用库开发的好处,就是相对不容易犯一些错误。
因为还有很多朋友使用寄存器开发,有很多细节问题可能没有深入研究过,就不知道问题到底处在哪里。
所以,建议用寄存器开发的朋友转向使用(spl、hal或cll)库开发。如果你非要一步一步理解底层,建议使用spl标准外设库。
来源:嵌入式专栏(作者 | strongerhuang)
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理


IBM将把Anaconda以此作为推进开源AI开发的一种方式
IDS China Summit: Standardizing Data Certification Globally
国产处理器研制成功,其性能堪比Intel i5-7400
马斯克谈无人驾驶汽车:将在5到6年内开发完工
给你十个理由!别把iPhone7升级到iOS10.2
STM32失能时钟和复位外设的区别
2022年密码测评理论与关键技术前沿论坛
风电机组各零部件进行风险评估的一个示例
选择平衡混频器的几点原因
2.45G有源定向读卡器
联发科天玑9200跑分126万+ 基于台积电最新4nm工艺
氧气分析仪用于电弧增材制造3D打印机
DT5M1026系列MCU带AES、SHA算法、12位ADC、超低功耗
蓝牙成为IIoT的关键网络技术
任正非:华为应对美国的情况,最终还是华为自身要做好自强和开放
华为开发者大会发布HarmonyOS 3预览版等全新开发技术,搭载HarmonyOS的设备超过1.5亿台
英飞凌携手海拉打造安全车后盲区,助力驾驶辅助系统向低端车型普及
智能声防系统中音频控制子系统的两种设计方案的构建及实现
就在本周五!第三届中国互连技术与产业大会即将开幕
基于RAW API的UDP服务器设计