|
一般來(lái)說(shuō),stm32都是用標(biāo)配的晶振,比如8MHz.但是,如果用別的晶振,比如13.56M的晶振,那串口接收還正常嗎?
根據(jù)試驗(yàn)結(jié)果,很可能會(huì)飛碼。比如說(shuō)用串口助手發(fā)送的是0x35,但是在串口接收中斷里面就會(huì)得到別的值,即上位機(jī)發(fā)送的數(shù)據(jù)和板子接收的數(shù)據(jù)不一致。
通過(guò)查資料,解決辦法如下:
修改文件stm32f10x.h,
把
#define HSE_VALUE ((uint32_t)8000000)
修改為:
#define HSE_VALUE ((uint32_t)13560000)
這樣,就正常了。
另外,有的網(wǎng)友說(shuō)還需要修改一個(gè)文件:system_stm32f10x.c,修改PLL參數(shù):
將
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);
修改為:
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);
(因?yàn)槲业腟YSCLK是54.24M)
再摘抄某網(wǎng)友的一段話,幫助理解:
如果你仔細(xì)研究USART_Init()函數(shù),你會(huì)發(fā)現(xiàn),這個(gè)程序在配置波特率時(shí)會(huì)讀取RCC有關(guān)的寄存器來(lái)計(jì)算當(dāng)前CPU實(shí)際的工作頻率是多少,然后計(jì)算參數(shù)來(lái)實(shí)現(xiàn)你需要的波特率——就是說(shuō)不管你把單片機(jī)設(shè)置為什么樣的工作頻率,這個(gè)函數(shù)都能讓串口以你要求的波特率工作。
當(dāng)然如果你把原來(lái)8M的晶振換掉了,那你就需要修改系統(tǒng)中的一個(gè)定義:在文件stm32f10x.h中的定義HSE_Value,這參數(shù)定義了單片機(jī)使用外部晶振或時(shí)鐘源的頻率,一般就是8000000,即使用8MHz晶振。如果你的STM32用了什么7.3728、11.0592或者25MHz晶振時(shí),你就要修改HSE_Value定義的值,這樣保證串口通信波特率正確。
|
|