之前用的STM32F100ZCT6,代码一直没有问题,后来改为STM32F100VCT6.发现串口收发不正常,经检查发现问题出在RCC_GetClocksFreq函数,这个函数获取频率只有所设频率的一半.
代码没有变化,电路仍旧使用的是外部晶振8M.系统频率是24M.
后来仔细跟踪了一下发现问题出在一个寄存器上.
在SetSysClockTo24函数中设置CFGR代码:
#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
/* PLL configuration: = (HSE / 2) * 6 = 24 MHz */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1_Div2 | RCC_CFGR_PLLMULL6);
#else
在ZCT6上此处修改CFGR后CFGR2的最后一位也会修改为1,根据datasheet,这是它的特性.
但是在VCT6上CFGR2却没有随之变更,一直保持了0, 所以导致在函数RCC_GetClocksFreq中
#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
prediv1factor = (RCC->CFGR2 & CFGR2_PREDIV1) + 1;
/* HSE oscillator clock selected as PREDIV1 clock entry */
RCC_Clocks->SYSCLK_Frequency = (HSE_VALUE / prediv1factor) * pllmull;
#else
计算SYSCLK_Frequency出错.
请问大家有碰到这种问题吗,是电路问题还是代码问题?
注:
串口配置过程:USART_Init->RCC_GetClocksFreq
|