nongfuxu 发表于 2021-4-8 09:46

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

华大技术支持,你们好!
对于HC32F030芯片,怎样设置宏定义来确定芯片的系统频率。

nongfuxu 发表于 2021-4-8 09:50

对于systick,有以下代码

void SystemInit(void)
{
    M0P_SYSCTRL->RCL_CR_f.TRIM = (*((volatile uint16_t*) (0x00100C22ul)));
    M0P_SYSCTRL->RCH_CR_f.TRIM = (*((volatile uint16_t*) (0x00100C08ul)));
    SystemCoreClockUpdate();
      _HidePinInit();
}

    ///< SysTick配置,定时1s,系统时钟默认RCH 4MHz
    SysTick_Config(SystemCoreClock);    //

这里 SystemCoreClock由以下函数获得
//add clock source.
void SystemCoreClockUpdate (void) // Update SystemCoreClock variable
{
    SystemCoreClock = Sysctrl_GetHClkFreq();
}

nongfuxu 发表于 2021-4-8 09:53

容易理解,SysTick_Config(SystemCoreClock); 不管使用多少频率的晶振都产生1秒定时TICK。
那么假设已知外部晶振=16MHz,怎样配置宏定义,使得HC32F030芯片的系统时钟为48MHz呢

nongfuxu 发表于 2021-4-8 10:13

本帖最后由 nongfuxu 于 2021-4-8 10:17 编辑

找到设置系统频率代码。

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

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

nongfuxu 发表于 2021-4-8 10:17

本帖最后由 nongfuxu 于 2021-4-8 10:19 编辑

    ///< 开启需要使用的各个外设的时钟
    ///< 开启GPIO外设时钟
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
    ///< 开启FLASH外设时钟
    Sysctrl_SetPeripheralGate(SysctrlPeripheralFlash, TRUE);


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


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

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


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

   

martinhu 发表于 2021-4-8 14:08

nongfuxu 发表于 2021-4-8 10:17


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

红圆飞雪 发表于 2022-9-2 16:03

martinhu 发表于 2021-4-8 14:08
你这段是从RCH 4M倍频到PLL48M的代码,
如果是用外部的16M,首先需要修改XTH的宏定义值,在common文件夹 ...

具体改那个宏定义?

martinhu 发表于 2022-9-5 15:18

不同DDL库的名字可能不一样,你找到sysctrl的库里面看看,有可能是SYSTEM_XTH这个名字

华力电子 发表于 2022-9-5 18:11

加一下技术QQ 1593449604

sparrow054 发表于 2022-9-13 20:42

配系统时钟最重要 了

guijial511 发表于 2022-9-13 22:04

你要看懂代码和PLL倍频关系

Bowclad 发表于 2022-9-16 19:11

配置系统时钟
页: [1]
查看完整版本: 请教华大技术支持,怎样计算系统时钟频率?