[技术问答] 请教hc32f460系统时钟怎样配置?

[复制链接]
1811|8
 楼主| nongfuxu 发表于 2021-4-25 03:23 | 显示全部楼层 |阅读模式
本帖最后由 nongfuxu 于 2021-4-25 03:27 编辑

hc32f460启动代码如下
  1. LDR     R0, =SystemInit
  2. BLX     R0
  3. LDR     R0, =__main
  4. BX      R0


这里
  1. void SystemInit(void){
  2.     SystemCoreClockUpdate();
  3. }

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

  5.     /* Select proper HRC_VALUE according to ICG1.HRCFREQSEL bit */
  6.     /* ICG1.HRCFREQSEL = '0' represent HRC_VALUE = 20000000UL   */
  7.     /* ICG1.HRCFREQSEL = '1' represent HRC_VALUE = 16000000UL   */
  8.     if (1UL == (HRC_FREQ_MON() & 1UL))
  9.     {
  10.         HRC_VALUE = HRC_16MHz_VALUE;
  11.     }
  12.     else
  13.     {
  14.         HRC_VALUE = HRC_20MHz_VALUE;
  15.     }

  16.     tmp = M4_SYSREG->CMU_CKSWR_f.CKSW;
  17.     switch (tmp)
  18.     {
  19.         case 0x00:  /* use internal high speed RC */
  20.             SystemCoreClock = HRC_VALUE;
  21.             break;
  22.         case 0x01:  /* use internal middle speed RC */
  23.             SystemCoreClock = MRC_VALUE;
  24.             break;
  25.         case 0x02:  /* use internal low speed RC */
  26.             SystemCoreClock = LRC_VALUE;
  27.             break;
  28.         case 0x03:  /* use external high speed OSC */
  29.             SystemCoreClock = XTAL_VALUE;
  30.             break;
  31.         case 0x04:  /* use external low speed OSC */
  32.             SystemCoreClock = XTAL32_VALUE;
  33.             break;
  34.         case 0x05:  /* use MPLL */
  35.             /* PLLCLK = ((pllsrc / pllm) * plln) / pllp */
  36.             pllsource = M4_SYSREG->CMU_PLLCFGR_f.PLLSRC;
  37.             plln = M4_SYSREG->CMU_PLLCFGR_f.MPLLN;
  38.             pllp = M4_SYSREG->CMU_PLLCFGR_f.MPLLP;
  39.             pllm = M4_SYSREG->CMU_PLLCFGR_f.MPLLM;
  40.             /* use exteranl high speed OSC as PLL source */
  41.             if (0ul == pllsource)
  42.             {
  43.                 SystemCoreClock = (XTAL_VALUE) / (pllm + 1ul) * (plln + 1ul) / (pllp + 1ul);
  44.             }
  45.             /* use interanl high RC as PLL source */
  46.             else if (1ul == pllsource)
  47.             {
  48.                 SystemCoreClock = (HRC_VALUE) / (pllm + 1ul) * (plln + 1ul) / (pllp + 1ul);
  49.             }
  50.             else
  51.             {
  52.                 /* Reserved */
  53.             }
  54.             break;
  55.     }
  56. }


以下几点难以理解,请教

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

评论

取0x40010684UL地址然后给这个地址赋值  发表于 2023-1-16 14:04
 楼主| nongfuxu 发表于 2021-4-25 03:30 | 显示全部楼层
以下几点难以理解,请教

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

  2.     switch (tmp)
  3.     {
  4.         case 0x00:  /* use internal high speed RC */
  5.             SystemCoreClock = HRC_VALUE;
  6.             break;
  7.         case 0x01:  /* use internal middle speed RC */
  8.             SystemCoreClock = MRC_VALUE;
  9.             break;
  10.    ....
  11.    }

  1. #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决定。

  1.     tmp = M4_SYSREG->CMU_CKSWR_f.CKSW;
  2.     switch (tmp)
  3.     {
  4.         case 0x00:  /* use internal high speed RC */
  5.             SystemCoreClock = HRC_VALUE;
  6.             break;
  7.         case 0x01:  /* use internal middle speed RC */
  8.             SystemCoreClock = MRC_VALUE;
  9.             break;
  10.         case 0x02:  /* use internal low speed RC */
  11.             SystemCoreClock = LRC_VALUE;
  12.             break;
  13.         case 0x03:  /* use external high speed OSC */
  14.             SystemCoreClock = XTAL_VALUE;
  15.             break;
  16.         case 0x04:  /* use external low speed OSC */
  17.             SystemCoreClock = XTAL32_VALUE;
  18.             break;
  19.         case 0x05:  /* use MPLL */
  20.             /* PLLCLK = ((pllsrc / pllm) * plln) / pllp */
  21.             pllsource = M4_SYSREG->CMU_PLLCFGR_f.PLLSRC;
  22.             plln = M4_SYSREG->CMU_PLLCFGR_f.MPLLN;
  23.             pllp = M4_SYSREG->CMU_PLLCFGR_f.MPLLP;
  24.             pllm = M4_SYSREG->CMU_PLLCFGR_f.MPLLM;
  25.             /* use exteranl high speed OSC as PLL source */
  26.             if (0ul == pllsource)
  27.             {
  28.                 SystemCoreClock = (XTAL_VALUE) / (pllm + 1ul) * (plln + 1ul) / (pllp + 1ul);
  29.             }
  30.             /* use interanl high RC as PLL source */
  31.             else if (1ul == pllsource)
  32.             {
  33.                 SystemCoreClock = (HRC_VALUE) / (pllm + 1ul) * (plln + 1ul) / (pllp + 1ul);
  34.             }
  35.             else
  36.             {
  37.                 /* Reserved */
  38.             }
  39.             break;
  40.     }


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

  1. typedef struct
  2. {
  3.     uint8_t RESERVED0[12];
  4.     union
  5.     {
  6.         __IO uint16_t PWR_STPMCR;
  7.         stc_sysreg_pwr_stpmcr_field_t PWR_STPMCR_f;
  8.     };
  9.     uint8_t RESERVED1[2];
  10.     union
  11.     {
  12.         __IO uint16_t CMU_PERICKSEL;
  13.         stc_sysreg_cmu_pericksel_field_t CMU_PERICKSEL_f;
  14.     };
  15.     union
  16.     {
  17.         __IO uint16_t CMU_I2SCKSEL;
  18.         stc_sysreg_cmu_i2scksel_field_t CMU_I2SCKSEL_f;
  19.     };
  20.     union
  21.     {
  22.         __IO uint32_t PWR_RAMPC0;
  23.         stc_sysreg_pwr_rampc0_field_t PWR_RAMPC0_f;
  24.     };
  25.     __IO uint16_t PWR_RAMOPM;
  26.     uint8_t RESERVED5[2];
  27.     union
  28.     {
  29.         __IO uint32_t MPU_IPPR;
  30.         stc_sysreg_mpu_ippr_field_t MPU_IPPR_f;
  31.     };
  32.     union
  33.     {
  34.         __IO uint32_t CMU_SCFGR;
  35.         stc_sysreg_cmu_scfgr_field_t CMU_SCFGR_f;
  36.     };
  37.     union
  38.     {
  39.         __IO uint8_t CMU_UFSCKCFGR;
  40.         stc_sysreg_cmu_ufsckcfgr_field_t CMU_UFSCKCFGR_f;
  41.     };
  42.     uint8_t RESERVED8[1];
  43.     union
  44.     {
  45.         __IO uint8_t CMU_CKSWR;
  46.         stc_sysreg_cmu_ckswr_field_t CMU_CKSWR_f;
  47.     };
  48.     uint8_t RESERVED9[3];
  49.     union
  50.     {
  51.         __IO uint8_t CMU_PLLCR;
  52.         stc_sysreg_cmu_pllcr_field_t CMU_PLLCR_f;
  53.     };
  54.     uint8_t RESERVED10[3];
  55.     union
  56.     {
  57.         __IO uint8_t CMU_UPLLCR;
  58.         stc_sysreg_cmu_upllcr_field_t CMU_UPLLCR_f;
  59.     };
  60.     uint8_t RESERVED11[3];
  61.     union
  62.     {
  63.         __IO uint8_t CMU_XTALCR;
  64.         stc_sysreg_cmu_xtalcr_field_t CMU_XTALCR_f;
  65.     };
  66.     uint8_t RESERVED12[3];
  67.     union
  68.     {
  69.         __IO uint8_t CMU_HRCCR;
  70.         stc_sysreg_cmu_hrccr_field_t CMU_HRCCR_f;
  71.     };
  72.     uint8_t RESERVED13[1];
  73.     union
  74.     {
  75.         __IO uint8_t CMU_MRCCR;
  76.         stc_sysreg_cmu_mrccr_field_t CMU_MRCCR_f;
  77.     };
  78.     uint8_t RESERVED14[3];
  79.     union
  80.     {
  81.         __IO uint8_t CMU_OSCSTBSR;
  82.         stc_sysreg_cmu_oscstbsr_field_t CMU_OSCSTBSR_f;
  83.     };
  84.     union
  85.     {
  86.         __IO uint8_t CMU_MCO1CFGR;
  87.         stc_sysreg_cmu_mco1cfgr_field_t CMU_MCO1CFGR_f;
  88.     };
  89.     union
  90.     {
  91.         __IO uint8_t CMU_MCO2CFGR;
  92.         stc_sysreg_cmu_mco2cfgr_field_t CMU_MCO2CFGR_f;
  93.     };
  94.     union
  95.     {
  96.         __IO uint8_t CMU_TPIUCKCFGR;
  97.         stc_sysreg_cmu_tpiuckcfgr_field_t CMU_TPIUCKCFGR_f;
  98.     };
  99.     union
  100.     {
  101.         __IO uint8_t CMU_XTALSTDCR;
  102.         stc_sysreg_cmu_xtalstdcr_field_t CMU_XTALSTDCR_f;
  103.     };
  104.     union
  105.     {
  106.         __IO uint8_t CMU_XTALSTDSR;
  107.         stc_sysreg_cmu_xtalstdsr_field_t CMU_XTALSTDSR_f;
  108.     };
  109.     uint8_t RESERVED20[31];
  110.     __IO uint8_t CMU_MRCTRM;
  111.     __IO uint8_t CMU_HRCTRM;
  112.     uint8_t RESERVED22[63];
  113.     union
  114.     {
  115.         __IO uint8_t CMU_XTALSTBCR;
  116.         stc_sysreg_cmu_xtalstbcr_field_t CMU_XTALSTBCR_f;
  117.     };
  118.     uint8_t RESERVED23[29];
  119.     union
  120.     {
  121.         __IO uint16_t RMU_RSTF0;
  122.         stc_sysreg_rmu_rstf0_field_t RMU_RSTF0_f;
  123.     };
  124.     uint8_t RESERVED24[30];
  125.     union
  126.     {
  127.         __IO uint8_t PWR_PVDICR;
  128.         stc_sysreg_pwr_pvdicr_field_t PWR_PVDICR_f;
  129.     };
  130.     union
  131.     {
  132.         __IO uint8_t PWR_PVDDSR;
  133.         stc_sysreg_pwr_pvddsr_field_t PWR_PVDDSR_f;
  134.     };
  135.     uint8_t RESERVED26[30];
  136.     union
  137.     {
  138.         __IO uint32_t CMU_PLLCFGR;
  139.         stc_sysreg_cmu_pllcfgr_field_t CMU_PLLCFGR_f;
  140.     };
  141.     union
  142.     {
  143.         __IO uint32_t CMU_UPLLCFGR;
  144.         stc_sysreg_cmu_upllcfgr_field_t CMU_UPLLCFGR_f;
  145.     };
  146.     uint8_t RESERVED28[758];
  147.     union
  148.     {
  149.         __IO uint16_t PWR_FPRC;
  150.         stc_sysreg_pwr_fprc_field_t PWR_FPRC_f;
  151.     };
  152.     union
  153.     {
  154.         __IO uint8_t PWR_PWRC0;
  155.         stc_sysreg_pwr_pwrc0_field_t PWR_PWRC0_f;
  156.     };
  157.     union
  158.     {
  159.         __IO uint8_t PWR_PWRC1;
  160.         stc_sysreg_pwr_pwrc1_field_t PWR_PWRC1_f;
  161.     };
  162.     union
  163.     {
  164.         __IO uint8_t PWR_PWRC2;
  165.         stc_sysreg_pwr_pwrc2_field_t PWR_PWRC2_f;
  166.     };
  167.     union
  168.     {
  169.         __IO uint8_t PWR_PWRC3;
  170.         stc_sysreg_pwr_pwrc3_field_t PWR_PWRC3_f;
  171.     };
  172.     union
  173.     {
  174.         __IO uint8_t PWR_PDWKE0;
  175.         stc_sysreg_pwr_pdwke0_field_t PWR_PDWKE0_f;
  176.     };
  177.     union
  178.     {
  179.         __IO uint8_t PWR_PDWKE1;
  180.         stc_sysreg_pwr_pdwke1_field_t PWR_PDWKE1_f;
  181.     };
  182.     union
  183.     {
  184.         __IO uint8_t PWR_PDWKE2;
  185.         stc_sysreg_pwr_pdwke2_field_t PWR_PDWKE2_f;
  186.     };
  187.     union
  188.     {
  189.         __IO uint8_t PWR_PDWKES;
  190.         stc_sysreg_pwr_pdwkes_field_t PWR_PDWKES_f;
  191.     };
  192.     union
  193.     {
  194.         __IO uint8_t PWR_PDWKF0;
  195.         stc_sysreg_pwr_pdwkf0_field_t PWR_PDWKF0_f;
  196.     };
  197.     union
  198.     {
  199.         __IO uint8_t PWR_PDWKF1;
  200.         stc_sysreg_pwr_pdwkf1_field_t PWR_PDWKF1_f;
  201.     };
  202.     union
  203.     {
  204.         __IO uint8_t PWR_PWCMR;
  205.         stc_sysreg_pwr_pwcmr_field_t PWR_PWCMR_f;
  206.     };
  207.     uint8_t RESERVED40[4];
  208.     __IO uint8_t PWR_MDSWCR;
  209.     union
  210.     {
  211.         __IO uint8_t CMU_XTALCFGR;
  212.         stc_sysreg_cmu_xtalcfgr_field_t CMU_XTALCFGR_f;
  213.     };
  214.     uint8_t RESERVED42[1];
  215.     union
  216.     {
  217.         __IO uint8_t PWR_PVDCR0;
  218.         stc_sysreg_pwr_pvdcr0_field_t PWR_PVDCR0_f;
  219.     };
  220.     union
  221.     {
  222.         __IO uint8_t PWR_PVDCR1;
  223.         stc_sysreg_pwr_pvdcr1_field_t PWR_PVDCR1_f;
  224.     };
  225.     union
  226.     {
  227.         __IO uint8_t PWR_PVDFCR;
  228.         stc_sysreg_pwr_pvdfcr_field_t PWR_PVDFCR_f;
  229.     };
  230.     union
  231.     {
  232.         __IO uint8_t PWR_PVDLCR;
  233.         stc_sysreg_pwr_pvdlcr_field_t PWR_PVDLCR_f;
  234.     };
  235.     uint8_t RESERVED46[10];
  236.     union
  237.     {
  238.         __IO uint8_t CMU_XTAL32CR;
  239.         stc_sysreg_cmu_xtal32cr_field_t CMU_XTAL32CR_f;
  240.     };
  241.     union
  242.     {
  243.         __IO uint8_t CMU_XTAL32CFGR;
  244.         stc_sysreg_cmu_xtal32cfgr_field_t CMU_XTAL32CFGR_f;
  245.     };
  246.     uint8_t RESERVED48[3];
  247.     union
  248.     {
  249.         __IO uint8_t CMU_XTAL32NFR;
  250.         stc_sysreg_cmu_xtal32nfr_field_t CMU_XTAL32NFR_f;
  251.     };
  252.     uint8_t RESERVED49[1];
  253.     union
  254.     {
  255.         __IO uint8_t CMU_LRCCR;
  256.         stc_sysreg_cmu_lrccr_field_t CMU_LRCCR_f;
  257.     };
  258.     uint8_t RESERVED50[1];
  259.     __IO uint8_t CMU_LRCTRM;
  260.     uint8_t RESERVED51[1];
  261.     union
  262.     {
  263.         __IO uint8_t PWR_XTAL32CS;
  264.         stc_sysreg_pwr_xtal32cs_field_t PWR_XTAL32CS_f;
  265.     };
  266. }M4_SYSREG_TypeDef;

 楼主| nongfuxu 发表于 2021-4-25 13:17 | 显示全部楼层
不清楚在哪里定义,来选择“内部RC振荡”、“外部振荡”。
 楼主| nongfuxu 发表于 2021-4-25 22:49 | 显示全部楼层
CLK_SetSysClkSource(源);

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

  1. typedef enum en_clk_sys_source
  2. {
  3.      ClkSysSrcHRC                   = 0u,   ///< The system clock source is HRC.
  4.      ClkSysSrcMRC                   = 1u,   ///< The system clock source is MRC.
  5.      ClkSysSrcLRC                   = 2u,   ///< The system clock source is LRC.
  6.      ClkSysSrcXTAL                  = 3u,   ///< The system clock source is XTAL.
  7.      ClkSysSrcXTAL32                = 4u,   ///< The system clock source is XTAL32.
  8.      CLKSysSrcMPLL                  = 5u,   ///< The system clock source is MPLL.
  9. }en_clk_sys_source_t;
 楼主| nongfuxu 发表于 2021-4-25 23:00 | 显示全部楼层
使用锁相环后HCLK输出频率计算。
MPLL计算.rar (7.69 KB, 下载次数: 16)


33730608583dc3a684.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

417

主题

4297

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部