本帖最后由 tlled 于 2022-7-2 09:08 编辑
下面通过例程来学习下时钟电路部分,使用外部16M晶振PLL输出48M内部时钟。
一、手册资料
1.1、有关RCC部分手册资料
可以产生sysclk时钟有下面5种方式选择。
1.2、使用HSE时钟PLL 产生48M时钟可以使用HSI和HSE时钟源,这里我选择使用外部的16M时钟源。
二、测试代码
参考固件库有关RCC的例程代码。
2.1、测试HCLK时钟
- void rcc_config(void)
- {
- uint8_t res = 0U;
- RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_FLASH, ENABLE); //打开FLASH时钟
- RCC_HCLK_OUT(); //通过PA04观察HCLK频率
- RCC_HSE_Enable( RCC_HSE_MODE_OSC, 16000000, RCC_HSE_DRIVER_NORMAL, RCC_HSE_FLT_CLOSE ); //开启外部高速时钟HSE,实际频率需要根据实际晶体频率进行填写
-
- RCC_PLL_Enable( RCC_PLLSOURCE_HSEOSC, 16000000, RCC_PLL_MUL_3 ); //开启PLL,PLL时钟来源为HSE
- FLASH_SetLatency(FLASH_Latency_2); //频率大于24M需要配置FlashWait=2
- res = RCC_SysClk_Switch( RCC_SYSCLKSRC_PLL ); //切换系统时钟到PLL
- if( res == 0x0U ) //切换系统时钟成功
- {
- RCC_HSI_Disable(); //切换时钟到PLL后关闭源时钟HSI
- }
- }
使用PA04输出HCLK时钟,测试输出的时钟波形:
2.2、LED灯输出测试
通过IO口来验证HCLK的正确否。
2.2.1、systick时钟配置
从手册上看,sysclk是直接连接到HCLK时钟总线上
2.2.2、systick配置代码
- #include "delay.h"
- #include "cw32f030.h"
- static u8 fac_us=0;
- static u16 fac_ms=0;
-
- void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
- {
- if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
- {
- SysTick->CTRL |= SysTick_CLKSource_HCLK;
- }
- else
- {
- SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
- }
- }
-
- void delay_init(void)
- {
- uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz;
- //SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
- SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
- fac_us=SystemCoreClock/1000000;
- fac_ms=(u16)fac_us*1000;
- }
- void delay_us(u32 nus)
- {
- u32 temp;
- SysTick->LOAD=nus*fac_us;
- SysTick->VAL=0x00;
- SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;
- do
- {
- temp=SysTick->CTRL;
- }while((temp&0x01)&&!(temp&(1<<16)));
- SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
- SysTick->VAL =0X00;
- }
- void delay_ms(u16 nms)
- {
- u32 temp;
- SysTick->LOAD=(u32)nms*fac_ms;
- SysTick->VAL =0x00;
- SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;
- do
- {
- temp=SysTick->CTRL;
- }while((temp&0x01)&&!(temp&(1<<16)));
- SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
- SysTick->VAL =0X00;
- }
2.3、主测试程序
2.3.1、测试硬件电路
使用开发板上的LED1指示灯来输出。使用的端口是PB9
2.3.2、测试住代码
在主程序中使用100ms的systick延时,来翻转PB9输出状态
- int32_t main(void)
- {
- rcc_config();
- delay_init();
- init_led();
- while (1)
- {
- led1_tog();
- delay_ms(100);
- }
- }
2.3.3、PB9输出波形
输出100ms正常,上面就是测试使用HSE产生48M过程。
|