搜索

[技术问答] 请教华大技术支持,怎样计算系统时钟频率?

[复制链接]
438|5
 楼主 | 2021-4-8 09:46 | 显示全部楼层 |阅读模式
华大技术支持,你们好!
对于HC32F030芯片,怎样设置宏定义来确定芯片的系统频率。

使用特权

评论回复
 楼主 | 2021-4-8 09:50 | 显示全部楼层
对于systick,有以下代码

  1. void SystemInit(void)
  2. {
  3.     M0P_SYSCTRL->RCL_CR_f.TRIM = (*((volatile uint16_t*) (0x00100C22ul)));
  4.     M0P_SYSCTRL->RCH_CR_f.TRIM = (*((volatile uint16_t*) (0x00100C08ul)));
  5.     SystemCoreClockUpdate();
  6.         _HidePinInit();
  7. }
复制代码
  1.     ///< SysTick配置,定时1s,系统时钟默认RCH 4MHz
  2.     SysTick_Config(SystemCoreClock);    //
复制代码

这里 SystemCoreClock由以下函数获得
  1. //add clock source.
  2. void SystemCoreClockUpdate (void) // Update SystemCoreClock variable
  3. {
  4.     SystemCoreClock = Sysctrl_GetHClkFreq();
  5. }
复制代码

使用特权

评论回复
 楼主 | 2021-4-8 09:53 | 显示全部楼层
容易理解,SysTick_Config(SystemCoreClock); 不管使用多少频率的晶振都产生1秒定时TICK。
那么假设已知外部晶振=16MHz,怎样配置宏定义,使得HC32F030芯片的系统时钟为48MHz呢

使用特权

评论回复
 楼主 | 2021-4-8 10:13 | 显示全部楼层
本帖最后由 nongfuxu 于 2021-4-8 10:17 编辑

找到设置系统频率代码。

  1.     ///< 开启需要使用的各个外设的时钟
  2.     ///< 开启GPIO外设时钟
  3.     Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
  4.     ///< 开启FLASH外设时钟
  5.     Sysctrl_SetPeripheralGate(SysctrlPeripheralFlash, TRUE);
  6.    
  7.    
  8.     ///< 因将要倍频的PLL作为系统时钟HCLK会达到48MHz:所以此处预先设置FLASH 读等待周期为1 cycle(默认值为0 cycle)
  9.     Flash_WaitCycle(FlashWaitCycle1);
  10.    

  11.     ///< 时钟初始化前,优先设置要使用的时钟源:此处配置PLL
  12.     Sysctrl_SetRCHTrim(SysctrlRchFreq4MHz);             //PLL使用RCH作为时钟源,因此需要先设置RCH   
  13.    
  14.     stcPLLCfg.enInFreq    = SysctrlPllInFreq4_6MHz;     //RCH 4MHz
  15.     stcPLLCfg.enOutFreq   = SysctrlPllOutFreq36_48MHz;  //PLL 输出48MHz
  16.     stcPLLCfg.enPllClkSrc = SysctrlPllRch;              //输入时钟源选择RCH
  17.     stcPLLCfg.enPllMul    = SysctrlPllMul12;            //4MHz x 12 = 48MHz
  18.     Sysctrl_SetPLLFreq(&stcPLLCfg);   
  19.    
复制代码

使用特权

评论回复
 楼主 | 2021-4-8 10:17 | 显示全部楼层
本帖最后由 nongfuxu 于 2021-4-8 10:19 编辑
  1.     ///< 开启需要使用的各个外设的时钟
  2.     ///< 开启GPIO外设时钟
  3.     Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
  4.     ///< 开启FLASH外设时钟
  5.     Sysctrl_SetPeripheralGate(SysctrlPeripheralFlash, TRUE);


  6.     ///< 因将要倍频的PLL作为系统时钟HCLK会达到48MHz:所以此处预先设置FLASH 读等待周期为1 cycle(默认值为0 cycle)
  7.     Flash_WaitCycle(FlashWaitCycle1);


  8.     ///< 时钟初始化前,优先设置要使用的时钟源:此处配置PLL
  9.     Sysctrl_SetRCHTrim(SysctrlRchFreq4MHz);             //PLL使用RCH作为时钟源,因此需要先设置RCH   

  10.     stcPLLCfg.enInFreq    = SysctrlPllInFreq4_6MHz;     //RCH 4MHz
  11.     stcPLLCfg.enOutFreq   = SysctrlPllOutFreq36_48MHz;  //PLL 输出48MHz
  12.     stcPLLCfg.enPllClkSrc = SysctrlPllRch;              //输入时钟源选择RCH
  13.     stcPLLCfg.enPllMul    = SysctrlPllMul12;            //4MHz x 12 = 48MHz
  14.     Sysctrl_SetPLLFreq(&stcPLLCfg);   


  15.     ///< 选择PLL作为HCLK时钟源;
  16.     stcCfg.enClkSrc  = SysctrlClkPLL;
  17.     ///< HCLK SYSCLK/2
  18.     stcCfg.enHClkDiv = SysctrlHclkDiv1;
  19.     ///< PCLK 为HCLK/8
  20.     stcCfg.enPClkDiv = SysctrlPclkDiv1;
  21.     ///< 系统时钟初始化
  22.     Sysctrl_ClkInit(&stcCfg);

  23.    
复制代码


使用特权

评论回复
| 2021-4-8 14:08 | 显示全部楼层

你这段是从RCH 4M倍频到PLL48M的代码,
如果是用外部的16M,首先需要修改XTH的宏定义值,在common文件夹的某个头文件里
然后按照手册步骤或者sysctrl的例子切换

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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