上屆直立光電三天入門_第1頁
上屆直立光電三天入門_第2頁
上屆直立光電三天入門_第3頁
上屆直立光電三天入門_第4頁
上屆直立光電三天入門_第5頁
已閱讀5頁,還剩201頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、2012三天入門 Cortex-M4Kinetis 系列野火 Kinetics 開發(fā)板最適合初學(xué)者入門 Kinetis 的freescale作者:野火2012-3-16火前言隨著技術(shù)的發(fā)展,單片機型號越來越繁多,入門的難度也逐漸加多,學(xué)習(xí)周期自然不斷延長。為了讓初學(xué)者快速入門,減少學(xué)習(xí)時間,尤其是為了那些參加智能車比賽而沒時間學(xué)習(xí)深入研究 Kinetis 單片機朋友,力求大大減少初學(xué)者的學(xué)習(xí)時間。特意寫了 Kinetis 開發(fā)板的。野火 Kinetis 開發(fā),主要有 IAR 的使用、Kinetis 啟動流程講解、野火K60 庫的調(diào)用 三個部分組成。不再詳細(xì)講解寄存器,而且直接調(diào)用我們的函數(shù)庫。

2、野火 K60 函數(shù)庫,函數(shù)會自動計算頻率,設(shè)置分頻,直接調(diào)用,減少的后顧之憂,可以加快的開發(fā)速度。目前,單片機型號如此之多,而產(chǎn)品的開發(fā)所允許給的時間越來越少,完全沒有必要深入研究寄存器設(shè)置,就算你能把寄存器背得滾瓜爛熟,過段時間不去接觸,還是沒法記住的?,F(xiàn)在的單片機開發(fā),工程師往往都是利用的固件進行開發(fā),而不再是靠自己重新建立自己的函數(shù)庫進行開發(fā)。例如ST 公司推出的ST 庫,讓你可以完全不需要考慮底層開發(fā)而直接開發(fā)自己的產(chǎn)品。飛思公司,在這方便確實讓人感到失望,要建立自己的野火Kinetis 庫的原因。這也是野火野火 K60 庫的函數(shù)接口,盡量追求簡潔明了、通俗易懂,力求初學(xué)者見其名就會用

3、。目前提供了 26 個入門實驗:野火 Kinetis板實驗例程 ,包含了目前智能車比賽最常用的幾個模塊。想快速上手 K60 單片機嗎?野火 Kinetis K60 庫,是你最好的選擇!是:三天入門 Kinetis!的 1 火喊出這樣的并不是吹的,已經(jīng)有兩位大三參加智能車的朋友(同一個隊)與 k60 庫三天時間內(nèi)就能把 xs128 上的頭 0v7725 驅(qū)動程序和在使用的舵機控制程序移植到 Kinetis 上跑起來;一位大二的師弟,不到一天的時間就從入門頭 ov7725 和液晶 LCD 的移植你會是下一位嗎?到搞定敢拼,一切皆有可能!Nothing is imsible !只要由于個人能力及時間

4、所限,出錯之處,在所難免,歡迎各位m錯誤及提出建議:2012-3-27們Technical support 2 火目錄三天入門 Cortex-M4Kinetis 系列1前言1目錄3Kinetis 的啟動分析(初學(xué)者大概瀏覽一下即可)6初步入門:初始化函數(shù)啟動執(zhí)行順序6逐步提高:ROM、RAM 啟動工作原理、ICF 文件講解8IAR 的使用18安裝IAR18建立IAR 工程30創(chuàng)建工程文件30添加GPIO 驅(qū)動和點亮LED43IAR 工程選項設(shè)置46快速建 IAR 工程66IAR 使用68功能介紹69工作區(qū)工程的選定與切換71通過 jlink并調(diào)試72使用仿真調(diào)試76IAR 界面風(fēng)格設(shè)計79野火

5、 Kinetis板實驗例程列表81野火 K60 庫的使用83前言83快速開發(fā)指南84快速入門:了解野火 Kinetis 工程84中斷函數(shù)的編寫方法90重要變量、函數(shù)、宏定義一覽表93安全檢查96GPIO 模塊100快速入門:GPIO 庫使用方法100GPIO 測試?yán)?09LED 模塊114快速入門:LED 庫使用方法114LED 綜合測試?yán)?17 3 火EXTI 外部GPIO 中斷例程119快速入門:EXTI 庫使用方法119EXTI 綜合測試?yán)?20UART 模塊123快速入門:UART 庫使用方法123UART 綜合測試?yán)?28ADC 模塊134快速入門:ADC 庫使用方法134A

6、DC 綜合測試?yán)?38DAC 模塊140快速入門:DAC 庫使用方法142DAC 綜合測試?yán)?44FTM模塊149快速入門:庫使用方法149綜合測試?yán)?52FTM 輸入捕捉 模塊154快速入門:FTM 輸入捕捉庫使用方法154FTM 輸入捕捉中斷測試156PIT 定時中斷模塊158快速入門:PIT 定時中斷庫使用方法158PIT 定時中斷測試?yán)?60、輸入捕捉、PIT 中斷綜合測試161I2C 模塊164快速入門:I2C 通信庫使用方法164I2C 通信實驗測試165lptmr 低功耗定時器模塊168快速入門:lptmr 低功耗定時器庫使用方法168lptmr 低功耗定時器測試?yán)?7

7、0DMA 模塊175快速入門:DMA 傳輸端口數(shù)據(jù)175DMA 測試?yán)?80MCG 模塊超頻183快速入門:MCG 庫使用方法183快速入門:配置頻率188uC/OS192DSP 數(shù)字信號處理單元193CMSIS 的介紹及其幫助文檔的查找方法193DSP 常用函數(shù)列表197 4 火DSP 測試?yán)?98野火 Kinetis 開發(fā)板問題集200資料在哪里可以到?(IAR、Jlink 驅(qū)動)200jlink 供電到開發(fā)板上200關(guān)于 Kinetis 時鐘200IAR 報錯找不到頭文件201BDM問題202prf 使用方法203Kinetis 單片機的 IO 口支不支持 5V 耐壓?203Kine

8、tis 最多可以輸出多少個頻率不同的脈沖波?204kinetis 捕捉編脈沖計數(shù)方法204ADC 引腳中帶 a、b 表示的意思205不帶有浮點單元能進行浮點運算嗎?205JlinkKinetis205 5 火Kinetis 的啟動分析(初學(xué)者大概瀏覽一下即可)初步入門:初始化函數(shù)啟動執(zhí)行順序上電復(fù)位Reset_Handler中斷向量表start中斷向量表在 vectors.c 里定 義,在vectors.h 文件里 前兩在 start.c 文件里定義,精簡后的代碼:上電復(fù)位后第一個運行的函數(shù),在crt0.s 里用匯編實現(xiàn)。1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.

9、16.17.18.19.20.21.22.23.SECTION .noinit : CODE個元素分別到EXPORT Reset_Handler Reset_Handler ;初始化寄存器_BOOT_STACK_ADDRESS 和(自帶例程MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV CPSIEr0,#0 r1,#0 r2,#0 r3,#0 r4,#0 r5,#0 r6,#0 r7,#0 r8,#0 r9,#0 r10,#0 r11,#0 r12,#0i ; 關(guān)中斷為_startup),第一個為起始 SP 棧指針、第二個為復(fù)位中斷服務(wù)函

10、數(shù)。上電復(fù)位,系統(tǒng)會查詢中斷向量表,把第一個元素的值賦給 SP 寄存器,把第二個值賦給 PC寄存器,即上電后馬上運行 Reset_Hand ler 函數(shù)。就是初始化系統(tǒng):關(guān)閉看門狗、數(shù)據(jù)到內(nèi)存、配置時鐘,然后進入 main 函數(shù)import startBLstart;調(diào)用 C 語言 編寫的 start done函數(shù)BENDdonecommon_startupsysinitmain中斷向量表、初始化數(shù)據(jù)初始化時鐘和初始化串口,精簡版代碼:這里就是的執(zhí)行段、以_ramfunc的子函數(shù)函數(shù),在這里編void sysinit (void)到 RAM 區(qū)(對 flash 操作的函數(shù)必須這樣)寫自己的應(yīng)用

11、文件。core_clk_mhz =pll_init(MCLK_MHZ);時鐘,用于調(diào)試trace_clk_init(); /使能fb_clk_init();/FlexBus 時鐘初始化uart_init(FIRE_PORT, FIRE_BAUD);/初始化 prf 函數(shù)所用到的串口pll_initpll_init 這個函數(shù)是用于鎖相環(huán)超頻的,在 mcg.c 里定義。MCG 模塊一共有 9 中工作模式,按功耗高低順序:PEE、FEE、FEI、PBE、FBE、FBI、BLPE、BLP I、stop。高頻率意味著高功率,為了獲取更高的頻率,這里 pll_init 就是把模式進入 PEE。 6 Res

12、et_Hand lervoid start(void)wdog_disable();/關(guān)閉看門狗commstartup();/數(shù)據(jù)段、中斷向量表到 ramsysinit(); /時鐘初始化main();/* main 函數(shù) */while(1); /避免停止運行火初始化大致思路初始化的整體思路簡單初始化上電wdog_disable關(guān)閉看門狗如果ROM啟動,則復(fù)制中斷向量表. vec到RAM啟動過程分析步驟修改中斷向量表地址為RAM里的地址初始化數(shù)據(jù)段.data到RAMcommon_startup清寄存器Reset_Handler清除RAM中初始化為0的數(shù)據(jù)段.bssstart把以 ramfun

13、c子函數(shù) .textrw到RAM區(qū)的初始化鎖相環(huán)pll_initsysinit初始化prf函數(shù)用到的串口uart_initmain用戶任務(wù)注:common_startup 函數(shù)并沒有常量數(shù)據(jù) .rodata 、代碼.text 。如果是RAM 啟動,代碼會直接編譯進去 RAM,掉電就會丟失數(shù)據(jù)。如果是 ROM 啟動,就會中斷向量表到 RAM,設(shè)置中斷向量表地址為 RAM 的地址,以加快中斷響應(yīng)速度。 7 火逐步提高:ROM、RAM 啟動工作原理、ICF 文件講解對于初學(xué)者而言,對單片機的內(nèi)存分配往往最讓人頭疼,很多人學(xué)了單片機幾年的內(nèi)存使用情況是如何分配的。要了解 ROM、RAM 啟動,首先都不

14、知道單片機器 Linker 如何分配內(nèi)存有一定的了解。需要對通常,對于棧生長方向向下的單片機,其內(nèi)存一般模型是:最低內(nèi)存地址中斷向量表段 .vec函數(shù)代碼段 .text未初始化變量段 .bss 常量段 .rodata已初始化全局變量和靜態(tài)變量段 .data動態(tài)分配數(shù)據(jù)程序運行中由程序員調(diào)用 malloc 等函數(shù)來申請。局部變量在函數(shù)定義的非靜態(tài)的變量。最高地址 1. a = 0;/全局初始化區(qū),.data 段ic b=20;/全局初始化區(qū),.data 段 2. s3.char *p1;/全局未初始化區(qū) .bss 段/.rodata 段 4. const A = 10;注意區(qū)別! 5. vola

15、tile const B=10;/.data 段6.7.main()/代碼區(qū) .text8.9.10.b; char *p2;/棧/棧/全局(靜態(tài))初始化區(qū) .data 段sicc= 0;11.12.13.14.15.16.17.char char p1 =p2 =s*p3=123456;123456;/棧/1234560 在常量區(qū),p3 在棧上。注意區(qū)別!(char*) malloc(10); (char*) malloc(20);/分配得來的 10 和 20 個字節(jié)的區(qū)域就在堆區(qū)/1234560 在常量區(qū)/編譯器可能會將它與 p3 所指向的123456優(yōu)化成一個地方strcpy(p1, 1

16、23456);IAR 里可以設(shè)置 Linker 合并相同的段,即優(yōu)化成一個地方??春竺?IAR 設(shè)置工程選項中 Linker 的設(shè)置注:此表格及代碼內(nèi)容參考網(wǎng)上資料 8 中斷向量表代碼區(qū)數(shù)據(jù)區(qū)堆棧命令行參數(shù)火參考原文出處:那編譯到時候,編譯器是如何為這些變量數(shù)據(jù)分配地址的呢?器 Linker 在發(fā)揮它的作用,它會根據(jù)配置文件,來為這些變量其實,這就是數(shù)據(jù)分配合適的地址,這樣就可以不需要考慮這些內(nèi)存分布就能寫出可運行的代碼。編譯器對代碼進行編譯,一般分為四個步驟:替換和展開宏刪掉注釋編譯和 編譯成匯匯編成機器碼生成可執(zhí)行文件預(yù)編譯匯編優(yōu)化編語言器 Linker 的配置文件都是由通常情況下,提供,

17、一般情況下,不需要更改這些。但出于學(xué)習(xí)的目的,非常有必要去研究一下這些配置文件。在 fire_Kinetisbuildconfig files 文件夾下,你可以看到有很多的 linker 配置文件:這里的文件是用來分配數(shù)據(jù)在內(nèi)存中的位置,配置ROM、RAM 啟動,linker 根據(jù) 這些文件來為 Kinetics 分配 4G 的虛擬尋址空間地址。如果把代碼部分編譯進去 RAM,那就是 RAM 啟動;如果把代碼數(shù)據(jù)編譯進去 ROM,那就是 ROM 啟動(flash 啟動)。不同的型號,flash 內(nèi)存大小不一樣,所以配置 Linker 文件也會不一樣,以 K60為例: 9 火野火 Kinetis

18、板自帶為MK60DN512,512KB 的 Program flash 大小,128KB的 SRAM 大小,沒有 FlexNVM 和FlexRAM。K60 的 4G 虛擬尋址空間就是按照內(nèi)存空間的圖來進行配置: 10 火如果要RAM 啟動,要把代碼編譯進SRAM_L ,定義中斷向量表的位置。可以打開 fire_RAM_K60N512.icf 這個文件(用記事本打開就行),這個配置文件是參考 128KB_Ram.icf 來重新修改和添加了注釋。的配置文件寫得真的思路太亂了,如果你僅僅用 ICF 編輯來配置的配置文件,是非常容易出錯的!你必須要用 ICF 配置好后,還要打開配置文件來修改。野火已經(jīng)

19、對配置文件進行修改,在里面添加了很多注釋:中斷向量表地址。Flash 和 SRAM/*#ICF# Section handled by ICF editor, dont touch! */*-Editor annoion file-*/* IcfEditorFi/*-Spels-*/$TOOLKIT_DIR$ configideIcfEditorcortex_v1_0.definembol ICFEDIT_vec_start = 0 x10000;/RAM 啟動要設(shè)置為 RAM 起始地址,ROM 啟動也要設(shè)為 ROM 的起始地址/*-Memory Regions-*/define define

20、 definesymbol symbol symbol ICFEDIT_region_ROM_start_ ICFEDIT_region_ROM_end ICFEDIT_region_RAM_start_=0 x0;0 x00040000;/ROM 地址0 x10000;/RAM 地址definesymbol ICFEDIT_region_RAM_end =0 x20000000;/*-Sizes-*/define symbol define symbol ICFEDIT_size_cstack_ = 0 x1000;/堆大小/棧大小 ICFEDIT_size_heap = 0 x800;/*

21、 End of ICF editor section. #ICF#*/Kinetis 的 SRAM 是分成兩塊的。/* 上邊是由 ICF 編輯,下面是由手動配置 */這里是設(shè)置第二塊的地址范圍define definesymbol region_RAM2_start = 0 x20000000;/SRAM是分成兩塊的,RAM2 即 SRAM_U , RAM 為 SRAM_Lsymbol region_RAM2_end = 0 x20000000 + _ICFEDIT_region_RAM_end_- ICFEDIT_region_RAM_start ;中斷向量表地址defineexported

22、symbol VECTOR_TABLE = _ICFEDIT_vec_start ;/代碼編譯進 ROM ,則 0 x00000000 ;RAM,則 ICFEDIT_region_RAM_start_defineexportedsymbolVECTOR RAM =ICFEDIT region RAM start;/前面的 RAM 留給 RAM User Vector Table/如果是 ROM 啟動,則 common_startup 函數(shù)會把 VECTOR_TABLE 的數(shù)據(jù)到 _VECTOR_RAM 可以看出棧的生長方向為向下defineexportedsymbol BOOT_STACK_A

23、DDRESS = region_RAM2_end - 8;/0 x20008;啟動棧地址,中斷向量表的第一個元素就是指向這里這里就是代碼的編譯地址。加上0 x410,是前面的留給中斷向量表/* 決定代碼編譯的地址 */defineexported symbolcode start=ICFEDITvec start+ 0 x410;/代碼編譯進 ROM ,則 ICFEDIT_region_ROM_start + 0 x410 ,/RAM,則 _ICFEDIT_region_RAM_start + 0 x410 ,+0 x410 ,是前面的留給 Vector Table設(shè)置 ROM 和 RAM 的

24、可用definememorymem with size = 4G;/4G 的虛擬尋址空間內(nèi)存地址范圍defineregionROM region= mem:fromtoICFEDIT region ROM start ICFEDIT_region_ROM_end ; defineregionRAM_region= mem:fromto| mem:from ICFEDIT_region_RAM_start ICFEDIT_region_RAM_end region_RAM2_starttoregion_RAM2_end ; 11 啟動的中斷向量表地址是不一樣的火define block CSTA

25、CKwilignment =8, size=_ICFEDIT_size_cstack ; /堆,8 字節(jié)對齊define block HEAPwilignment =8, size=_ICFEDIT_size_heap_; /棧,8 字節(jié)對齊/手動初始化,在 common_startup 函數(shù) 里完成設(shè)置堆棧的大小initialize initializemanually manuallyreadwrite ; section .data;/未初始化數(shù)據(jù) .bss已初始化數(shù)據(jù)initializemanuallysection .textrw;/ ramfunc的子函數(shù)取消自動初始化,改為由co

26、mmon_startup 函數(shù)來初始化do not initialize section .noinit ;/復(fù)位中斷向量服務(wù)函數(shù)define block CodeRelocate section .textrw_init ; define block CodeRelocateRam section .textrw ;設(shè)置中斷向量表位置放在/CodeRelocateRam 把代碼到 RAM 中(對 flash 操作的函數(shù)必須這樣)_ICFEDIT_vec_start_地址上place at addressmem: ICFEDIT_vec_start readonly section .vec;

27、中設(shè)置 #pragma location = .vec ,告訴編譯器,這個 中斷向量表,編譯進去 ./vectors.cvec設(shè)置 .noinit 段放在代碼開頭,即復(fù)位中斷服務(wù)函數(shù),把復(fù)位函數(shù)編譯在代碼開頭placeat addressmem: code_start readonly section .noinit ;/在 crt0.s 中設(shè)置了復(fù)位中斷函數(shù)為 SECTION .noinit : CODE ,即把代碼編譯進去 .noinitRAM把只讀數(shù)據(jù)、代碼都編譯進去 RAMplacein RAM_regionreadonly, block CodeRelocate ;/把代碼編譯進去

28、RAM (調(diào)試用,掉電丟失) ,非調(diào)試,則設(shè)為 ROM_regionplacein RAM_regionreadwrite, block CodeRelocateRam, block CSTACK, block HEAP ;上電復(fù)位后,把 0 x00000000 內(nèi)容給SP,把 0 x00000004 內(nèi)容給PC。跳轉(zhuǎn)到 RAM 執(zhí)行代碼。以后發(fā)生中斷,用 RAM 的中斷向量表Linker 根據(jù) icf 配置文件來進行分配內(nèi)存地址:0 x0000-00000 x0000-0000ROM Bootloader 中斷向量表Flash 配置寄存器中斷向量表Flash512KB0 x0000-0400

29、0 x0000-0410代碼區(qū)0 x1-00000 x0007-FRAM Bootloader 中斷向量表數(shù)據(jù)區(qū)RAM 配置寄存器堆Code0 x1-0000SRAM棧128k堆0 x2001-0000棧0 x2000-8命令行參數(shù)配置0 x2001-0000 12 火如果是ROM 啟動(flash 啟動):中斷向量表地址。Flash 和 SRAM啟動的中斷向量表地址是不一樣的1.2./*#ICF# Section handled by ICF editor, dont touch! */*-Editor annoion file-*/3./* IcfEditorFi$TOOLKIT_DIR$

30、 configideIcfEditorcortex_0.xml */4./*-Spels-*/5.definembol ICFEDIT_vec_start = 0 x00000000;設(shè)置 P-flash 和 D-flash6./*-Memory Regions-*/的分區(qū)大小 7.8.9.10.define definesymbol symbol ICFEDIT_region_ROM_start_ ICFEDIT_region_ROM_end /0 x00040000:P-flashk ICFEDIT_region_RAM_start_= 0 x0;= 0 x00040000;256k D-

31、flash= 0 x10000; 256k0 x00080000:P-flashk 512kdefinesymbol/前面0 x410 RAM 留給 RAM User Vector Table 。= 0 x20000000;11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.definesymbolICFEDIT region RAM end/*-Sizes-*/define symbol define symbol ICFEDIT_size_cstack_ = 0 x2000; ICFEDIT_size_heap = 0 x2000;設(shè)

32、置堆棧大小/* End of ICF editor section. #ICF#*/* 上邊是由 ICF 編輯,下面是由手動配置 */definesymbol region_RAM2_start = 0 x20000000;/SRAM 是分成兩塊的,RAM2 即 SRAM_U,RAM 為 SRAM_L 0 x20000000 + ICFEDIT_region_RAM_end - ICFEDIT_region_RAM_start ;definesymbol region_RAM2_end =defineexportedsymbol VECTOR_TABLE = _ICFEDIT_/代碼編譯進 R

33、OM ,則 0 x000000vec_start ;;RAM,則 ICFEDIT_region_RAM_start 29.30.defineexportedsymbol VECTOR_RAM = ICFEDIT_region_RAM_start_;前面的 RAM 留給 RAM User Vector Table,即這里的設(shè)置。所以減 0 x41031.mon_startup 函數(shù)就是把 VECTOR_TABLE 的數(shù)據(jù)到 VECTOR_RAM32.33.34.defineexportedsymbol BOOT_STACK_ADDRESS = region_RAM2_end - 8;/0 x20

34、008; 啟動棧地址35.36.37./* 決定代碼編譯的地址 */defineexportedsymbol code_start_=_ICFEDIT_vec_start + 0 x410;38.39.40.41.42.43.44.45.46.47.48.49.50./+0 x410 ,是前面的留給 Vector Table/4G 的虛擬尋址空間definememory mem withsize = 4G;defineregion ROM_region=mem:from _ICFEDIT_region_ROM_start to ICFEDIT_region_ROM_end ;definereg

35、ion RAM_region=mem:from| mem:from_ICFEDIT_region_RAM_start + 0 x410 to ICFEDIT_region_RAM_end _region_RAM2_start to _region_RAM2_end ;defineblock CSTACKwilignment =8, size=_ICFEDIT_size_cstack ;/堆51.defineblock HEAPwilignment =8, size=_ICFEDIT_size_heap_;/棧52.53.54.55./手動初始化,在 common_startup 函數(shù) 里完成

36、initialize manually readwrite ; initialize manually section .data;堆棧大小/ 未初始化數(shù)據(jù) .bss/ 已初始化數(shù)據(jù) 56. initialize manually section .textrw ;/ ramfunc的子函數(shù)57.58.59.60.61.do not initialize section .noinit ;/ 復(fù)位中斷向量服務(wù)函數(shù)define block CodeRelocate section .textrw init ; define block CodeRelocateRam section .textr

37、w ; 62./ 把 CodeRelocate 代碼到 RAM 中的 CodeRelocateRam (對 flash 操作的函數(shù)必須這樣)63.64.place at address mem: ICFEDIT_vec_start readonly section .vec ;65./vectors.c 中設(shè)置#pragma location = .vec,告訴編譯器,這個是中斷向量表,編譯進去 .vec66.67.place at address mem: code_start readonly section .noinit ; 13 火/在 crt0.s 中設(shè)置了 Reset_Handl

38、er 為 SECTION .noinit : CODE/即把 Reset_Handler 編譯進 code_start 68.69.70.71.72.73.74.placein ROM_regionreadonly, block CodeRelocate ;/把代碼編譯進去 ROM (調(diào)試用),非調(diào)試,則設(shè)為 ROM_regionROM 啟動,就要把只讀數(shù)據(jù)和代碼編譯進 ROMplacein RAM regionreadwrite, block CodeRelocateRam,75.block CSTACK, block HEAP ;Linker 根據(jù) icf 配置文件來進行分配內(nèi)存地址:co

39、mmon_startup 函數(shù) 把中斷向量表、已到 RAM,以_ramfunc初始化數(shù)據(jù)的子函數(shù),以加快速度。以后發(fā)生中斷就會用 RAM 的中斷向量表0 x0000-00000 x0000-0000ROM Bootloader 中斷向量表Flash512KB中斷向量表0 x0000-04000 x0000-0410Flash 配置寄存器代碼區(qū)Code0 x0007-F數(shù)據(jù)區(qū) .rodata數(shù)據(jù)區(qū)0 x1-0000RAM Bootloader 中斷向量表堆0 x1-0410RAM 配置寄存器Code RAM0 x1-0000SRAM數(shù)據(jù)區(qū)棧.bss和 .data128k堆0 x2001-0000

40、棧命令行參數(shù)0 x2000-8配置0 x2001-0000前面的內(nèi)容,不知道大家是否都看懂呢?熟悉單片機的內(nèi)存分配,是每一個電子工程師所必備的。如果對單片機的內(nèi)存分配都不了解,那就算會寫單片機的驅(qū)動程序,也難以保證程序的質(zhì)量。那在 IAR 里,怎么知道編譯生成的文件的內(nèi)存圖?在工程選項里,設(shè)置生成 map file 就行: 14 火設(shè)置好,編譯后,在 fire_Kinetisbuild_demo模式List 文件夾下就會有 .map 文件。這里的內(nèi)容,就是 ICF 配置文件底部的宏替換內(nèi)容中斷向量表復(fù)位中斷服務(wù)函數(shù)程序代碼 15 火ICF 編輯器呢?那呵呵,在工程名里右鍵OptionsLink

41、er這里就是設(shè)置 Linker 配置文件的 ICF 編輯器,可以在里面設(shè)置相應(yīng)的數(shù)據(jù)中斷向量表地址 16 火ROM、RAN 地址堆棧大小 17 火IAR 的使用安裝 IAR野火的是直接在野火提供的 K60 庫模版上添加自己的代碼,而不是自己重建工程,但學(xué)會自己建立工程是必須的,這里給大家詳解建立 IAR 工程的步驟。一、安裝的 IAR for ARM 為 v6.30,支持的 Kinetics 系列目前,因此大家更新,避免因為版本太低而出現(xiàn)不兼容,甚至出現(xiàn)異常錯誤的情況。地址:/folder/fautzfbt 里的 CD-EWARM-6301-3142.7z安裝 IAR 詳細(xì)過程后解壓文件,打開

42、目錄,運行安裝文件:二、1. 18 火2. 選擇安裝 IAR Embedded Workbench 19 火3.next4.選擇同意,然后點擊next 20 火5.需要填入 key6.打開目錄,找到機文件,并運行它。按下任意鍵,會自動打開 license.txt 文件,并提示:搜索EWARM ,找到所在行的 key。 21 火key 上一行的 Installserial 即為這里所需要的:7. Next 后,填入 key 所在行的 License Key: 22 火包括#號哦!8.Next 后,根據(jù)自己情況選擇安裝路徑9.設(shè)置開始菜單文件夾,還是繼續(xù) Next 23 火經(jīng)過漫長的等待10. 噔

43、噔噔噔華麗麗地按個 finish 結(jié)束安裝了 24 火11. 運行 IAR,語言選擇,按 OK 結(jié)束12. IAR 的編程界面: 25 火相對于 Keil For ARM、CodeWarrior 而言,IARfor ARM 的編程界面是最簡單的,編譯效率高,在系統(tǒng)的調(diào)試方面提供了可供調(diào)試的插件: 26 火三、安裝仿真器驅(qū)動1.又換會原來的安裝導(dǎo)航界面:選擇 Install drivers2.野火 Kinetics 開發(fā)板,選擇了用 jlink 作為仿真調(diào)試器,因此這里選擇 jlink。運行安裝文件 27 火運行后,會自動安裝驅(qū)動,不會有其他提示。可以選擇用 segger 公司的 j-link:

44、另外,為了可以使用擦除等功能, 28 火地址:Setup JLinkARM V436k.zip安裝時,一路狂 Next 就行安裝后,在開始菜單里找到 J-Flash ARM,運行它即可 29 火建立 IAR 工程創(chuàng)建工程文件一、準(zhǔn)備材料在建立 IAR 工程前,需要寫好的庫。地址:KINETIS512 SC.zip的 Kinetis 例程,提取里面的配置文件和解壓后,打開目錄,會看到兩個文件夾二、建立 IAR 工程過程以 GPIO 為例子,點亮 LED,一步步操作,講解建立工程的詳細(xì)過在這里,程。1. 建立工作空間FileNewWorkspace 30 火2. 建立工程里選擇 ProjectCr

45、eate New Project在 31 火接著在彈出來的框里選擇空的工程,點擊確定 32 火接著彈出選擇保存工程的框。由于還沒建保存工程的文件夾,就直框里新建:右鍵新建文件夾重命名為:fire_Kinetis接在打開新建的 fire_Kinetis 文件夾,再建一個build 文件夾,build 文件里再建一個gpio_demo 文件夾,把工程文件保存在gpio_demo 文件夾里面,工程文件名為 :fire_gpio_demo ,文件結(jié)構(gòu)如下圖: 33 火保存后,進入 IAR 界面,別忘了工作區(qū)還沒有保存哦。在菜單欄里找到圖標(biāo)點擊保存全部文件,把 工作區(qū)文件保存在 fire_Kinetis

46、 文件夾下,名字為 fire_Kinetis,: 34 火這樣,一個空的 IAR 工程骨架就建立完畢需要往里面添加自己的模塊。3. 往工程添加 Kinetis自帶函數(shù)庫例程文件夾下的文件夾 src 到 fire_Kinetis 文件夾下 :例程文件夾 KINETIS512_SCbuildiar 下的文件 iar.h到 fire_Kinetisbuild 文件夾下。另外,還需要把件夾 config files和 文呵呵,怎么會多了個 settings 呢?這個是保存工作區(qū)后 IAR 自動創(chuàng)建的設(shè)置文件,不需要管他。4. 添加分組,方便管理代碼返回 IAR 界面,在工程里創(chuàng)建分組: 35 火框里填

47、入 “app” ,這樣就添加了一個 app 分組:在彈出來的如此繼續(xù)添加其他分組:common、cpu、drivers這些組用呢?現(xiàn)在就往里面添加源代碼文件,添加后,你就開始明白的。5. 把代碼文件放進分組把 fire_Kinetissrccommon 文件夾 下的 *.c 文件全部添加到 common 分組里: 36 火選中所有的 *.c 文件。如果你想把頭文件也放在工程里,也可以把 *.h 文件選中。 37 火添加后:common 里的都是提供的通用庫。再把 fire_Kinetissru 文件夾 下的 *.c和 crt0.s 文件添加到 cpu 分組里:別漏了還有 crt0.s 哦。cr

48、t0.s 是啟動文件,單片機上電復(fù)位后,就會執(zhí)行里面的匯編代碼。再把 fire_Kinetissrcdrivers 文件夾下的 lptmr、 mcg、uar*.c 文件添加進工程了:og 子文件 里 38 火添加后:再在 fire_Kinetis srcprojects 下創(chuàng)建 fire_gpio_demo 文件夾,在fire_gpio_demo 文件下繼續(xù)創(chuàng)建main.c 、isr.c 和 isr.h 文件,往app 分組添加main.c 、isr.c 39 火然后在main.c 里寫個空的 main 函數(shù):在 isr.h 文件里添加一下代碼:22. /* (C) COPYRIGHT 201

49、1 * 23. * 文件名:isr.h* 描述*:重新宏定義中斷號,重中斷向量表里的中斷函數(shù)地址,24.25.使其指向所定義的中斷服務(wù)函數(shù)。中斷服務(wù)函數(shù)警告:只能在vectors.c被包含,而且必須在vectors.h包含的后面!26.27.*:野火 kinetis 開發(fā)板 28. * 實驗庫版本 嵌入系統(tǒng):29.30.31.*32.33.*作者 淘寶店:34.*技術(shù)支持:htt/_list.jsp?_id=100835.36.37.38.39.*/#ifndef ISR_H #define ISR_H 1/*重新定義中斷向量表 40. * 先取消默認(rèn)的中斷向量元素宏定義#undef VECT

50、OR_ 41. * 在重新定義到自己編寫的中斷函數(shù)#define VECTOR_IRQHandler 40 18. void main()19. 20.21. 火* 例如:42.43.*#undef VECTOR_003先取消到中斷向量表里的中斷函數(shù)地址宏定義重新定義硬件中斷服務(wù)函數(shù)44.45.46.* #define VECTOR_003*/HardFault_Handler47.48.49.#endif/_ISR_HVECTOR_003在vectors.h 里已經(jīng)定義了:default_isr#define VECTOR_003/* isr.h 結(jié)尾 */默認(rèn)中斷向量表里大部分中斷地址都是

51、指向 default_isr ,所以要重新到自己的中斷服務(wù)函數(shù)。這個頭文件是用來重中斷向量表里的中斷函數(shù)地址,使其指向所定義的中斷服務(wù)函數(shù)。注意:這個頭文件只能在vectors.c中被包含,而且必須在vectors.h包含的后面被包含!即在vectors.c里,頭文件的包含順序為:關(guān)于中斷函數(shù)的編程和 isr.h 的作用,可以看:中斷函數(shù)的編寫方法最后,在 fire_Kinetissrcplatforms命名為 k60_fire.h :一份 k60_tower.h文件夾下,文件出來,在 fire_Kinetissrccommoncommon.h 里找到下面的代碼: 52. /* 41 50.

52、#include vectors.h /兩者順序不能換,如果換了,就不能重到指定的中斷函數(shù)地址 51. #include isr.h火#include k60_fire.h ,即注釋掉,并另外,DEBUG_PR在 fire_Kinetissrccommoncommon.h 和fire_Kinetissrcplatforms k60_fire.h 里都 有定義,應(yīng)該注釋掉 k60_fire.h 里的定義在 fire_Kinetissrccommoncommon.h 添加數(shù)據(jù)類型的 typedef : 42 1. /*設(shè)置數(shù)據(jù)類型*/2. typedefunsignedcharu8;/無符號型ty

53、pedefunsignedshorttypedefunsignedlongu16; u32;5.6. typedefchars8;/有符號型typedefshorttypedeflongs16; s32;78. /* Global defines to use for all boards */79. /#define DEBUG_PR64.65. /*66. * Include the platform specific header file67. */#if (defined(TWR_K40X256)#include k40 tower.h#elif (defined(TWR K60N5

54、12)#elif (defined(TWR_K53N512)#include k53_tower.h#else#error No valid platform defined#endif/ #include k60_tower.h#include k60_fire.h53. * Include the platform specific header file54. */#if (defined(TWR_K40X256)#include k40_tower.h#elif (defined(TWR_K60N512)#elif (defined(TWR_K53N512)#include k53_t

55、ower.h#else#error No valid platform defined#endif#include k60_tower.h火添加 GPIO 驅(qū)動和點亮 LEDKinetis 的編程步驟:開啟時鐘、復(fù)用管腳、設(shè)置頻率、設(shè)置功能在 fire_Kinetissrcdrivers 文件夾下 建立 gpio 文件夾,再在gpio 文件夾建立gpio.c 和 gpio.h把 gpio.c 添加進工程分組的drivers 里,在 gpio.c 里添加如下gpio 的驅(qū)動代碼:1.2.3.4.5.6.7.8.9.10./* (C) COPYRIGHT 2011*文件名描述:gpio.c:gpi

56、o 驅(qū)動函數(shù)實驗庫版本嵌入系統(tǒng):野火 kinetis 開發(fā)板:作者淘寶店:11.*技術(shù)支持:htt/list.jsp?id=100812. */ 13.#include common.h#include gpio.hvolatile struct GPIO_MemMap *GPIOx5=PTA_BASE_PTR,PTB_BASE_PTR,PTC_BASE_PTR,PTD_BASE_PTR,PTE_BASE_PTR; /定義五個指針數(shù)組保存 GPIOx 的地址volatile struct PORT_MemMap *PORTX5=PORTA_BASE_PTR,PORTB_BASE_PTR,POR

57、 TC_BASE_PTR,PORTD_BASE_PTR,PORTE_BASE_PTR;21./*22.23.24.25.26.27.28.29.*函數(shù)名稱:gpio_init功能說明:初始化 gpio參數(shù)說明:PORTxn IOdata端(PORTA,PORTB,PORTC,PORTD,PORTE)端口引腳引腳方向,0=輸入,1=輸出 輸出初始狀態(tài),0=低電平,1=(對輸入無效)函數(shù)返回:無修改時間:2012-1-1530.31.32.33.34.35.36.*已測試*備注:*/void gpio_init (PORTx portx, u8 n,IO cfg,u8 data)ASSERT( (

58、n 32u)& (data 2u) );/使用斷言檢查輸入、電平 是否為 1bit 43 火37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58./選擇功能腳 PORTx_PCRx ,每個端口都有個寄存器 PORTx_PCRx PORT_PCR_REG(PORTXportx,n)=(0|PORT_PCR_MUX(1);/端口方向控制輸入還是輸出if(cfg = GPO)/outputGPIO_PDDR_REG(GPIOxportx) |= (1n);if(data = 1)/output/端口方向為輸出GPIO PD

59、OR REG(GPIOxportx) |= (1n); /對端口輸出控制,輸出為 1elseGPIO PDOR REG(GPIOxportx) &= (1n);/對端口輸出控制,輸出為 0elseGPIO PDDR REG(GPIOxportx) &= (1n);/端口方向為輸入/*59.*60.61.62.*函數(shù)名稱:gpio_set 功能說明:設(shè)置引腳狀態(tài)63.64.65.*參數(shù)說明:PORTxn data端(PORTA,PORTB,PORTC,PORTD,PORTE)端口引腳輸出初始狀態(tài),0=低電平,1=66.67.68.69.70.71.72.73.74.*函數(shù)返回:無修改時間:201

60、2-1-16已測試*備注:*/void gpio_set (PORTx portx, u8 n, u8 data)ASSERT( (n 32u)& (data 2u) );/使用斷言檢查輸入、電平 是否為 1bitif(data = 1)75.GPIO PDOR REG(GPIOxportx) |= (1n);/輸出76.77.78.elseGPIO PDOR REG(GPIOxportx) &= (1func(char)c);/在 prf 里定義 func 為 out_char/即類似執(zhí)行:out_char(char)c); 6.7. 火斷言,其實就是一個宏定義:/* 注:野火修改過這里的代

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論