打印
[技术问答]

请教hc32f460系统时钟怎样配置?

[复制链接]
1308|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 nongfuxu 于 2021-4-25 03:27 编辑

hc32f460启动代码如下
LDR     R0, =SystemInit
BLX     R0
LDR     R0, =__main
BX      R0


这里
void SystemInit(void){
    SystemCoreClockUpdate();
}

void SystemCoreClockUpdate(void)  // Update SystemCoreClock variable
{
    uint8_t tmp = 0u;
    uint32_t plln = 19u, pllp = 1u, pllm = 0u, pllsource = 0u;

    /* Select proper HRC_VALUE according to ICG1.HRCFREQSEL bit */
    /* ICG1.HRCFREQSEL = '0' represent HRC_VALUE = 20000000UL   */
    /* ICG1.HRCFREQSEL = '1' represent HRC_VALUE = 16000000UL   */
    if (1UL == (HRC_FREQ_MON() & 1UL))
    {
        HRC_VALUE = HRC_16MHz_VALUE;
    }
    else
    {
        HRC_VALUE = HRC_20MHz_VALUE;
    }

    tmp = M4_SYSREG->CMU_CKSWR_f.CKSW;
    switch (tmp)
    {
        case 0x00:  /* use internal high speed RC */
            SystemCoreClock = HRC_VALUE;
            break;
        case 0x01:  /* use internal middle speed RC */
            SystemCoreClock = MRC_VALUE;
            break;
        case 0x02:  /* use internal low speed RC */
            SystemCoreClock = LRC_VALUE;
            break;
        case 0x03:  /* use external high speed OSC */
            SystemCoreClock = XTAL_VALUE;
            break;
        case 0x04:  /* use external low speed OSC */
            SystemCoreClock = XTAL32_VALUE;
            break;
        case 0x05:  /* use MPLL */
            /* PLLCLK = ((pllsrc / pllm) * plln) / pllp */
            pllsource = M4_SYSREG->CMU_PLLCFGR_f.PLLSRC;
            plln = M4_SYSREG->CMU_PLLCFGR_f.MPLLN;
            pllp = M4_SYSREG->CMU_PLLCFGR_f.MPLLP;
            pllm = M4_SYSREG->CMU_PLLCFGR_f.MPLLM;
            /* use exteranl high speed OSC as PLL source */
            if (0ul == pllsource)
            {
                SystemCoreClock = (XTAL_VALUE) / (pllm + 1ul) * (plln + 1ul) / (pllp + 1ul);
            }
            /* use interanl high RC as PLL source */
            else if (1ul == pllsource)
            {
                SystemCoreClock = (HRC_VALUE) / (pllm + 1ul) * (plln + 1ul) / (pllp + 1ul);
            }
            else
            {
                /* Reserved */
            }
            break;
    }
}


以下几点难以理解,请教

1、HRC_FREQ_MON()
#define HRC_FREQ_MON()                  (*((volatile unsigned int*)(0x40010684UL)))

使用特权

评论回复
评论
xisolu 2023-1-16 14:04 回复TA
取0x40010684UL地址然后给这个地址赋值 
沙发
nongfuxu|  楼主 | 2021-4-25 03:30 | 只看该作者
以下几点难以理解,请教

2、tmp = M4_SYSREG->CMU_CKSWR_f.CKSW;
    tmp = M4_SYSREG->CMU_CKSWR_f.CKSW;

    switch (tmp)
    {
        case 0x00:  /* use internal high speed RC */
            SystemCoreClock = HRC_VALUE;
            break;
        case 0x01:  /* use internal middle speed RC */
            SystemCoreClock = MRC_VALUE;
            break;
   ....
   }

#define M4_SYSREG ((M4_SYSREG_TypeDef *)0x40054000UL)


假如我想定义外部晶体时,怎样进行宏声明。

使用特权

评论回复
板凳
martinhu| | 2021-4-25 09:02 | 只看该作者
本帖最后由 martinhu 于 2021-4-25 09:03 编辑

这一大段只是获取当前系统时钟的代码,
如果你要定义外部晶振,请修改这两个宏定义
XTAL32_VALUE;
XTAL_VALUE;
至于如何使用外部晶振做初始化,驱动库里面里面很多很多例子都有的吧。看main.c……

使用特权

评论回复
地板
nongfuxu|  楼主 | 2021-4-25 13:09 | 只看该作者
martinhu 发表于 2021-4-25 09:02
这一大段只是获取当前系统时钟的代码,
如果你要定义外部晶振,请修改这两个宏定义
XTAL32_VALUE;

谢谢!

然后,还是有许多不清楚地方。  比如,怎样选择“内部RC振荡”、外部振荡。

使用特权

评论回复
5
nongfuxu|  楼主 | 2021-4-25 13:14 | 只看该作者
本帖最后由 nongfuxu 于 2021-4-25 13:16 编辑

从下面程序分析,选择振荡源是由temp决定。

    tmp = M4_SYSREG->CMU_CKSWR_f.CKSW;
    switch (tmp)
    {
        case 0x00:  /* use internal high speed RC */
            SystemCoreClock = HRC_VALUE;
            break;
        case 0x01:  /* use internal middle speed RC */
            SystemCoreClock = MRC_VALUE;
            break;
        case 0x02:  /* use internal low speed RC */
            SystemCoreClock = LRC_VALUE;
            break;
        case 0x03:  /* use external high speed OSC */
            SystemCoreClock = XTAL_VALUE;
            break;
        case 0x04:  /* use external low speed OSC */
            SystemCoreClock = XTAL32_VALUE;
            break;
        case 0x05:  /* use MPLL */
            /* PLLCLK = ((pllsrc / pllm) * plln) / pllp */
            pllsource = M4_SYSREG->CMU_PLLCFGR_f.PLLSRC;
            plln = M4_SYSREG->CMU_PLLCFGR_f.MPLLN;
            pllp = M4_SYSREG->CMU_PLLCFGR_f.MPLLP;
            pllm = M4_SYSREG->CMU_PLLCFGR_f.MPLLM;
            /* use exteranl high speed OSC as PLL source */
            if (0ul == pllsource)
            {
                SystemCoreClock = (XTAL_VALUE) / (pllm + 1ul) * (plln + 1ul) / (pllp + 1ul);
            }
            /* use interanl high RC as PLL source */
            else if (1ul == pllsource)
            {
                SystemCoreClock = (HRC_VALUE) / (pllm + 1ul) * (plln + 1ul) / (pllp + 1ul);
            }
            else
            {
                /* Reserved */
            }
            break;
    }


M4_SYSREG->CMU_CKSWR_f.CKSW结构体定义如下

typedef struct
{
    uint8_t RESERVED0[12];
    union
    {
        __IO uint16_t PWR_STPMCR;
        stc_sysreg_pwr_stpmcr_field_t PWR_STPMCR_f;
    };
    uint8_t RESERVED1[2];
    union
    {
        __IO uint16_t CMU_PERICKSEL;
        stc_sysreg_cmu_pericksel_field_t CMU_PERICKSEL_f;
    };
    union
    {
        __IO uint16_t CMU_I2SCKSEL;
        stc_sysreg_cmu_i2scksel_field_t CMU_I2SCKSEL_f;
    };
    union
    {
        __IO uint32_t PWR_RAMPC0;
        stc_sysreg_pwr_rampc0_field_t PWR_RAMPC0_f;
    };
    __IO uint16_t PWR_RAMOPM;
    uint8_t RESERVED5[2];
    union
    {
        __IO uint32_t MPU_IPPR;
        stc_sysreg_mpu_ippr_field_t MPU_IPPR_f;
    };
    union
    {
        __IO uint32_t CMU_SCFGR;
        stc_sysreg_cmu_scfgr_field_t CMU_SCFGR_f;
    };
    union
    {
        __IO uint8_t CMU_UFSCKCFGR;
        stc_sysreg_cmu_ufsckcfgr_field_t CMU_UFSCKCFGR_f;
    };
    uint8_t RESERVED8[1];
    union
    {
        __IO uint8_t CMU_CKSWR;
        stc_sysreg_cmu_ckswr_field_t CMU_CKSWR_f;
    };
    uint8_t RESERVED9[3];
    union
    {
        __IO uint8_t CMU_PLLCR;
        stc_sysreg_cmu_pllcr_field_t CMU_PLLCR_f;
    };
    uint8_t RESERVED10[3];
    union
    {
        __IO uint8_t CMU_UPLLCR;
        stc_sysreg_cmu_upllcr_field_t CMU_UPLLCR_f;
    };
    uint8_t RESERVED11[3];
    union
    {
        __IO uint8_t CMU_XTALCR;
        stc_sysreg_cmu_xtalcr_field_t CMU_XTALCR_f;
    };
    uint8_t RESERVED12[3];
    union
    {
        __IO uint8_t CMU_HRCCR;
        stc_sysreg_cmu_hrccr_field_t CMU_HRCCR_f;
    };
    uint8_t RESERVED13[1];
    union
    {
        __IO uint8_t CMU_MRCCR;
        stc_sysreg_cmu_mrccr_field_t CMU_MRCCR_f;
    };
    uint8_t RESERVED14[3];
    union
    {
        __IO uint8_t CMU_OSCSTBSR;
        stc_sysreg_cmu_oscstbsr_field_t CMU_OSCSTBSR_f;
    };
    union
    {
        __IO uint8_t CMU_MCO1CFGR;
        stc_sysreg_cmu_mco1cfgr_field_t CMU_MCO1CFGR_f;
    };
    union
    {
        __IO uint8_t CMU_MCO2CFGR;
        stc_sysreg_cmu_mco2cfgr_field_t CMU_MCO2CFGR_f;
    };
    union
    {
        __IO uint8_t CMU_TPIUCKCFGR;
        stc_sysreg_cmu_tpiuckcfgr_field_t CMU_TPIUCKCFGR_f;
    };
    union
    {
        __IO uint8_t CMU_XTALSTDCR;
        stc_sysreg_cmu_xtalstdcr_field_t CMU_XTALSTDCR_f;
    };
    union
    {
        __IO uint8_t CMU_XTALSTDSR;
        stc_sysreg_cmu_xtalstdsr_field_t CMU_XTALSTDSR_f;
    };
    uint8_t RESERVED20[31];
    __IO uint8_t CMU_MRCTRM;
    __IO uint8_t CMU_HRCTRM;
    uint8_t RESERVED22[63];
    union
    {
        __IO uint8_t CMU_XTALSTBCR;
        stc_sysreg_cmu_xtalstbcr_field_t CMU_XTALSTBCR_f;
    };
    uint8_t RESERVED23[29];
    union
    {
        __IO uint16_t RMU_RSTF0;
        stc_sysreg_rmu_rstf0_field_t RMU_RSTF0_f;
    };
    uint8_t RESERVED24[30];
    union
    {
        __IO uint8_t PWR_PVDICR;
        stc_sysreg_pwr_pvdicr_field_t PWR_PVDICR_f;
    };
    union
    {
        __IO uint8_t PWR_PVDDSR;
        stc_sysreg_pwr_pvddsr_field_t PWR_PVDDSR_f;
    };
    uint8_t RESERVED26[30];
    union
    {
        __IO uint32_t CMU_PLLCFGR;
        stc_sysreg_cmu_pllcfgr_field_t CMU_PLLCFGR_f;
    };
    union
    {
        __IO uint32_t CMU_UPLLCFGR;
        stc_sysreg_cmu_upllcfgr_field_t CMU_UPLLCFGR_f;
    };
    uint8_t RESERVED28[758];
    union
    {
        __IO uint16_t PWR_FPRC;
        stc_sysreg_pwr_fprc_field_t PWR_FPRC_f;
    };
    union
    {
        __IO uint8_t PWR_PWRC0;
        stc_sysreg_pwr_pwrc0_field_t PWR_PWRC0_f;
    };
    union
    {
        __IO uint8_t PWR_PWRC1;
        stc_sysreg_pwr_pwrc1_field_t PWR_PWRC1_f;
    };
    union
    {
        __IO uint8_t PWR_PWRC2;
        stc_sysreg_pwr_pwrc2_field_t PWR_PWRC2_f;
    };
    union
    {
        __IO uint8_t PWR_PWRC3;
        stc_sysreg_pwr_pwrc3_field_t PWR_PWRC3_f;
    };
    union
    {
        __IO uint8_t PWR_PDWKE0;
        stc_sysreg_pwr_pdwke0_field_t PWR_PDWKE0_f;
    };
    union
    {
        __IO uint8_t PWR_PDWKE1;
        stc_sysreg_pwr_pdwke1_field_t PWR_PDWKE1_f;
    };
    union
    {
        __IO uint8_t PWR_PDWKE2;
        stc_sysreg_pwr_pdwke2_field_t PWR_PDWKE2_f;
    };
    union
    {
        __IO uint8_t PWR_PDWKES;
        stc_sysreg_pwr_pdwkes_field_t PWR_PDWKES_f;
    };
    union
    {
        __IO uint8_t PWR_PDWKF0;
        stc_sysreg_pwr_pdwkf0_field_t PWR_PDWKF0_f;
    };
    union
    {
        __IO uint8_t PWR_PDWKF1;
        stc_sysreg_pwr_pdwkf1_field_t PWR_PDWKF1_f;
    };
    union
    {
        __IO uint8_t PWR_PWCMR;
        stc_sysreg_pwr_pwcmr_field_t PWR_PWCMR_f;
    };
    uint8_t RESERVED40[4];
    __IO uint8_t PWR_MDSWCR;
    union
    {
        __IO uint8_t CMU_XTALCFGR;
        stc_sysreg_cmu_xtalcfgr_field_t CMU_XTALCFGR_f;
    };
    uint8_t RESERVED42[1];
    union
    {
        __IO uint8_t PWR_PVDCR0;
        stc_sysreg_pwr_pvdcr0_field_t PWR_PVDCR0_f;
    };
    union
    {
        __IO uint8_t PWR_PVDCR1;
        stc_sysreg_pwr_pvdcr1_field_t PWR_PVDCR1_f;
    };
    union
    {
        __IO uint8_t PWR_PVDFCR;
        stc_sysreg_pwr_pvdfcr_field_t PWR_PVDFCR_f;
    };
    union
    {
        __IO uint8_t PWR_PVDLCR;
        stc_sysreg_pwr_pvdlcr_field_t PWR_PVDLCR_f;
    };
    uint8_t RESERVED46[10];
    union
    {
        __IO uint8_t CMU_XTAL32CR;
        stc_sysreg_cmu_xtal32cr_field_t CMU_XTAL32CR_f;
    };
    union
    {
        __IO uint8_t CMU_XTAL32CFGR;
        stc_sysreg_cmu_xtal32cfgr_field_t CMU_XTAL32CFGR_f;
    };
    uint8_t RESERVED48[3];
    union
    {
        __IO uint8_t CMU_XTAL32NFR;
        stc_sysreg_cmu_xtal32nfr_field_t CMU_XTAL32NFR_f;
    };
    uint8_t RESERVED49[1];
    union
    {
        __IO uint8_t CMU_LRCCR;
        stc_sysreg_cmu_lrccr_field_t CMU_LRCCR_f;
    };
    uint8_t RESERVED50[1];
    __IO uint8_t CMU_LRCTRM;
    uint8_t RESERVED51[1];
    union
    {
        __IO uint8_t PWR_XTAL32CS;
        stc_sysreg_pwr_xtal32cs_field_t PWR_XTAL32CS_f;
    };
}M4_SYSREG_TypeDef;

使用特权

评论回复
6
nongfuxu|  楼主 | 2021-4-25 13:17 | 只看该作者
不清楚在哪里定义,来选择“内部RC振荡”、“外部振荡”。

使用特权

评论回复
7
nongfuxu|  楼主 | 2021-4-25 22:49 | 只看该作者
CLK_SetSysClkSource(源);

    /* 16MHz->12MHz = Switch system clock source to XTAL. */
    CLK_SetSysClkSource(ClkSysSrcXTAL);

 typedef enum en_clk_sys_source
{
     ClkSysSrcHRC                   = 0u,   ///< The system clock source is HRC.
     ClkSysSrcMRC                   = 1u,   ///< The system clock source is MRC.
     ClkSysSrcLRC                   = 2u,   ///< The system clock source is LRC.
     ClkSysSrcXTAL                  = 3u,   ///< The system clock source is XTAL.
     ClkSysSrcXTAL32                = 4u,   ///< The system clock source is XTAL32.
     CLKSysSrcMPLL                  = 5u,   ///< The system clock source is MPLL.
}en_clk_sys_source_t;

使用特权

评论回复
8
nongfuxu|  楼主 | 2021-4-25 23:00 | 只看该作者
使用锁相环后HCLK输出频率计算。
MPLL计算.rar (7.69 KB)



使用特权

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

本版积分规则

417

主题

4293

帖子

2

粉丝