新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > stm32標準外設庫使用詳解

        stm32標準外設庫使用詳解

        作者: 時間:2016-11-09 來源:網絡 收藏
        下載代碼

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

        本文引用地址:http://www.104case.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各個外設的使用范例和一個工程模板,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
        outputobj
        list

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

        下面對該庫文件做個簡單介紹:
        LibrariesSTM32F10x_StdPeriph_Driver下的內容很好理解就是stm32的各個外設模塊驅動代碼。
        misc.h和misc.c是和CM3內核有關的NVIC和SysTick的驅動代碼。
        LibrariesCMSIS下是什么呢?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目錄用來放置系統初始化代碼。把ProjectSTM32F10x_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,用到什么再打開什么,這樣編譯起來快一點,當然也可都留著。

        使用
        事實上,庫的使用在stm32f10x_stdperiph_lib_um.chm中的How to use the Library一節中已有說明,下面我把其中的步驟羅列一下:
        1. 根據所選芯片,把LibrariesCMSISCM3DeviceSupportSTSTM32F10xstartuparm中的啟動代碼加到工程中,這一步在上面已經做過了。
        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

        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. }

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

        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()打鉤,這一步大家可以根據自己手上的仿真器做不同選擇。



        關鍵詞: stm32標準外設

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 怀远县| 浦城县| 通江县| 原阳县| 威海市| 磴口县| 竹溪县| 高邮市| 松潘县| 牟定县| 阿拉善盟| 辽中县| 安义县| 腾冲县| 秀山| 温泉县| 南开区| 同江市| 将乐县| 济阳县| 瓮安县| 云南省| 漯河市| 新巴尔虎右旗| 盐边县| 郧西县| 定南县| 东乌珠穆沁旗| 秦皇岛市| 营山县| 青岛市| 青铜峡市| 仁化县| 吉安县| 梨树县| 连江县| 江门市| 石林| 宜都市| 金阳县| 金塔县|