/* 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其中的任意一个。
大家有什么看法呢?