这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » STM32失能时钟与复位外设有什么区别?

共2条 1/1 1 跳转至

STM32失能时钟与复位外设有什么区别?

高工
2022-09-08 11:04:55     打赏

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

在这一章节就可以看到有两类寄存器:

  • peripheral reset register(RSTR)外设复位寄存器;

  • peripheral clock enable register(ENR)外设时钟使能寄存器。

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

image.png

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

外设时钟使能和失能

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

比如使能USART1时钟:


RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

失能USART1时钟:


RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE);
昨天给大家分享了一篇文章《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标准外设库。





关键词: STM32     失能     时钟     复位     区别    

工程师
2023-07-19 10:51:21     打赏
2楼

感谢分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]