试试我写的代码,gd的库确实不靠谱,所以我只好参考datasheet自己写了。
官方的那个库太复杂了。我来个精简版的::lol, 使用内部HSI作为PLL时钟源,系统时钟输出为72MHz,
HSI = 8MHz, HSI / 2 * 18 = 72MHz.
GD32F150上测试OK。
- void System_Init (void)
- {
- /* [31:26] Reserved.
- [25] r PLLSTB PLL稳定标志, 0表示未稳定。
- [24] rw PLLEN = 0, PLL开关。
- [23:20] Reserved.
- [19] rw CKMEN = 0, 关闭外部时钟(HSE) monitor.
- [18] rw HSEBPS = 0, Bypass HSE.
- [17] r HSESTB 外部时钟(HSE)稳定标志, 0表示未稳定
- [16] rw HSEEN = 0, 关闭外部时钟(HSE).
- [15:8] r HSICALIB
- [7:3] rw HSIADJ
- [2] Reserved.
- [1] r HSISTB 内部时钟(HSI)稳定标志, 0表示未稳定。
- [0] rw HSIEN 打开外部时钟(HSE).
- */
- RCC->GCCR = RCC_GCCR_HSIEN; // 启用内部8MHz RC oscillator。
- while (!(RCC->GCCR & RCC_GCCR_HSISTB)); // 等待直到内部RC oscillator稳定。
- /* [31] rw PLLDV = 0, CK_OUT的输入分频系数CK_PLL divide by 2.
- [30:28] rw CKOUTDIV = 0, CK_OUT的输出分频系数。
- [26:24] rw CKOUTSRC = 0, CKOUT时钟输出PIN的输出频率(No clock selected).
- [23:22] rw USBPS = 0, USB时钟等于CK_PLL / 1.5
- [27,21:18]rw PLLMF = 0x12, PLL倍频系数是18x.
- [17] rw PLLPREDV = 0, PLL时钟源选用HSE时钟(PLLSEL=1时有效).
- [16] rw PLLSEL = 0, PLL时钟源等于HSI时钟除2(8MHz / 2)
- [15:14] rw ADCPS = 0, ADC时钟等于CK_APB2 / 2.
- [13:11] rw APB2PS = 0, APB2时钟等于CK_AHB.
- [10:8] rw APB1PS = 0, APB1时钟等于CK_AHB.
- [7:4] rw AHBPS = 0, AHB时钟等于CK_SYS.
- [3:2] r SCSS System clock switch status(Read only).
- [1:0] rw SCS = 0, CK_SYS时钟来自CK_HSI
- */
- RCC->GCFGR = 0x808000C;
- RCC->GCCR |= RCC_GCCR_PLLEN; // 启用PLL。
- while(!(RCC->GCCR & RCC_GCCR_PLLSTB)); // 等待PLL稳定。
- RCC->GCFGR |= RCC_GCFGR_SCS_PLL; // 切换CK_SYS时钟为CK_PLL
- while ((RCC->GCFGR & RCC_GCFGR_SCSS) != RCC_GCFGR_SCSS_PLL); // 等待切换完成。
- }
|