在MDK下學(xué)習(xí)使用STM32也快兩個(gè)禮拜了,基本掌握了STM32在MDK環(huán)境下的開發(fā)流程和基本硬件程序的書寫。其間,遇到了許多問題,其中不少問題花費(fèi)了我相當(dāng)多得時(shí)間才得以解決,現(xiàn)將這些問題和解決方法列出。其中也有一些是學(xué)習(xí)過程中我覺得需要記下的注意事項(xiàng)。1、STM32固件庫使用外圍設(shè)備的主要思路
在STM32中,外圍設(shè)備的配置思路比較固定。首先是使能相關(guān)的時(shí)鐘,一方面是設(shè)備本身的時(shí)鐘,另一方面如果設(shè)備通過IO口輸出還需要使能IO口的時(shí)鐘;最后如果對應(yīng)的IO口是復(fù)用功能的IO口,則還必須使能AFIO的時(shí)鐘。
其次是配置GPIO,GPIO的各種屬性由硬件手冊的AFIO一章詳細(xì)規(guī)定,較為簡單。
接著相關(guān)設(shè)備需要如果需要使用中斷功能,必須先配置中斷優(yōu)先級,后文詳述。
然后是配置外圍設(shè)備的相關(guān)屬性,視具體設(shè)備而定,如果設(shè)備需要使用中斷方式,必須使能相應(yīng)設(shè)備的中斷,之后需要使能相關(guān)設(shè)備。
最后如果設(shè)備使用了中斷功能,則還需要填寫相應(yīng)的中斷服務(wù)程序,在服務(wù)程序中進(jìn)行相應(yīng)操作。
2、如果在源文件中未定義以下預(yù)定義,需在工程“C/C++”中預(yù)定義一欄 填寫
“USE_STDPERIPH_DRIVER,STM32F10X_CL(器件所屬分類),USE_STM3210C_EVAL(使用的評估板,庫自帶的歷程中需要根據(jù)"readme"文件提示添加,自己的工程除非是在一樣的評估板上運(yùn)行,否則不需要預(yù)定義此項(xiàng))”
3、NVIC的優(yōu)先級分組
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //這個(gè)對所有中斷有效,一個(gè)程序中只能有一個(gè)分組
NVIC_PriorityGroup_n中n代表4位中有n位是給中斷分配搶占式優(yōu)先級的,4-n位是給中斷分配響應(yīng)優(yōu)先級的。
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] 為 時(shí)鐘分頻因子 (Clock division)
為定義在定時(shí)器時(shí)鐘(CK_INT)頻率與數(shù)字濾波器(ETR ,TIx)使用的采樣頻率之間的分頻比例,與用內(nèi)部時(shí)鐘時(shí)counter使用的時(shí)鐘頻率(分頻是在PSC寄存器中設(shè)置)無關(guān)。
6、下面對該庫文件做個(gè)簡單介紹:
LibrariesSTM32F10x_StdPeriph_Driver下的內(nèi)容很好理解就是stm32的各個(gè)外設(shè)模塊驅(qū)動(dòng)代碼。
misc.h和misc.c是和CM3內(nèi)核有關(guān)的NVIC和SysTick的驅(qū)動(dòng)代碼。
LibrariesCMSIS下是什么呢?cmsis英文全稱:CortexMicrocontroller Software InterfaceStandard,是Cortex系列處理器硬件抽象層,可以理解為cortex內(nèi)核的軟件接口。
core_cm3.c, core_cm3.h
它們的目錄名為CoreSupport,說明這兩個(gè)文件是CM3內(nèi)核支撐文件,其他使用CM3內(nèi)核的芯片也可以用,不一定是stm32。這兩個(gè)文件用來獲取設(shè)置CM3內(nèi)核,配置一些內(nèi)核寄存器。
stm32f10x.h, system_stm32f10x.c,system_stm32f10x.h和startup_stm32f10x_hd.s在DeviceSupport目錄下,說明這幾個(gè)文件是和具體的芯片有關(guān)的,也就是stm32芯片的支撐文件。其中stm32f10x.h是標(biāo)準(zhǔn)外設(shè)庫的入口,使用標(biāo)準(zhǔn)外設(shè)庫的代碼中必須包含該頭文件。system_stm32f10x.c,system_stm32f10x.h這兩個(gè)文件提供函數(shù)用來初始化stm32芯片,配置PLL、系統(tǒng)時(shí)鐘和內(nèi)置flash接口。startup_stm32f10x_hd.s是大容量型stm32芯片的啟動(dòng)文件。
7、USER下部分文件介紹
(1)stm32f10x_conf.h是用來添加所需外設(shè)頭文件的,要根據(jù)需要進(jìn)行更改,否則編譯會(huì)出現(xiàn)很多提示外設(shè)庫函數(shù)沒有定義 的錯(cuò)誤。
(2)stm32f10x_it.c這是一個(gè)中斷處理文件,_it結(jié)尾,就是interrupt(中斷)的意思,說明這個(gè)是整個(gè)工程的中斷處理函數(shù),要是樓主沒有用到中斷的話就可以不添加進(jìn)去,還有,也可以去掉,將中斷函數(shù)添加到其它.c文件里也行.
stm32f10x_it.h中是對中斷處理函數(shù)的聲明。
(3)System_stm32f10x.c這個(gè)文件中定義的單片機(jī)的時(shí)鐘設(shè)置,修改時(shí)鐘設(shè)置直接修改里面的相應(yīng)宏定義即可。調(diào)用System_Init()函數(shù)時(shí)會(huì)調(diào)用這個(gè)宏定義。由于在STM32的啟動(dòng)代碼中(eg.starup_stm32f10x_cl.s)就調(diào)用了System_Init()函數(shù),因此在主函數(shù)中不需調(diào)用此函數(shù)。
8、24C02器件地址組成
八位前面4位代表器件類型,eeprom為1010,A2、A1、A0為同類型器件地址,主要看原理圖中相應(yīng)位是接高還是接地。
eg.由STM32HY-GoldBullV3開發(fā)板的原理圖可知,24C02的A2、A1、A0腳全部接地,所以24C02的地址應(yīng)為1010000_,最后一位表示讀還是寫。
9、在一個(gè)源文件中調(diào)用其他文件的函數(shù),也需要在文件頭聲明,不然會(huì)有警告。
10、使用串口出現(xiàn)亂碼
原因分析(1)USART設(shè)置有錯(cuò)(2)系統(tǒng)時(shí)鐘設(shè)置有誤
(3)如果使用的是MDK,使用printf()函數(shù)需要在工程屬性的“Target“-》”Code Generation“中勾選”UseMicroLIB“,否則使用printf函數(shù)會(huì)出現(xiàn)問題,例如會(huì)出現(xiàn)亂碼。
11、如果錯(cuò)誤提示“expect a ")" " 原因有可能為
(1)少寫了半個(gè)括號 ")" (2)輸成中文輸入法的括號 (3)定義了與宏定義重復(fù)的變量
其中第三個(gè)最不容易發(fā)現(xiàn),平常寫程序時(shí)要注意。
評論