打印
[应用相关]

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

[复制链接]
604|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1
RCC时钟说明
在STM32参考手册中,都有Reset and Clock Control(RCC)复位和时钟控制的章节。

在这一章节就可以看到有两类寄存器:peripheral reset register(RSTR)外设复位寄存器和peripheral clock enable register(ENR)外设时钟使能寄存器。

我们拿STM32F1参考手册为例,可以看到如下图寄存器:

使用特权

评论回复
沙发
有何不可0365|  楼主 | 2021-1-31 22:52 | 只看该作者
一种是控制外设时钟的寄存器,一种是复位外设的寄存器。

使用特权

评论回复
板凳
有何不可0365|  楼主 | 2021-1-31 22:53 | 只看该作者
外设时钟使能和失能
我们都知道,配置STM32外设,会先开启对应的时钟(也就是使能外设时钟)。

使用特权

评论回复
地板
有何不可0365|  楼主 | 2021-1-31 22:55 | 只看该作者
比如使能USART1时钟:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

使用特权

评论回复
5
有何不可0365|  楼主 | 2021-1-31 22:56 | 只看该作者
失能USART1时钟:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE);

使用特权

评论回复
6
有何不可0365|  楼主 | 2021-1-31 22:58 | 只看该作者
为什么我们要先开启STM32外设时钟。



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



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

使用特权

评论回复
7
有何不可0365|  楼主 | 2021-1-31 22:59 | 只看该作者
复位外设
复位外设相信大部分朋友都能理解,如果使用寄存器开发过的朋友,更应该明白。

使用特权

评论回复
8
有何不可0365|  楼主 | 2021-1-31 23:00 | 只看该作者
简单来说,复位外设就是恢复外设所有寄存器为上电默认值,也可以说复位了我们的配置。

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

USART_DeInit(USART1);

DMA_DeInit(DMA1_Channel1);

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

使用特权

评论回复
9
有何不可0365|  楼主 | 2021-1-31 23:01 | 只看该作者
4

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

使用特权

评论回复
10
有何不可0365|  楼主 | 2021-1-31 23:01 | 只看该作者
可能许多人没有深入分析过,我这里简单总结一下:



1.外设时钟未使能(失能状态),不能配置(读写)外设;

使用特权

评论回复
11
有何不可0365|  楼主 | 2021-1-31 23:03 | 只看该作者
2.复位外设,会复位外设的所有寄存器,但外设时钟不会被复位;

使用特权

评论回复
12
有何不可0365|  楼主 | 2021-1-31 23:04 | 只看该作者
3.外设时钟使能,复位外设,再清除复位外设,可以继续配置(读写)外设。如USART1重新初始化:

RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE);

RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE);

USART_Init(USART1, &USART_InitStructure);

使用特权

评论回复
13
有何不可0365|  楼主 | 2021-1-31 23:05 | 只看该作者
4.复位外设,但不清除复位外设,则不能继续配置(读写)外设。

RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE);

USART_Init(USART1, &USART_InitStructure);

使用特权

评论回复
14
有何不可0365|  楼主 | 2021-1-31 23:05 | 只看该作者
在STM32的库函数中,外设复位和清除都是成对的,所以,我们用库开发的好处,就是相对不容易犯一些错误。



因为很多朋友使用寄存器开发,有很多细节问题没有深入研究过,就不知道问题到底处在哪里。



所以,建议用寄存器开发的朋友转向使用(SPL、HAL或CLL)库开发。如果你非要一步一步理解底层,建议使用SPL标准外设库。

使用特权

评论回复
15
zljiu| | 2021-2-5 23:38 | 只看该作者
分析的角度好特别

使用特权

评论回复
16
coshi| | 2021-2-5 23:41 | 只看该作者
会不会导致系统混乱啊

使用特权

评论回复
17
aoyi| | 2021-2-5 23:46 | 只看该作者
rcc的时钟源可以是什么

使用特权

评论回复
18
drer| | 2021-2-5 23:51 | 只看该作者
内容非常的不错 学习了

使用特权

评论回复
19
gwsan| | 2021-2-5 23:54 | 只看该作者
在什么情况下外设时钟复位呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

667

帖子

0

粉丝