<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > stm32標準外設(shè)庫使用詳解

          stm32標準外設(shè)庫使用詳解

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

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

          本文引用地址:http://www.ex-cimer.com/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教我們怎么用標準外設(shè)庫。

          工程目錄結(jié)構(gòu)
          既然準備使用32位單片機,應(yī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)致文件夾多且深度大,不利于工程維護,實際上一個項目往往是用固定的編譯器和芯片,因此有必要對庫進行整理。
          在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是標準外設(shè)庫的入口,使用標準外設(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,因為我的板子就是用這個芯片),接下來要注意的是當彈出是否拷貝啟動代碼到工程文件夾時要選No,因為標準外設(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是標準外設(shè)庫的配置文件,對于工程中不需要的外設(shè),可以注釋掉里面的包含的頭文件。這里我建議先僅留下stm32f10x_gpio.h,stm32f10x_rcc.h,misc.h,用到什么再打開什么,這樣編譯起來快一點,當然也可都留著。

          使用
          事實上,庫的使用在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標準外設(shè)庫。
          4. 在system_stm32f10x.c的110-115行,根據(jù)所選芯片主頻,去掉相應(yīng)注釋,默認SYSCLK_FREQ_72MHz注釋已去掉,如果你的芯片主頻是72MHz,就不用做修改了,這里我的芯片是36MHz,注釋SYSCLK_FREQ_72MHz,去掉SYSCLK_FREQ_36MHz注釋。

          跑馬燈程序
          現(xiàn)在可以使用stm32標準外設(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ù)不同的板子需要對該代碼中的管腳進行修改,但結(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++選項卡的Include Paths中添加.include;.srclibstm32cmsis;.srclibstm32inc;.srcbsp;。
          Output選項卡Select Folder for Objects中選.outputobj。
          Listing選項卡Select Folder for Listings中選.outputlist。
          Debug選項卡選use ULINK Cortex Debugger, Run to main()打鉤,這一步大家可以根據(jù)自己手上的仿真器做不同選擇。



          關(guān)鍵詞: stm32標準外設(shè)

          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();