打印
[技术问答]

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

[复制链接]
2255|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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);   
   

使用特权

评论回复
5
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);

   


使用特权

评论回复
6
martinhu| | 2021-4-8 14:08 | 只看该作者

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

使用特权

评论回复
7
红圆飞雪| | 2022-9-2 16:03 | 只看该作者
martinhu 发表于 2021-4-8 14:08
你这段是从RCH 4M倍频到PLL48M的代码,
如果是用外部的16M,首先需要修改XTH的宏定义值,在common文件夹 ...

具体改那个宏定义?

使用特权

评论回复
8
martinhu| | 2022-9-5 15:18 | 只看该作者
不同DDL库的名字可能不一样,你找到sysctrl的库里面看看,有可能是SYSTEM_XTH这个名字

使用特权

评论回复
9
华力电子| | 2022-9-5 18:11 | 只看该作者
加一下技术QQ 1593449604

使用特权

评论回复
10
sparrow054| | 2022-9-13 20:42 | 只看该作者
配系统时钟最重要 了

使用特权

评论回复
11
guijial511| | 2022-9-13 22:04 | 只看该作者
你要看懂代码和PLL倍频关系

使用特权

评论回复
12
Bowclad| | 2022-9-16 19:11 | 只看该作者
配置系统时钟

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

417

主题

4293

帖子

2

粉丝