【STM32】【寄存器】寄存器位读写方式配置系统时钟

使用寄存器位的读写直接配置系统时钟

uint8_t sys_clock_set(uint32_t FrequencyDivide)	/*PLLMUL的分频系数*/
{
    uint32_t retry = 0;		//该参数用来延时
    uint8_t retval = 0;

    RCC->CR |= 0x00010000;          /* 外部高速时钟使能HSEON */

	/*结合下面的0x8000,达到执行8000次程序步的时长,变相的实现延时,如果retry执行了0xFFF0次,则报错*/
    while (retry < 0XFFF0)
    {
        __nop();

        /* 设置8000个程序步的延时,避免版本BUG */
        if (RCC->CR & (1 << 17) && retry > 0X8000)  //这里RCC_CR的第17位是HSERDY,可以检测HSE外部时钟有没有开启成功
        {
            break;
        }

        retry++;        /* 等待HSE RDY */
    }
	/*如果retry执行了0xFFF0次,则报错*/
    if (retry >= 0XFFF0)
    {
        retval = 1;     /* HSE无法就绪 */
    }
    else	/*继续配置系统时钟*/
    {
        RCC->CFGR = 0X00000400;     /* PCLK1(APB1)设置2分频; PCLK2(APB2)不分频; HCLK(AHB)不分频; */
		/*设置RCC_CFGR寄存器中第18位到21位PLLMUL的分频为plln*/
        FrequencyDivide -= 2;                  /* 抵消2个单位(因为配置值是从0010开始的, 也就是从2开始) */
        RCC->CFGR |= FrequencyDivide << 18;    /* 设置PLL值 2~16 */

        RCC->CFGR |= 1 << 16;       /* 选择HSE作为PLL的输入时钟源 */

        /* FLASH_ACR寄存器的描述详见: <<STM32F10xx闪存编程手册>> */
        FLASH->ACR = 1 << 4;        /* PRFTBE = 1 开启预取缓冲区 */
        FLASH->ACR |= 2 << 0;       /* LATENCY[2:0] = 2 FLASH两个等待周期 */

        RCC->CR |= 1 << 24;         /* PLLON = 1, 使能PLL时钟 */

        while (!(RCC->CR >> 25));   /* 等待PLL值稳定,25位为PLLRDY的值 */

        RCC->CFGR |= 2 << 0;        /* SW[1:0] = 2, 选择系统时钟源SYSCLK为PLL输出 */

        while (((RCC->CFGR >> 2) & 0X03) != 2); /* 等待PLL作为系统时钟设置成功 */
    }

    return retval;
}
posted @ 2024-03-22 09:24  探索Embedded宇宙  阅读(13)  评论(0编辑  收藏  举报