今天有看了下,单步调试、看寄存器值,最后发现问题出在波特率的设置上。1、USART的初始化是用的库函数,固件库版本是V1.5的,波特率设置为9600,根据波特率的计算公式:
可以算出USARTDIV的值为0x1388,单步调试时查看USART->BRR的值为0x8B,相差甚远。
2、然后在进到串口初始化的函数,
,发现BRR寄存器值的计算这个地方,有个“RCC_GetClocksFreq(&RCC_ClocksStatus);”这个函数,这个函数“If SYSCLK source is PLL, function returns constant HSE_VALUE(**)
* or HSI_VALUE(*) multiplied by the PLL factors.”,我用的是PLL时钟作为系统时钟,应该是返回系统时钟48M才对,实际上这个值只有16M。
如果按16M来算,波特率在28000左右,把波特率改成28000,收到的数据就是对的。
3、在USART初始化后,我在单独写BRR寄存器,USART1->BRR = (uint16_t)(0x1388);这样电脑接收到的数据也是对的。
4、之前用示波器量过MCO输出的时钟频率,把内部时钟关掉的话呢,输出的时钟也是对的,可以确定系统时钟是48M,正确的。
现在想不明白的就是为什么那个时钟不对呢?
|
|