Keil MDK下學習STM32注意事項

2021-07-04 10:07:29 字數 2758 閱讀 3671

摘自:

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 inte***ce standard,是cortex系列處理器硬體抽象層,可以理解為cortex核心的軟體介面。

core_cm3.c, core_cm3.h

它們的目錄名為coresupport,說明這兩個檔案是cm3核心支撐檔案,其他使用cm3核心的晶元也可以用,不一定是stm32。這兩個檔案用來獲取設定cm3核心,配置一些核心暫存器。

stm32f10x.h, system_stm32f10x.c, system_stm32f10x.h和startup_stm32f10x_hd.s在devicesupport目錄下,說明這幾個檔案是和具體的晶元有關的,也就是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「中勾選」use microlib「,否則使用printf函式會出現問題,例如會出現亂碼。

11、如果錯誤提示「expect a ")" "  

原因有可能為

(1)少寫了半個括號 ")"  

(2)輸成中文輸入法的括號 (3)定義了與巨集定義重複的變數

其中第三個最不容易發現,平常寫程式時要注意。

keil MDK開發STM32使用內聯函式

筆者在做移植時,將embest ide環境下的例程移到realview mdk的過程中,曾經遇到這樣乙個問題 在生成工程時,編譯全部通過,但在鏈結時提示許多符號未定義!如果讀者也遇到過這個問題,請繼續看下去,如果鏈結時提示未定義的變數是一些內聯函式 即使用了關鍵字 inline 那麼就是筆者遇到的問...

STM32學習筆記(3) 什麼是STM32

既然已經做好了開發stm32的準備,軟體硬體都準備好了,那麼我們來了解一下何為stm32吧。stm32是意法半導體 st 設計的一系列32位晶元的名字,細分為l f h三個系列。f系列是最經典的系列。f系列的基礎晶元是f1系列,低廉,麻雀雖小五臟俱全,我做課程設計最喜歡用的就是stm32f103c8...

STM32基礎學習

最近在學stm32,遇到了一些問題,也解決了一些,望大家糾正。韌體庫外設驅動檔案引入方法 1 加入你要加入的.c檔案 2 在path中加入你的相對應的.h 3 就是一定要將stm32f10x conf.h配置中的相對應的標頭檔案取消注釋。暫存器版本的error l6218e undefined sy...