[APM32F0] F030系统初始化文件时钟计算错误

[复制链接]
 楼主| 发表于 2024-3-21 09:26 | 显示全部楼层 |阅读模式
开了HCLK分频或者HSE分频后,system_apm32f0xx 中的时钟计算函数SystemCoreClockUpdate算出来的系统时钟是错误的。
下面两个函数应该是正常的:
uint32_t RCM_ReadSYSCLKFreq(void);
uint32_t RCM_ReadHCLKFreq(void);

APB时钟读取函数好像也是错的,按手册应该是从HCLK分频,但代码里面从SYSCLK分频。
uint32_t RCM_ReadPCLKFreq(void);

希望官方改一下,免得误导用户。
发表于 2024-3-25 10:27 | 显示全部楼层
这边沟通了我们系统开发部门的小伙伴,他们给出了回复

针对system_apm32f0xx.c的修改:

  1. void SystemCoreClockUpdate(void)
  2. {
  3.     uint32_t sysClock, pllMull, pllSource, Prescaler, plldiv;
  4.     uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};

  5.     /* Get SYSCLK source */
  6.     sysClock = RCM->CFG1_B.SCLKSWSTS;

  7.     switch (sysClock)
  8.     {
  9.         case 0:
  10.             SystemCoreClock = HSI_VALUE;
  11.             break;

  12.         /* sys clock is HSE */
  13.         case 1:
  14.             SystemCoreClock = HSE_VALUE;
  15.             break;

  16.         /* sys clock is PLL */
  17.         case 2:
  18.             pllMull = RCM->CFG1_B.PLLMULCFG + 2;
  19.             pllSource = RCM->CFG1_B.PLLSRCSEL;
  20.             plldiv = RCM->CFG2_B.PLLDIVCFG + 1;

  21.             /* PLL entry clock source is HSE */
  22.             if (pllSource == 2)
  23.             {
  24.                 SystemCoreClock = (HSE_VALUE / plldiv) * pllMull;

  25.                 /* HSE clock divided by 2 */
  26.                 if (pllSource == RCM->CFG1_B.PLLHSEPSC)
  27.                 {
  28.                     SystemCoreClock >>= 1;
  29.                 }
  30.             }
  31.             /* PLL entry clock source is HSI */
  32.             else if(pllSource == 1)
  33.             {
  34.                 SystemCoreClock = (HSI_VALUE / plldiv) * pllMull;
  35.             }
  36.             /* PLL entry clock source is HSI/2 */
  37.             else if(pllSource == 0)
  38.             {
  39.                 SystemCoreClock = ((HSI_VALUE >> 1) / plldiv) * pllMull;
  40.             }
  41.             /* PLL entry clock source is HSI48 */
  42.             else
  43.             {
  44.                 SystemCoreClock = (HSI48_VALUE / plldiv) * pllMull;
  45.             }

  46.             break;

  47.         default:
  48.             SystemCoreClock  = HSI_VALUE;
  49.             break;
  50.     }

  51.     Prescaler = AHBPrescTable[(RCM->CFG1_B.AHBPSC)];
  52.     SystemCoreClock >>= Prescaler;
  53. }



针对apm32f0xx_rcm.c的修改:

  1. uint32_t RCM_ReadPCLKFreq(void)
  2. {
  3.     uint32_t hclk, pclk, divider;
  4.     uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4};

  5.     hclk = RCM_ReadHCLKFreq();

  6.     divider = APBPrescTable[RCM->CFG1_B.APB1PSC];
  7.     pclk = hclk >> divider;

  8.     return pclk;

  9. }


之后我们会尽快更新官方文件,十分感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

326

帖子

2

粉丝
快速回复 返回顶部 返回列表