说明:
1、内部和外置时钟配置
2、各种总线时钟配置和获取
3、MCO1和MCO2配置。
==============================================================================
##### RCC规格特性 #####
==============================================================================
1、系统上电复位后,通过内部高速时钟HSI运行(主频64MHz),Flash工作在0等待周期,所有外设除了SRAM, Flash, JTAG 和 PWR,时钟都是关闭的。
这里特别注意SRAM,官方手册里面说的太笼统,这个SRAM到底是指的那个SRAM。关于这个问题,详情看此贴:链接
(1)、AHB和APB总线无分频,所有挂载这两类总线上的外设都是以HSI频率运行。
(2)、所有的GPIO都是模拟模式,除了JTAG相关的几个引脚。
2、系统上电复位后,用户需要完成以下工作
(1)、选择用于驱动系统时钟的时钟源。
(2)、配置系统时钟频率和Flash设置。
(3)、配置分频器。
(3)、使能外设时钟。
(4)、配置外设时钟源,部分外设的时钟可以不来自系统时钟,此时通过配置寄存器RCC_D1CCIPR,RCC_D2CCIP1R,RCC_D2CCIP2R 和 RCC_D3CCIPR 实现。
==============================================================================
##### RCC的局限性 #####
==============================================================================
1、使能了外设时钟后,不能立即操作对应的寄存器,要加延迟。
(1)、不同外设延迟不同。
a、如果是AHB的外设,使能了时钟后,需要等待2个AHB时钟周期才可以操作这个外设的寄存器。
b、如果是APB的外设,使能了时钟后,需要等待2个APB时钟周期才可以操作这个外设的寄存器。
当前HAL库的解决方案是在使能了外设时钟后,在搞一个读操作,算是当做延迟用。
比如下面使能GPIOA的时钟:
#define __HAL_RCC_GPIOA_CLK_ENABLE() do {
__IO uint32_t tmpreg;
SET_BIT(RCC->AHB4ENR, RCC_AHB4ENR_GPIOAEN);
/* Delay after an RCC peripheral clock enabling */
tmpreg = READ_BIT(RCC->AHB4ENR, RCC_AHB4ENR_GPIOAEN);
UNUSED(tmpreg);
} while(0) |