stm32建立項目

來源:互聯網
上載者:User

標籤:style   blog   http   使用   檔案   io   2014   for   

stm32標準外設庫使用詳解

分類: stm32 2011-07-17 10:57 2233人閱讀 評論(11) 收藏 舉報

轉載請註明出處:http://blog.csdn.net/lbl1234

下載代碼

     stm32標準外設庫是stm32全系列晶片的外設驅動,有了它可以大大加速我們開發stm32。
首先從st公司的網站下載最新的stm32標準外設庫,寫本文時最新的版本是V3.5.0。

解壓該zip檔案,得到如下檔案夾和檔案
STM32F10x_StdPeriph_Lib_V3.5.0\
   _htmresc
   Libraries
   Project
   Utilities
   Release_Notes.html
   stm32f10x_stdperiph_lib_um.chm

其中Libraries包含庫的原始碼,Project包含stm32各個外設的使用範例和一個工程模板,Utilities是使用st公司評估板的例子,stm32f10x_stdperiph_lib_um.chm教我們怎麼用標準外設庫。

工程目錄結構
既然準備使用32位單片機,應該是個不小項目,因此工程目錄也應該做個規劃。這裡我推薦一下我所使用的目錄結構。假設工程名字叫template,建一個名為template的檔案夾,該目錄下有個3個固定檔案夾doc,src,include,doc用來存放工程相關的資料檔案,src放原始碼,在src下每個功能模組一個檔案夾,include放各個模組都要使用的公用標頭檔。output放編譯輸出檔案,內含兩個子檔案夾obj和list。

template\
   doc
   src
   include
   output\obj
             \list
整理庫代碼
由於Libraries下的CMSIS檔案夾中很多代碼是和編譯器及晶片相關的,導致檔案夾多且深度大,不利於工程維護,實際上一個項目往往是用固定的編譯器和晶片,因此有必要對庫進行整理。
在src下建立libstm32目錄
    1. 把Libraries\STM32F10x_StdPeriph_Driver\下的內容拷貝到libstm32目錄下
    2. 在libstm32目錄下建立cmsis檔案夾,把Libraries\CMSIS\CM3\CoreSupport\下的core_cm3.c,core_cm3.h;Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\下的stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h拷貝到cmsis檔案夾中。
    3. 根據你所選的晶片類型將Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm\下對應的開機檔案拷貝到cmsis檔案夾中。這裡我拷貝的是startup_stm32f10x_hd.s(大容量型stm32晶片的開機檔案)。

下面對該庫檔案做個簡單介紹:
    Libraries\STM32F10x_StdPeriph_Driver\下的內容很好理解就是stm32的各個外設模組驅動代碼。
    misc.h和misc.c是和CM3核心有關的NVIC和SysTick的驅動代碼。
    Libraries\CMSIS下是什麼呢?cmsis英文全稱:Cortex Microcontroller Software Interface 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晶片的開機檔案。
建立工程
使用keil MDK(我使用4.12版)在template目錄下建立工程,工程名為template。選一個stm32系列的晶片,哪一個都無所謂(我選的是STM32F101RC,因為我的板子就是用這個晶片),接下來要注意的是當彈出是否拷貝啟動代碼到工程檔案夾時要選No,因為標準外設庫裡已經有啟動代碼了。
將UV4中project window裡的頂層目錄名改為template,並將第一個group名改為libstm32。把libstm32目錄下所有.c和.s檔案載入到工程裡的libstm32。
在src下建立一個init目錄用來放置系統初始化代碼。把Project\STM32F10x_StdPeriph_Template\下的stm32f10x_it.c拷貝到init檔案夾中,stm32f10x_it.h,stm32f10x_conf.h拷貝到include檔案夾中。
    stm32f10x_it.c,stm32f10x_it.h是中斷服務程式檔案。stm32f10x_conf.h是標準外設庫的設定檔,對於工程中不需要的外設,可以注釋掉裡面的包含的標頭檔。這裡我建議先僅留下stm32f10x_gpio.h,stm32f10x_rcc.h,misc.h,用到什麼再開啟什麼,這樣編譯起來快一點,當然也可都留著。

使用stm32標準外設庫
事實上,stm32標準外設庫的使用在stm32f10x_stdperiph_lib_um.chm中的How to use the Library一節中已有說明,下面我把其中的步驟羅列一下:
1. 根據所選晶片,把Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm中的啟動代碼加到工程中,這一步在上面已經做過了。
2. 在stm32f10x.h的66-73行,根據所選晶片類型,去掉相應注釋,這裡我去掉STM32F10X_HD行的注釋(大容量型stm32晶片)。
3. 去掉105行的USE_STDPERIPH_DRIVER注釋,啟用stm32標準外設庫。
4. 在system_stm32f10x.c的110-115行,根據所選晶片主頻,去掉相應注釋,預設SYSCLK_FREQ_72MHz注釋已去掉,如果你的晶片主頻是72MHz,就不用做修改了,這裡我的晶片是36MHz,注釋SYSCLK_FREQ_72MHz,去掉SYSCLK_FREQ_36MHz注釋。

跑馬燈程式
現在可以使用stm32標準外設庫了,下面以一個簡單的跑馬燈程式說明。

在init目錄下建立main.c作為系統入口。

在src下建立一個bsp目錄用來放置板級支援代碼,建立led.c,led.h。

代碼如下:
led.h

[cpp] view plaincopyprint?

1. <span style="font-size:18px;">#ifndef _LED_H_ 

2. #define _LED_H_

3.

4. #include <stdint.h>

5.

6. #define LED_0     0

7. #define LED_1     1

8. #define LED_2     2

9.

10. void led_init(void); 

11. void led_on(uint32_t n); 

12. void led_off(uint32_t n); 

13.

14. #endif

15.

16. </span> 

led.c

[cpp] view plaincopyprint?

1. <span style="font-size:18px;">#include "stm32f10x.h"

2. #include "led.h"

3.

4. void led_init(void) 

5. { 

6.  GPIO_InitTypeDef GPIO_InitStructure; 

7.

8.  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); 

9.  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8; 

10.  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 

11.  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; 

12.  GPIO_Init(GPIOC, &GPIO_InitStructure); 

13. } 

14.

15. void led_on(uint32_t n) 

16. { 

17. switch (n) 

18.  { 

19. case LED_0: 

20.    GPIO_SetBits(GPIOC, GPIO_Pin_6); 

21. break; 

22. case LED_1: 

23.    GPIO_SetBits(GPIOC, GPIO_Pin_7); 

24. break; 

25. case LED_2: 

26.    GPIO_SetBits(GPIOC, GPIO_Pin_8); 

27. break; 

28. default: 

29. break; 

30.  } 

31. } 

32.

33. void led_off(uint32_t n) 

34. { 

35. switch (n) 

36.  { 

37. case LED_0: 

38.    GPIO_ResetBits(GPIOC, GPIO_Pin_6); 

39. break; 

40. case LED_1:                             

41.    GPIO_ResetBits(GPIOC, GPIO_Pin_7); 

42. break; 

43. case LED_2: 

44.    GPIO_ResetBits(GPIOC, GPIO_Pin_8); 

45. break; 

46. default: 

47. break; 

48.  } 

49. }</span> 

根據不同的板子需要對該代碼中的管腳進行修改,但結構是一樣的。

main.c

[cpp] view plaincopyprint?

1. <span style="font-size:18px;">#include "led.h"

2.

3. static void delay(uint32_t ms) 

4. { 

5.  uint32_t count = 8000; 

6. while (ms--) 

7.  { 

8. while (count--); 

9.   count = 8000; 

10.  } 

11. } 

12.

13. int main(void) 

14. { 

15.  led_init(); 

16.

17. for (;;) 

18.  { 

19.   led_on(LED_0); 

20.   led_off(LED_1); 

21.   led_off(LED_2); 

22.   delay(1000); 

23.

24.   led_off(LED_0); 

25.   led_on(LED_1); 

26.   led_off(LED_2); 

27.   delay(1000); 

28.

29.   led_off(LED_0); 

30.   led_off(LED_1); 

31.   led_on(LED_2);  

32.   delay(1000); 

33.  } 

34. } 

35. </span> 

在project中建立init,bsp組,並將各種代碼加入。在工程的Options中,c/c++選項卡的Include Paths中添加.\include;.\src\libstm32\cmsis;.\src\libstm32\inc;.\src\bsp;。
    Output選項卡Select Folder for Objects中選.\output\obj。
    Listing選項卡Select Folder for Listings中選.\output\list。
    Debug選項卡選use ULINK Cortex Debugger, Run to main()打鉤,這一步大家可以根據自己手上的模擬器做不同選擇。
編譯運行。
本文代碼:http://download.csdn.net/source/3448543

    --完--

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.