IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)
參考博客及文檔有:
1,http://www.cnblogs.com/ele-eye/archive/2011/11/28/2266229.html
? ? ? ? 2,http://www.cnblogs.com/king-77024128/articles/2512997.html(CMSIS介紹)
? ? ? ? 3, ??http://wenku.baidu.com/link?url=2blE__GxI1lmJglihBi5xJQPolza-NMxcZqGThxwysiY80ZOe6hLl5k6mowbTN2j30WsPftFZsBe1pRt8WlCDIT7Ce5EIReo4uGCEyegh7S(IAR 新建 STM32工程)
? ? ? ? 4,http://blog.sina.com.cn/s/blog_4c8287230100f0jw.html(IAR 新建 STM32工程)
? ? ? ? 5,http://blog.sina.com.cn/s/blog_4c8287230100eznh.html(IAR使用說明)
? ? ? ? 6,http://blog.sina.com.cn/s/blog_4c8287230100f2ah.html(IAR使用說明 第一個(gè)IAR項(xiàng)目)
? ? ? ? 7,http://blog.chinaunix.net/uid-26435987-id-3073074.html(啟動代碼和bootloader的關(guān)系)
? ? ? ?建立工程之前首先應(yīng)知道IAR EW6.30版本較IAR EW6.20之前的版本有一個(gè)較大的改變。即IAR EW6.30已經(jīng)植入了Cortex-m3的內(nèi)核相關(guān)定義,所以在建立工程時(shí)就不需要添加ST庫中core_cm3.c 和 core_cm3.h 這兩個(gè)文件了。不過需在配置IAR EW選項(xiàng)是需勾選"Options - General Options - Library Configuration"界面下的Use CMSIS。如圖:
? ? ? ? ? ?建立工程前先介紹下相關(guān)文件夾及源文件:
? ? ? ? ?CMSIS:ARM定制的一個(gè)Cortex_M系列微控制器軟件接口標(biāo)準(zhǔn)(Cortex MicroController Software Interface Standard的縮寫)。主要是為了提供通用api接口來訪問內(nèi)核和一些片上外設(shè)。提高代碼的可移植性。CMSIS有三個(gè)層:核內(nèi)外設(shè)訪問層Core Peripheral Access Layer(CPAL),中間件(是一種獨(dú)立的系統(tǒng)軟件或服務(wù)程序如FatFS)訪問層Middleware Access Layer(MWAL),設(shè)備訪問層(Device Peripheral Access Layer)。CPAL用于訪問內(nèi)核的寄存器和組件,如NVIC,調(diào)試系統(tǒng)等,該層是由ARM實(shí)現(xiàn)的。MWAL用于對中間件的訪問,現(xiàn)在該層還未實(shí)現(xiàn)。DPAL用于定義一些硬件寄存器的地址和一些外設(shè)訪問函數(shù),由芯片制造商實(shí)現(xiàn)。CPAL的實(shí)現(xiàn)就是core_cm3.c,core_cm3.h文件。DPAL層實(shí)現(xiàn)的就是system_stm32f10x.c的文件(似乎還要加上外設(shè)的函數(shù)庫)。
? ? ? ?stm32f10x_flash.icf:編譯器鏈接庫文件,修改兩個(gè)參數(shù)即可改變代碼存放的地址空間。
? ? ? ?startup_stm32f10x_cl.s:stm32f105vc在IAR編譯器環(huán)境下專業(yè)的啟動文件。啟動文件用英文單詞來描述為“Bootloader”。無論性能高下,結(jié)構(gòu)簡繁,價(jià)格貴賤,每一種微控制器(處理器)都必須有啟動文件,啟動文件的作用便是負(fù)責(zé)執(zhí)行微控制器從“復(fù)位”到“開始執(zhí)行main函數(shù)”中間這段時(shí)間(稱為啟動過程)所必須進(jìn)行的工作。開發(fā)環(huán)境往往自動完整地提供了這個(gè)啟動文件,不需要開發(fā)人員再行干預(yù)啟動過程,只需要從main函數(shù)開始進(jìn)行應(yīng)用程序的設(shè)計(jì)即可。由開發(fā)環(huán)境及啟動文件可知:STM32的啟動過程。首先對棧和堆的大小進(jìn)行定義,并在代碼區(qū)的起始處建立中斷向量表,其第一個(gè)表項(xiàng)是棧頂?shù)刂?#xff0c;第二個(gè)表項(xiàng)是復(fù)位中斷服務(wù)入口地址。然后在復(fù)位中斷服務(wù)程序中跳轉(zhuǎn)??C/C++標(biāo)準(zhǔn)實(shí)時(shí)庫的__main函數(shù),完成用戶堆棧等的初始化后,跳轉(zhuǎn).c文件中的main函數(shù)開始執(zhí)行C程序。假設(shè)STM32被設(shè)置為從內(nèi)部FLASH啟動(這也是最常見的一種情況),中斷向量表起始地位為0x8000000,則棧頂?shù)刂反娣庞?/span>0x8000000處,而復(fù)位中斷服務(wù)入口地址存放于0x8000004處。當(dāng)STM32遇到復(fù)位信號后,則從0x80000004處取出復(fù)位中斷服務(wù)入口地址,繼而執(zhí)行復(fù)位中斷服務(wù)程序,然后跳轉(zhuǎn)__main函數(shù),最后進(jìn)入mian函數(shù),來到C的世界。
? ? ? ? ?bootloader:不是一段代碼,它是一個(gè)具有引導(dǎo)裝載功能的完整程序,如可以引導(dǎo)裝載linux的vivi或uboot,以及通常PC機(jī)上的BIOS程序等。Bootloader也包含了相應(yīng)的啟動代碼,也就是說啟動代碼是Bootloader的一部分,是所有相應(yīng)應(yīng)用程序的一部分。
? ? ??system_stm32f10x.c/.h:設(shè)置系統(tǒng)以及總線時(shí)鐘,這個(gè)里面有個(gè)非常重要的SystemInit()函數(shù),這個(gè)函數(shù)在我們系統(tǒng)啟動的時(shí)候都會調(diào)用,用來設(shè)置系統(tǒng)的整個(gè)時(shí)鐘系統(tǒng)。不知從哪個(gè)版本開始該函數(shù)被加入了啟動文件中,可在啟動文件查找。所以我們不需使用該函數(shù)了。系統(tǒng)主頻時(shí)鐘(主頻率)的改變依實(shí)際芯片主頻修改,如圖:
? ? ??
? ? ??stm32f10x.h:這個(gè)文件相當(dāng)重要,只要你做STM32開發(fā),你幾乎時(shí)刻都要查看這個(gè)文件的相關(guān)定義。這個(gè)文件打開可以看到,里面非常多的結(jié)構(gòu)體以及宏定義。這個(gè)文件里面主要是系統(tǒng)寄存器定義聲明以及包裝內(nèi)存操作。外部時(shí)鐘頻率在該文件里改變,如圖:
? ? ? ?你外部晶振使用多少HZ,就改變?yōu)槎嗌佟?/span>
? ? ?misc.c:定義了中斷向量表初始位置。對比ARM7/ARM9內(nèi)核(復(fù)位后起始地址固定0x000000,中斷向量表位置不固定),Cortex_M3則是固定了中斷向量表的位置(若FLASH啟動,復(fù)位后中斷向量位置固定在0x08000000.),而程序起始地址(程序被安置的地址)是可變化的。編譯器鏈接器分配了中斷向量表實(shí)際放置的地址。所以cm3中斷向量表初始位置不可變,程序起始地址可改變(對CPU來說)。如圖: misc.c
? ? ??
? ? ? 如圖啟動文件內(nèi)修改當(dāng)前程序的開始地址(內(nèi)部flash啟動時(shí)即ROM_start的地址):
? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ??下面開始建立工程:
? ? ? ???1,打開IAR EW。
? ? ? ? ? ? 2,點(diǎn)選“File --- New --- ?Workspace”創(chuàng)建一個(gè)工作區(qū)。創(chuàng)建工作區(qū)先新建一個(gè)文件夾,我在E盤新建一個(gè)名為IAR_Pro的文件夾,作為工作空間。然后在該文件夾下再新建一個(gè)名為Project1的工程文件夾,一會要在此目錄下新建工程。
? ?
? ? ? ? ? ?3,點(diǎn)選“Project --- Create New Project”。彈窗后Tool Chain選擇ARM,Project templates選擇Empty project。點(diǎn)擊OK,后彈出另存為窗口。選擇文件路徑為工作空間路徑“E:\IAR_Pro\Project1”。填寫文件名為NEW_Project,即工程名。
? ? ? ? ? ?4,在“E:\IAR_Pro”文件夾下新建USER,CMSIS,STM32F10x_FWLIB這三個(gè)文件夾。USER存放用戶實(shí)現(xiàn)的代碼如main.c和stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h,system_stm32f10x.c。CMSIS存放cm3的內(nèi)核文件及啟動文件和stm32f10x.h和system_stm32f10x.h,這里只存放啟動文件startup_stm32f10x_cl.s。STM32F10x_FWLIB存放ST官方提供的標(biāo)準(zhǔn)庫文件。?
? ? ? ? ? ?5,將IAR 鏈接腳本文件stm32f10x_flash.icf添加到Project1目錄下。
? ? ? ? ? ?6,將上述文件都添加到IAR 工程里。如圖:
? ? ? ? ? ?
? ? ? ? ? ?7,配置編譯器選項(xiàng)。右擊工程名選擇Options。
? ? ? ? ? (1)配置General Options。如圖:
? ? ? ? ? ??
? ? ? ? ? ?
? ? ? ? ? ?(2)配置C/C++ Compiler。點(diǎn)擊Optimization(最優(yōu)化)選擇 High,如圖:
? ? ? ? ? ? ?
? ? ? ? ? ? ?點(diǎn)擊Option--C/C++ Compiler--Preprocessor下添加頭文件路徑及相應(yīng)宏定義符號例如USE_STDPERIPH_DRIVER和STM32F10X_CL(互聯(lián)型)。如圖:
? ? ? ? ? ? ??
? ? ? ? ? ? ?(3)配置Output Converter,如圖:
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? (4)配置Linker。如圖:
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? 路徑可改為$PROJ_DIR$\stm32f10x_flash.icf。增加可移植性。
? ? ? ? ? ? ?(5)配置Debugger。如圖:
? ? ? ? ? ? ??
? ? ? ? ? ? ??
? ? ? ? ? ? ? 以上配置開發(fā)環(huán)境OK。編譯OK,使用的是3.5庫ADC1_DMA文件夾里的main.c,編譯OK,如圖:
? ? ? ? ? ? ??
? ? ? ??? ?Cortex-M3內(nèi)核規(guī)定,起始地址必須存放堆頂指針,而第二個(gè)地址則必須存放復(fù)位中斷入口向量地址,這樣在Cortex-M3內(nèi)核復(fù)位后,會自動從起始地址的下一個(gè)32位空間取出復(fù)位中斷入口向量,跳轉(zhuǎn)執(zhí)行復(fù)位中斷服務(wù)程序。
? ? ? ? ? ??查看IAR編譯器編譯后的匯編代碼===================================
編輯界面右擊工程名,點(diǎn)擊Options選項(xiàng),選擇c/c++ compiler選項(xiàng)中的list選項(xiàng),勾選output assembler files,編譯后生產(chǎn)離線匯編代碼文件。
調(diào)試界面下,點(diǎn)擊view/disassembly菜單項(xiàng),則顯示在線匯編代碼窗口。
在線調(diào)試,需將Debugger選項(xiàng)下Setup下的Driver改為simulator模擬器,run to到你想到的地方。然后點(diǎn)擊Download and Debug
產(chǎn)生map文件================================================、
Options--linker--list --- Generate linker map file
仿真器作用=================================================
仿真器是在程序運(yùn)行時(shí),用來觀察寄存器里的數(shù)值的。比如說你定義了一個(gè)變量,程序運(yùn)行過程中這個(gè)變量會變化。當(dāng)你需要確定當(dāng)前值時(shí)候,可以用仿真器看到。
所以,如果做大工程,仿真器是必不可少的。如果是很小的代碼,可以不用仿真器,用串口直接下載程序就OK了。?
硬件仿真與軟件仿真區(qū)別=======================================
硬件仿真依賴實(shí)際的硬件實(shí)物,程序是運(yùn)行在實(shí)際的cpu中的,讀取到的任何數(shù)值、狀態(tài)都是實(shí)際的現(xiàn)有狀態(tài),一旦能通那基本就沒問題了。
軟件仿真是在pc上用軟件模擬了硬件cpu的各種功能、寄存器等,不依賴實(shí)際的硬件,其實(shí)可以看成是多個(gè)函數(shù),你寫的程序是多個(gè)輸入,有一個(gè)輸入,對應(yīng)的函數(shù)就輸出相應(yīng)的結(jié)果。
軟件仿真即使成功,實(shí)際下載到硬件上也有可能會出問題,比如電源、晶振這些都是沒法仿真的。?
總結(jié)
以上是生活随笔為你收集整理的IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 将一个数组中的字符串用指定字符分割开,分
- 下一篇: C++中的string 类型占几个字节