【STM32】【暫存器】暫存器位讀寫方式配置系統時鐘

探索Embedded宇宙發表於2024-03-22

使用暫存器位的讀寫直接配置系統時鐘

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;
}

相關文章