前幾天在中移物聯網申請了一個迷你開發板,運行官方提供的程序,感受板子是正常的。可是本身寫的程序可以刷到板子上,可是串口倒是亂碼。官方和個人額程序都是用的庫函數的方式寫的。在網上,有人說庫函數默認是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 */
曾經也嘗試着自行定義 「#define HSE_VALUE ((uint32_t)12000000)」也不起做用。
後來,無心間發現,系統提供的文件,都是隻讀屬性。去掉只讀屬性,在mdk裏,鑰匙圖標沒有了,能夠修改stm32f10x.h文件了。
結論,一、「option for target」->"target"裏將Xtal(MHz)的參數僅用於模擬調試,不影響實際板卡的參數設置。系統提供的文件能夠被修改。三、在錯位的狀況下,芯片可能被超頻了。可是還能運行(沒壞)。
看似上述很少的文字,卻耗費了我幾周的業餘時間作各類驗證測試。但願可以幫助有此類問題的朋友。