[CW32F030系列] 【CW32F030CxTx StartKit测评】 外部HSE使用

[复制链接]
1484|7
 楼主| tlled 发表于 2022-7-2 09:08 | 显示全部楼层 |阅读模式
本帖最后由 tlled 于 2022-7-2 09:08 编辑

    下面通过例程来学习下时钟电路部分,使用外部16M晶振PLL输出48M内部时钟。

    一、手册资料

    1.1、有关RCC部分手册资料
    可以产生sysclk时钟有下面5种方式选择。
    002.png

    1.2、使用HSE时钟PLL    产生48M时钟可以使用HSI和HSE时钟源,这里我选择使用外部的16M时钟源。
    001.png

    二、测试代码

    参考固件库有关RCC的例程代码。

    2.1、测试HCLK时钟
  1. void rcc_config(void)
  2. {
  3.         uint8_t res = 0U;
  4.         RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_FLASH, ENABLE);   //打开FLASH时钟
  5.         RCC_HCLK_OUT();                                                         //通过PA04观察HCLK频率
  6.         RCC_HSE_Enable( RCC_HSE_MODE_OSC, 16000000, RCC_HSE_DRIVER_NORMAL, RCC_HSE_FLT_CLOSE ); //开启外部高速时钟HSE,实际频率需要根据实际晶体频率进行填写
  7.                
  8.         RCC_PLL_Enable( RCC_PLLSOURCE_HSEOSC, 16000000, RCC_PLL_MUL_3 );     //开启PLL,PLL时钟来源为HSE
  9.         FLASH_SetLatency(FLASH_Latency_2);    //频率大于24M需要配置FlashWait=2
  10.         res = RCC_SysClk_Switch( RCC_SYSCLKSRC_PLL );                        //切换系统时钟到PLL
  11.         if( res == 0x0U )                                                    //切换系统时钟成功
  12.         {
  13.                 RCC_HSI_Disable();                                               //切换时钟到PLL后关闭源时钟HSI
  14.         }
  15. }

   使用PA04输出HCLK时钟,测试输出的时钟波形:
    100.jpg

    2.2、LED灯输出测试

    通过IO口来验证HCLK的正确否。

    2.2.1、systick时钟配置
    从手册上看,sysclk是直接连接到HCLK时钟总线上
    003.png

    2.2.2、systick配置代码

  1. #include "delay.h"
  2. #include "cw32f030.h"

  3. static u8  fac_us=0;                                                                  
  4. static u16 fac_ms=0;                                                       
  5.        
  6. void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
  7. {
  8.   if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
  9.   {
  10.     SysTick->CTRL |= SysTick_CLKSource_HCLK;
  11.   }
  12.   else
  13.   {
  14.     SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
  15.   }
  16. }
  17.    
  18. void delay_init(void)
  19. {
  20.         uint32_t SystemCoreClock         = SYSCLK_FREQ_48MHz;
  21.         //SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);       
  22.         SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
  23.         fac_us=SystemCoreClock/1000000;                                  
  24.         fac_ms=(u16)fac_us*1000;                                       
  25. }                                                                    

  26. void delay_us(u32 nus)
  27. {               
  28.         u32 temp;                     
  29.         SysTick->LOAD=nus*fac_us;                                                            
  30.         SysTick->VAL=0x00;                                               
  31.         SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          
  32.         do
  33.         {
  34.                 temp=SysTick->CTRL;
  35.         }while((temp&0x01)&&!(temp&(1<<16)));                 
  36.         SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       
  37.         SysTick->VAL =0X00;                                               
  38. }

  39. void delay_ms(u16 nms)
  40. {                                     
  41.         u32 temp;                  
  42.         SysTick->LOAD=(u32)nms*fac_ms;                               
  43.         SysTick->VAL =0x00;                                                       
  44.         SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;         
  45.         do
  46.         {
  47.                 temp=SysTick->CTRL;
  48.         }while((temp&0x01)&&!(temp&(1<<16)));                  
  49.         SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       
  50.         SysTick->VAL =0X00;                                                             
  51. }

    2.3、主测试程序

    2.3.1、测试硬件电路
    使用开发板上的LED1指示灯来输出。使用的端口是PB9
    004.png
    2.3.2、测试住代码
    在主程序中使用100ms的systick延时,来翻转PB9输出状态
  1. int32_t main(void)
  2. {
  3.                 rcc_config();
  4.                 delay_init();       
  5.     init_led();

  6.     while (1)
  7.     {
  8.                                 led1_tog();
  9.                                 delay_ms(100);
  10.     }
  11. }

    2.3.3、PB9输出波形    005.jpg

    输出100ms正常,上面就是测试使用HSE产生48M过程。



七毛钱 发表于 2022-7-4 14:44 来自手机 | 显示全部楼层
所以芯源的片子好上手不
 楼主| tlled 发表于 2022-7-4 15:16 | 显示全部楼层
七毛钱 发表于 2022-7-4 14:44
所以芯源的片子好上手不

看资料结合例程,还是好上手的
jstgotodo 发表于 2022-7-9 12:10 | 显示全部楼层
还有48M内部时钟?
suzhanhua 发表于 2022-7-9 12:26 | 显示全部楼层
倍频可以到多少呢   
mmbs 发表于 2022-7-9 13:12 | 显示全部楼层
切换PLL以后,为什么会失效?  
pl202 发表于 2022-7-9 14:11 | 显示全部楼层
外部HSE不是官网的代码吗   
soodesyt 发表于 2022-9-10 20:23 | 显示全部楼层
倍频到多少呢?         
您需要登录后才可以回帖 登录 | 注册

本版积分规则

132

主题

701

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部