版權聲明:本文為博主原創文章。
前幾天在中移物聯網申請了一個迷你開發板,運行官方提供的程序,感覺板子是正常的。但是自己寫的程序能夠刷到板子上,但是串口卻是亂碼。官方和我的額程序都是用的庫函數的方式寫的。在網上,有人說庫函數默認是8兆晶振,但是“option for target”->"target"里將Xtal(MHz)設置為12,也不起作用。
對比發現,官方的庫函數,都是在程序文件里的,mdk應該是4.X版的。我用的mdk5.X版的,后來在官網下載了5.21a的版本依然是同樣的錯誤。
我自己的程序的庫文件是從 mdk的“Manage Run-Time Environment”界面下的Device -> StdPeriph Drivers 里選擇對應文件。
這些由系統提供的文件上都有一個鎖,在編輯器里也無法修改。
在官方和我的程序里都加上 printf("3-USART1->BRR \t %d\r\n",USART1->BRR); 語句,發現
在設定波特率為115200下,官方數值為625,而我的程序為521
在設定波特率為9600下,官方數值為7500,我的程序為6250
依此判斷,還頻率的問題造成的。怎么修正還得研究。
找到 “MDK安裝目錄\ARM\PACK\Keil\STM32F1xx_DFP\2.1.0\Device\Include\stm32f10x.h”,在120行開始顯示:
#if !defined HSE_VALUE
#ifdef STM32F10X_CL
#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
#else
#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
#endif /* STM32F10X_CL */
#endif /* HSE_VALUE */
#ifdef STM32F10X_CL
#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
#else
#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
#endif /* STM32F10X_CL */
#endif /* HSE_VALUE */
曾經也嘗試着自行定義 “#define HSE_VALUE ((uint32_t)12000000)”也不起作用。
后來,無意間發現,系統提供的文件,都是只讀屬性。去掉只讀屬性,在mdk里,鑰匙圖標沒有了,可以修改stm32f10x.h文件了。
結論,1、“option for target”->"target"里將Xtal(MHz)的參數僅用於模擬調試,不影響實際板卡的參數設置。系統提供的文件可以被修改。3、在錯位的情況下,芯片可能被超頻了。但是還能運行(沒壞)。
看似上述不多的文字,卻耗費了我幾周的業余時間做各種驗證測試。希望能夠幫助有此類問題的朋友。
