| 本帖最后由 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过程。
 
 
 
 
 |