良许Linux教程网 干货合集 STM32片上外设时钟使能、失能和复位的区别

STM32片上外设时钟使能、失能和复位的区别

今天我要分享一些关于时钟的知识,这可能是很多人之前没有注意到的内容。这也是之前有人问过的问题,所以在这里简单给大家普及一下。

1. RCC时钟说明

在STM32的参考手册中,有一个关于Reset and Clock Control(RCC)复位和时钟控制的章节。

在这个章节中,有两类寄存器:外设复位寄存器(Peripheral Reset Register,RSTR)和外设时钟使能寄存器(Peripheral Clock Enable Register,ENR)。

以STM32F1为例,参考手册中显示的寄存器如下图所示:

image-20231230213247546
image-20231230213247546

一种是控制外设时钟的寄存器,一种是复位外设的寄存器。

2外设时钟使能和失能

我们都知道,配置STM32外设,会先开启对应的时钟(也就是使能外设时钟)。

比如使能USART1时钟:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

失能USART1时钟:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE);

我之前分享过一篇文章《关于STM32时钟配置的那些坑》,里面有说:为什么我们要先开启STM32外设时钟。

从时钟使能和失能来说,这里再简单总结一下:使能外设时钟,我们就可以操作(读写)对应的外设;失能外设时钟,则我们无法操作对应的外设

所以说,我们要操作外设,就必须要先开启(使能)其外设时钟。

3复位外设

复位外设相信大部分朋友都能理解,如果使用寄存器开发过的朋友,更应该明白。

简单来说,复位外设就是恢复外设所有寄存器为上电默认值,也可以说复位了我们的配置

可能有些地方你会也会发现xx外设配置之前有“重新初始化”外设的操作,如:

USART_DeInit(USART1);

DMA_DeInit(DMA1_Channel1);

这重新初始化代码里面,其实就是调用了复位外设代码。

4失能外设时钟和复位外设会对外设有何影响

上面说了失能外设时钟,我们就不能操作外设了。那么复位外设,我们还能操作外设吗?外设的时钟也会被复位吗?

可能许多人没有深入分析过,我这里简单总结一下:

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标准外设库。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部