使用暫存器位的讀寫直接配置系統時鐘
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;
}