STM32 V3.5.0版本固件口中关于RCC_GetClocksFreq()函数的一个小细节

时间:2021-07-04 16:48:13
  /* Get HCLK prescaler */
  tmp = RCC->CFGR & CFGR_HPRE_Set_Mask;   
  tmp = tmp >> 4;
  presc = APBAHBPrescTable[tmp];
  /* HCLK clock frequency */
  RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc;

static __I uint8_t APBAHBPrescTable[16] = {0, 0, 0, 0, 1, 2, 3, 4, 1, 2, 3, 4, 6, 7, 8, 9};

根据STM32中文手册,

HPRE[3:0]:AHB预分频(AHB Prescaler) 位7:4
由软件置’1’或清’0’来控制AHB时钟的预分频系数。
 0xxx:SYSCLK不分频
1000:SYSCLK 2分频     1100:SYSCLK 64分频
1001:SYSCLK 4分频     1101:SYSCLK 128分频
1010:SYSCLK 8分频     1110:SYSCLK 256分频
1011:SYSCLK 16分频   1111:SYSCLK 512分频

当HPRE[3:0]=0000~0011和1000~1111时,上述代码是没有问题的。

但是当HPRE[3:0]=0100、0101、0110和0111中的任意一个时,就有问题了。拿HPRE[3:0]=0100举例:

那么presc=APBAHBPrescTable[4],,即presc=1。也就是说,这时的SYSCLK是要2分频的,而与参考手册是不一致的。

因此,当SYSCLK不分频时,HPRE[3:0]可以设置成0000~0011中的任意一个,不能设置成0100~0111其中的任意一个。

大家有什么看法呢?