换晶振导致stm32串口数据飞码的解决办法

一般来说,stm32f107都是用标配的晶振,比如8MHz. 但是,如果用别的晶振,比如13.56M的晶振,那串口接收还正常吗?

根据试验结果,很可能会飞码。比如说用串口助手发送的是0x35,但是在串口接收中断里面就会得到别的值,即上位机发送的数据和板子接收的数据不一致。

通过查资料,解决办法如下:

修改文件stm32f10x.h,

#define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */

修改为:

#define HSE_VALUE    ((uint32_t)13560000) /*!< Value of the External oscillator in Hz */

这样,就正常了。


另外,有的网友说还需要修改一个文件:system_stm32f10x.c,修改PLL参数:


    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
修改为:  
    /*  PLL configuration: PLLCLK = HSE * 4 = 54.24MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL4);

   (因为我的SYSCLK是54.24M)


再摘抄某网友的一段话,帮助理解:

如果你仔细研究USART_Init()函数,你会发现,这个程序在配置波特率时会读取RCC有关的寄存器来计算当前CPU实际的工作频率是多少,然后计算参数来实现你需要的波特率——就是说不管你把单片机设置为什么样的工作频率,这个函数都能让串口以你要求的波特率工作。

当然如果你把原来8M的晶振换掉了,那你就需要修改系统中的一个定义:在文件stm32f10x.h中的定义HSE_Value,这参数定义了单片机使用外部晶振时钟源的频率,一般就是8000000,即使用8MHz晶振。如果你的STM32用了什么7.3728、11.0592或者25MHz晶振时,你就要修改HSE_Value定义的值,这样保证串口通信波特率正确。

posted @ 2014-02-20 17:48  漂泊的指针  阅读(469)  评论(0编辑  收藏  举报