新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > stm32標(biāo)準(zhǔn)外設(shè)庫使用詳解

stm32標(biāo)準(zhǔn)外設(shè)庫使用詳解

作者: 時間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
下載代碼

stm32標(biāo)準(zhǔn)外設(shè)庫是stm32全系列芯片的外設(shè)驅(qū)動,有了它可以大大加速我們開發(fā)stm32。
首先從st公司的網(wǎng)站下載最新的庫,寫本文時最新的版本是V3.5.0。

本文引用地址:http://m.butianyuan.cn/article/201611/318073.htm

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


其中Libraries包含庫的源代碼,Project包含stm32各個外設(shè)的使用范例和一個工程模板,Utilities是使用st公司評估板的例子,stm32f10x_stdperiph_lib_um.chm教我們怎么用標(biāo)準(zhǔn)外設(shè)庫。

工程目錄結(jié)構(gòu)
既然準(zhǔn)備使用32位單片機(jī),應(yīng)該是個不小項(xiàng)目,因此工程目錄也應(yīng)該做個規(guī)劃。這里我推薦一下我所使用的目錄結(jié)構(gòu)。假設(shè)工程名字叫template,建一個名為template的文件夾,該目錄下有個3個固定文件夾doc,src,include,doc用來存放工程相關(guān)的資料文件,src放源代碼,在src下每個功能模塊一個文件夾,include放各個模塊都要使用的公共頭文件。output放編譯輸出文件,內(nèi)含兩個子文件夾obj和list。

template
doc
src
include
outputobj
list

整理庫代碼
由于Libraries下的CMSIS文件夾中很多代碼是和編譯器及芯片相關(guān)的,導(dǎo)致文件夾多且深度大,不利于工程維護(hù),實(shí)際上一個項(xiàng)目往往是用固定的編譯器和芯片,因此有必要對庫進(jìn)行整理。
在src下建立libstm32目錄
1. 把LibrariesSTM32F10x_StdPeriph_Driver下的內(nèi)容拷貝到libstm32目錄下
2. 在libstm32目錄下建立cmsis文件夾,把LibrariesCMSISCM3CoreSupport下的core_cm3.c,core_cm3.h;LibrariesCMSISCM3DeviceSupportSTSTM32F10x下的stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h拷貝到cmsis文件夾中。
3. 根據(jù)你所選的芯片類型將LibrariesCMSISCM3DeviceSupportSTSTM32F10xstartuparm下對應(yīng)的啟動文件拷貝到cmsis文件夾中。這里我拷貝的是startup_stm32f10x_hd.s(大容量型stm32芯片的啟動文件)。

下面對該庫文件做個簡單介紹:
LibrariesSTM32F10x_StdPeriph_Driver下的內(nèi)容很好理解就是stm32的各個外設(shè)模塊驅(qū)動代碼。
misc.h和misc.c是和CM3內(nèi)核有關(guān)的NVIC和SysTick的驅(qū)動代碼。
LibrariesCMSIS下是什么呢?cmsis英文全稱:Cortex Microcontroller Software Interface Standard,是Cortex系列處理器硬件抽象層,可以理解為cortex內(nèi)核的軟件接口。
core_cm3.c, core_cm3.h
它們的目錄名為CoreSupport,說明這兩個文件是CM3內(nèi)核支撐文件,其他使用CM3內(nèi)核的芯片也可以用,不一定是stm32。這兩個文件用來獲取設(shè)置CM3內(nèi)核,配置一些內(nèi)核寄存器。
stm32f10x.h, system_stm32f10x.c, system_stm32f10x.h和startup_stm32f10x_hd.s在DeviceSupport目錄下,說明這幾個文件是和具體的芯片有關(guān)的,也就是stm32芯片的支撐文件。其中stm32f10x.h是標(biāo)準(zhǔn)外設(shè)庫的入口,使用標(biāo)準(zhǔn)外設(shè)庫的代碼中必須包含該頭文件。system_stm32f10x.c, system_stm32f10x.h這兩個文件提供函數(shù)用來初始化stm32芯片,配置PLL、系統(tǒng)時鐘和內(nèi)置flash接口。startup_stm32f10x_hd.s是大容量型stm32芯片的啟動文件。

建立工程
使用keil MDK(我使用4.12版)在template目錄下建立工程,工程名為template。選一個stm32系列的芯片,哪一個都無所謂(我選的是STM32F101RC,因?yàn)槲业陌遄泳褪怯眠@個芯片),接下來要注意的是當(dāng)彈出是否拷貝啟動代碼到工程文件夾時要選No,因?yàn)闃?biāo)準(zhǔn)外設(shè)庫里已經(jīng)有啟動代碼了。
將UV4中project window里的頂層目錄名改為template,并將第一個group名改為libstm32。把libstm32目錄下所有.c和.s文件加載到工程里的libstm32。
在src下建立一個init目錄用來放置系統(tǒng)初始化代碼。把ProjectSTM32F10x_StdPeriph_Template下的stm32f10x_it.c拷貝到init文件夾中,stm32f10x_it.h,stm32f10x_conf.h拷貝到include文件夾中。
stm32f10x_it.c,stm32f10x_it.h是中斷服務(wù)程序文件。stm32f10x_conf.h是標(biāo)準(zhǔn)外設(shè)庫的配置文件,對于工程中不需要的外設(shè),可以注釋掉里面的包含的頭文件。這里我建議先僅留下stm32f10x_gpio.h,stm32f10x_rcc.h,misc.h,用到什么再打開什么,這樣編譯起來快一點(diǎn),當(dāng)然也可都留著。

使用
事實(shí)上,庫的使用在stm32f10x_stdperiph_lib_um.chm中的How to use the Library一節(jié)中已有說明,下面我把其中的步驟羅列一下:
1. 根據(jù)所選芯片,把LibrariesCMSISCM3DeviceSupportSTSTM32F10xstartuparm中的啟動代碼加到工程中,這一步在上面已經(jīng)做過了。
2. 在stm32f10x.h的66-73行,根據(jù)所選芯片類型,去掉相應(yīng)注釋,這里我去掉STM32F10X_HD行的注釋(大容量型stm32芯片)。
3. 去掉105行的USE_STDPERIPH_DRIVER注釋,啟用stm32標(biāo)準(zhǔn)外設(shè)庫。
4. 在system_stm32f10x.c的110-115行,根據(jù)所選芯片主頻,去掉相應(yīng)注釋,默認(rèn)SYSCLK_FREQ_72MHz注釋已去掉,如果你的芯片主頻是72MHz,就不用做修改了,這里我的芯片是36MHz,注釋SYSCLK_FREQ_72MHz,去掉SYSCLK_FREQ_36MHz注釋。

跑馬燈程序
現(xiàn)在可以使用stm32標(biāo)準(zhǔn)外設(shè)庫了,下面以一個簡單的跑馬燈程序說明。

在init目錄下建立main.c作為系統(tǒng)入口。

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

代碼如下:
led.h

  1. #ifndef_LED_H_
  2. #define_LED_H_
  3. #include
  4. #defineLED_00
  5. #defineLED_11
  6. #defineLED_22
  7. voidled_init(void);
  8. voidled_on(uint32_tn);
  9. voidled_off(uint32_tn);
  10. #endif

led.c

  1. #include"stm32f10x.h"
  2. #include"led.h"
  3. voidled_init(void)
  4. {
  5. GPIO_InitTypeDefGPIO_InitStructure;
  6. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
  7. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
  8. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  9. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;
  10. GPIO_Init(GPIOC,&GPIO_InitStructure);
  11. }
  12. voidled_on(uint32_tn)
  13. {
  14. switch(n)
  15. {
  16. caseLED_0:
  17. GPIO_SetBits(GPIOC,GPIO_Pin_6);
  18. break;
  19. caseLED_1:
  20. GPIO_SetBits(GPIOC,GPIO_Pin_7);
  21. break;
  22. caseLED_2:
  23. GPIO_SetBits(GPIOC,GPIO_Pin_8);
  24. break;
  25. default:
  26. break;
  27. }
  28. }
  29. voidled_off(uint32_tn)
  30. {
  31. switch(n)
  32. {
  33. caseLED_0:
  34. GPIO_ResetBits(GPIOC,GPIO_Pin_6);
  35. break;
  36. caseLED_1:
  37. GPIO_ResetBits(GPIOC,GPIO_Pin_7);
  38. break;
  39. caseLED_2:
  40. GPIO_ResetBits(GPIOC,GPIO_Pin_8);
  41. break;
  42. default:
  43. break;
  44. }
  45. }

根據(jù)不同的板子需要對該代碼中的管腳進(jìn)行修改,但結(jié)構(gòu)是一樣的。

main.c

  1. #include"led.h"
  2. staticvoiddelay(uint32_tms)
  3. {
  4. uint32_tcount=8000;
  5. while(ms--)
  6. {
  7. while(count--);
  8. count=8000;
  9. }
  10. }
  11. intmain(void)
  12. {
  13. led_init();
  14. for(;;)
  15. {
  16. led_on(LED_0);
  17. led_off(LED_1);
  18. led_off(LED_2);
  19. delay(1000);
  20. led_off(LED_0);
  21. led_on(LED_1);
  22. led_off(LED_2);
  23. delay(1000);
  24. led_off(LED_0);
  25. led_off(LED_1);
  26. led_on(LED_2);
  27. delay(1000);
  28. }
  29. }


在project中建立init,bsp組,并將各種代碼加入。在工程的Options中,c/c++選項(xiàng)卡的Include Paths中添加.include;.srclibstm32cmsis;.srclibstm32inc;.srcbsp;。
Output選項(xiàng)卡Select Folder for Objects中選.outputobj。
Listing選項(xiàng)卡Select Folder for Listings中選.outputlist。
Debug選項(xiàng)卡選use ULINK Cortex Debugger, Run to main()打鉤,這一步大家可以根據(jù)自己手上的仿真器做不同選擇。



評論


技術(shù)專區(qū)

關(guān)閉