请教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)))
以下几点难以理解,请教
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:03 编辑
这一大段只是获取当前系统时钟的代码,
如果你要定义外部晶振,请修改这两个宏定义
XTAL32_VALUE;
XTAL_VALUE;
至于如何使用外部晶振做初始化,驱动库里面里面很多很多例子都有的吧。看main.c…… martinhu 发表于 2021-4-25 09:02
这一大段只是获取当前系统时钟的代码,
如果你要定义外部晶振,请修改这两个宏定义
XTAL32_VALUE;
谢谢!
然后,还是有许多不清楚地方。比如,怎样选择“内部RC振荡”、外部振荡。
本帖最后由 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;
不清楚在哪里定义,来选择“内部RC振荡”、“外部振荡”。 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; 使用锁相环后HCLK输出频率计算。
页:
[1]