复位和时钟控制器RCC
1.HSE高速外部时钟,频率范围4~16MHz,无源晶振通过OSC_IN和OSC_OUT两个引脚接入芯片,有源晶振则从OSC_IN接入,OSC_OUT悬空。
2.PLL锁相环时钟,有两级选择器,第一级是由RCC_CFGR的PLLXTPRE选择(HSE或HSE/2)第二级由RCC_CFGR的PLLSRC选择(HSE或HSE/2或HSI/2);有一级倍频器由RCC_CFGR的PLLMUL来选择几倍频。
3.SYSCLK系统时钟,通过RCC_CFGR的SW选择时钟源(HSI,HSE,PLLCLK)
4.AHB预分频器,通过RCC_CFGR的HPRE进行分频。
5.APB1和APB2预分频器,APB1通过RCC_CFGR的PPRE1分频,最高时钟频率36MHz,APB2通过RCC_CFGR的PPRE2分频,最高时钟频率72MHz。
RCC部分寄存器
void SystemInit (void)
{
/* Reset the RCC clock configuration to the default reset state(for debug purpose) */
/* Set HSION内部高速使能 bit */
RCC->CR |= (uint32_t)0x00000001;
/* Reset SW HSI作为系统时钟, HPRE AHB预分频不分频, PPRE1 APB1不分频, PPRE2 APB2不分频, ADCPRE and MCO bits */
RCC->CFGR &= (uint32_t)0xF0FF0000;
/* Reset HSEON除能, CSSON时钟安全系统关闭 and PLLON除能 bits */
RCC->CR &= (uint32_t)0xFEF6FFFF;
/* Reset HSEBYP外部高速时钟旁路除能 bit */
RCC->CR &= (uint32_t)0xFFFBFFFF;
/* Reset PLLSRC, PLLXTPRE 选择HSE不分频, PLLMUL and USBPRE/OTGFSPRE bits */
RCC->CFGR &= (uint32_t)0xFF80FFFF;
/* Disable all interrupts and clear pending bits */
RCC->CIR = 0x009F0000;
//清除CSSF安全系统中断标志位,清除PLL就绪中断标志位PLLRDYF,清除HSE,HSI,LSE,LSI就绪中断标志位
SetSysClock();
}
static void SetSysClock(void)
{
SetSysClockTo72();
}
static void SetSysClockTo72(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ------*/
/* Enable HSE */
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
/* Wait till HSE is ready and if Time out is reached exit */
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
if ((RCC->CR & RCC_CR_HSERDY) != RESET)
{
HSEStatus = (uint32_t)0x01;
}
else
{
HSEStatus = (uint32_t)0x00;
}
if (HSEStatus == (uint32_t)0x01)
{
/* Enable Prefetch Buffer */
FLASH->ACR |= FLASH_ACR_PRFTBE;
//0x10,启用预读取缓冲区
/* Flash 2 wait state */
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
//0x03
FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;
//0x02,两个等待状态
/* HCLK = SYSCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
/* PCLK2 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
/* PCLK1 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
}
}
1.时钟控制寄存器(RCC_CR)
2.时钟配置寄存器(RCC_CFGR)
3.时钟中断寄存器(RCC_CIR)
RCC部分固件库函数
1.RCC_Delnit 通过RCC->CR, RCC->CFGR,RCC->CIR 将外设RCC寄存器重设为默认值
RCC_DeInit();
2.RCC_HSEConfig 通过RCC->CR设置外部高速晶振(HSE)
void RCC_HSEConfig(uint32_t RCC_HSE);
//RCC_HSE_OFF
//RCC_HSE_ON
//RCC_HSE_Bypass HSE晶振被外部时钟旁路
3.RCC_WaitForHSEStartUp 通过读取并判断RCC->CR,RCC->BDCR,RCC->CSR等待HSE起振
Flash部分寄存器
1.FLASH_ACR (在第一个代码片里)
下次实操
版权声明:本文为aaaaaa_xiao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。