nongfuxu 发表于 2021-4-25 03:23

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

本帖最后由 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)))

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振荡”、外部振荡。

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;
    union
    {
      __IO uint16_t PWR_STPMCR;
      stc_sysreg_pwr_stpmcr_field_t PWR_STPMCR_f;
    };
    uint8_t RESERVED1;
    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;
    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;
    union
    {
      __IO uint8_t CMU_CKSWR;
      stc_sysreg_cmu_ckswr_field_t CMU_CKSWR_f;
    };
    uint8_t RESERVED9;
    union
    {
      __IO uint8_t CMU_PLLCR;
      stc_sysreg_cmu_pllcr_field_t CMU_PLLCR_f;
    };
    uint8_t RESERVED10;
    union
    {
      __IO uint8_t CMU_UPLLCR;
      stc_sysreg_cmu_upllcr_field_t CMU_UPLLCR_f;
    };
    uint8_t RESERVED11;
    union
    {
      __IO uint8_t CMU_XTALCR;
      stc_sysreg_cmu_xtalcr_field_t CMU_XTALCR_f;
    };
    uint8_t RESERVED12;
    union
    {
      __IO uint8_t CMU_HRCCR;
      stc_sysreg_cmu_hrccr_field_t CMU_HRCCR_f;
    };
    uint8_t RESERVED13;
    union
    {
      __IO uint8_t CMU_MRCCR;
      stc_sysreg_cmu_mrccr_field_t CMU_MRCCR_f;
    };
    uint8_t RESERVED14;
    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;
    __IO uint8_t CMU_MRCTRM;
    __IO uint8_t CMU_HRCTRM;
    uint8_t RESERVED22;
    union
    {
      __IO uint8_t CMU_XTALSTBCR;
      stc_sysreg_cmu_xtalstbcr_field_t CMU_XTALSTBCR_f;
    };
    uint8_t RESERVED23;
    union
    {
      __IO uint16_t RMU_RSTF0;
      stc_sysreg_rmu_rstf0_field_t RMU_RSTF0_f;
    };
    uint8_t RESERVED24;
    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;
    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;
    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;
    __IO uint8_t PWR_MDSWCR;
    union
    {
      __IO uint8_t CMU_XTALCFGR;
      stc_sysreg_cmu_xtalcfgr_field_t CMU_XTALCFGR_f;
    };
    uint8_t RESERVED42;
    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;
    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;
    union
    {
      __IO uint8_t CMU_XTAL32NFR;
      stc_sysreg_cmu_xtal32nfr_field_t CMU_XTAL32NFR_f;
    };
    uint8_t RESERVED49;
    union
    {
      __IO uint8_t CMU_LRCCR;
      stc_sysreg_cmu_lrccr_field_t CMU_LRCCR_f;
    };
    uint8_t RESERVED50;
    __IO uint8_t CMU_LRCTRM;
    uint8_t RESERVED51;
    union
    {
      __IO uint8_t PWR_XTAL32CS;
      stc_sysreg_pwr_xtal32cs_field_t PWR_XTAL32CS_f;
    };
}M4_SYSREG_TypeDef;

nongfuxu 发表于 2021-4-25 13:17

不清楚在哪里定义,来选择“内部RC振荡”、“外部振荡”。

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;

nongfuxu 发表于 2021-4-25 23:00

使用锁相环后HCLK输出频率计算。




页: [1]
查看完整版本: 请教hc32f460系统时钟怎样配置?