天天看點

Keil MDK下學習STM32注意事項

轉自 :http://blog.sina.com.cn/s/blog_6bd352290101b7tx.html

      在MDK下學習使用STM32也快兩個禮拜了,基本掌握了STM32在MDK環境下的開發流程和基本硬體程式的書寫。其間,遇到了許多問題,其中不少問題花費了我相當多得時間才得以解決,現将這些問題和解決方法列出。其中也有一些是學習過程中我覺得需要記下的注意事項。

1、STM32固件庫使用外圍裝置的主要思路         在STM32中,外圍裝置的配置思路比較固定。首先是使能相關的時鐘,一方面是裝置本身的時鐘,另一方面如果裝置通過IO口輸出還需要使能IO口的時鐘;最後如果對應的IO口是複用功能的IO口,則還必須使能AFIO的時鐘。   其次是配置GPIO,GPIO的各種屬性由硬體手冊的AFIO一章詳細規定,較為簡單。   接着相關裝置需要如果需要使用中斷功能,必須先配置中斷優先級,後文詳述。   然後是配置外圍裝置的相關屬性,視具體裝置而定,如果裝置需要使用中斷方式,必須使能相應裝置的中斷,之後需要使能相關裝置。   最後如果裝置使用了中斷功能,則還需要填寫相應的中斷服務程式,在服務程式中進行相應操作。

2、如果在源檔案中未定義以下預定義,需在工程“C/C++”中預定義一欄 填寫 “USE_STDPERIPH_DRIVER,STM32F10X_CL(器件所屬分類),USE_STM3210C_EVAL(使用的評估闆,庫自帶的曆程中需要根據"readme"檔案提示添加,自己的工程除非是在一樣的評估闆上運作,否則不需要預定義此項)”

3、NVIC的優先級分組   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);   //這個對所有中斷有效,一個程式中隻能有一個分組  

NVIC_PriorityGroup_n中n代表4位中有n位是給中斷配置設定搶占式優先級的,4-n位是給中斷配置設定響應優先級的。

4、NVIC_InitStructure.NVIC_IRQChannel =EXTI15_10_IRQn;//其中EXTI15_10_IRQn表示選中的通道為[15:10],

不懂就跳到它的定義處看注釋

5、TIM_TimeBaseStructure.

   TIM_ClockDivision=TIM_CKD_DIV4中的TIM_ClockDivision或 控制寄存器1(TIMx_CR1)中得位CKD[1:0] 為 時鐘分頻因子 (Clock division)    為定義在定時器時鐘(CK_INT)頻率與數字濾波器(ETR ,TIx)使用的采樣頻率之間的分頻比例,與用内部時鐘時counter使用的時鐘頻率(分頻是在PSC寄存器中設定)無關。

6、下面對該庫檔案做個簡單介紹:       Libraries\STM32F10x_StdPeriph_Driver\下的内容很好了解就是stm32的各個外設子產品驅動代碼。       misc.h和misc.c是和CM3核心有關的NVIC和SysTick的驅動代碼。          Libraries\CMSIS下是什麼呢?cmsis英文全稱:Cortex Microcontroller Software Interface Standard,是Cortex系列處理器硬體抽象層,可以了解為cortex核心的軟體接口。       core_cm3.h  它們的目錄名為 CMSIS  -->  include,說明這兩個檔案是CM3核心支撐檔案,其他使用CM3核心的晶片也可以用,不一定是stm32。這兩個檔案用來擷取設定CM3核心,配置一些核心寄存器。       stm32f10x.h, system_stm32f10x.c,system_stm32f10x.h和startup_stm32f10x_hd.s,這幾個檔案是和具體的晶片有關的,也就是stm32晶片的支撐檔案。其中stm32f10x.h是标準外設庫的入口,使用标準外設庫的代碼中必須包含該頭檔案。system_stm32f10x.c,system_stm32f10x.h這兩個檔案提供函數用來初始化stm32晶片,配置PLL、系統時鐘和内置flash接口。startup_stm32f10x_hd.s是大容量型stm32晶片的啟動檔案。  

7、USER下部分檔案介紹     (1)stm32f10x_conf.h是用來添加所需外設頭檔案的,要根據需要進行更改,否則編譯會出現很多提示外設庫函數沒有定義 的錯誤。     (2)stm32f10x_it.c這是一個中斷處理檔案,_it結尾,就是interrupt(中斷)的意思,說明這個是整個工程的中斷處理函數,要是樓主沒有用到中斷的話就可以不添加進去,還有,也可以去掉,将中斷函數添加到其它.c檔案裡也行.         stm32f10x_it.h中是對中斷處理函數的聲明。     (3)System_stm32f10x.c這個檔案中定義的單片機的時鐘設定,修改時鐘設定直接修改裡面的相應宏定義即可。調用System_Init()函數時會調用這個宏定義。由于在STM32的啟動代碼中(eg.starup_stm32f10x_cl.s)就調用了System_Init()函數,是以在主函數中不需調用此函數。

8、24C02器件位址組成     八位前面4位代表器件類型,eeprom為1010,A2、A1、A0為同類型器件位址,主要看原理圖中相應位是接高還是接地。     eg.由STM32  HY-GoldBullV3開發闆的原理圖可知,24C02的A2、A1、A0腳全部接地,是以24C02的位址應為1010000_  ,最後一位表示讀還是寫。

9、在一個源檔案中調用其他檔案的函數,也需要在檔案頭聲明,不然會有警告。

10、使用序列槽出現亂碼     原因分析(1)USART設定有錯(2)系統時鐘設定有誤(3)如果使用的是MDK,使用printf()函數需要在工程屬性的“Target“-》”Code Generation“中勾選”UseMicroLIB“,否則使用printf函數會出現問題,例如會出現亂碼。

11、如果錯誤提示“expect a ")" "   原因有可能為(1)少寫了半個括号 ")"   (2)輸成中文輸入法的括号 (3)定義了與宏定義重複的變量其中第三個最不容易發現,平常寫程式時要注意。