




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、2012三天入門 Cortex-M4Kinetis 系列野火 Kinetics 開發板最適合初學者入門 Kinetis 的freescale作者:野火2012-3-16火前言隨著技術的發展,單片機型號越來越繁多,入門的難度也逐漸加多,學習周期自然不斷延長。為了讓初學者快速入門,減少學習時間,尤其是為了那些參加智能車比賽而沒時間學習深入研究 Kinetis 單片機朋友,力求大大減少初學者的學習時間。特意寫了 Kinetis 開發板的。野火 Kinetis 開發,主要有 IAR 的使用、Kinetis 啟動流程講解、野火K60 庫的調用 三個部分組成。不再詳細講解寄存器,而且直接調用我們的函數庫。
2、野火 K60 函數庫,函數會自動計算頻率,設置分頻,直接調用,減少的后顧之憂,可以加快的開發速度。目前,單片機型號如此之多,而產品的開發所允許給的時間越來越少,完全沒有必要深入研究寄存器設置,就算你能把寄存器背得滾瓜爛熟,過段時間不去接觸,還是沒法記住的。現在的單片機開發,工程師往往都是利用的固件進行開發,而不再是靠自己重新建立自己的函數庫進行開發。例如ST 公司推出的ST 庫,讓你可以完全不需要考慮底層開發而直接開發自己的產品。飛思公司,在這方便確實讓人感到失望,要建立自己的野火Kinetis 庫的原因。這也是野火野火 K60 庫的函數接口,盡量追求簡潔明了、通俗易懂,力求初學者見其名就會用
3、。目前提供了 26 個入門實驗:野火 Kinetis板實驗例程 ,包含了目前智能車比賽最常用的幾個模塊。想快速上手 K60 單片機嗎?野火 Kinetis K60 庫,是你最好的選擇!是:三天入門 Kinetis!的 1 火喊出這樣的并不是吹的,已經有兩位大三參加智能車的朋友(同一個隊)與 k60 庫三天時間內就能把 xs128 上的頭 0v7725 驅動程序和在使用的舵機控制程序移植到 Kinetis 上跑起來;一位大二的師弟,不到一天的時間就從入門頭 ov7725 和液晶 LCD 的移植你會是下一位嗎?到搞定敢拼,一切皆有可能!Nothing is imsible !只要由于個人能力及時間
4、所限,出錯之處,在所難免,歡迎各位m錯誤及提出建議:2012-3-27們Technical support 2 火目錄三天入門 Cortex-M4Kinetis 系列1前言1目錄3Kinetis 的啟動分析(初學者大概瀏覽一下即可)6初步入門:初始化函數啟動執行順序6逐步提高:ROM、RAM 啟動工作原理、ICF 文件講解8IAR 的使用18安裝IAR18建立IAR 工程30創建工程文件30添加GPIO 驅動和點亮LED43IAR 工程選項設置46快速建 IAR 工程66IAR 使用68功能介紹69工作區工程的選定與切換71通過 jlink并調試72使用仿真調試76IAR 界面風格設計79野火
5、 Kinetis板實驗例程列表81野火 K60 庫的使用83前言83快速開發指南84快速入門:了解野火 Kinetis 工程84中斷函數的編寫方法90重要變量、函數、宏定義一覽表93安全檢查96GPIO 模塊100快速入門:GPIO 庫使用方法100GPIO 測試例程109LED 模塊114快速入門:LED 庫使用方法114LED 綜合測試例程117 3 火EXTI 外部GPIO 中斷例程119快速入門:EXTI 庫使用方法119EXTI 綜合測試例程120UART 模塊123快速入門:UART 庫使用方法123UART 綜合測試例程128ADC 模塊134快速入門:ADC 庫使用方法134A
6、DC 綜合測試例程138DAC 模塊140快速入門:DAC 庫使用方法142DAC 綜合測試例程144FTM模塊149快速入門:庫使用方法149綜合測試例程152FTM 輸入捕捉 模塊154快速入門:FTM 輸入捕捉庫使用方法154FTM 輸入捕捉中斷測試156PIT 定時中斷模塊158快速入門:PIT 定時中斷庫使用方法158PIT 定時中斷測試例程160、輸入捕捉、PIT 中斷綜合測試161I2C 模塊164快速入門:I2C 通信庫使用方法164I2C 通信實驗測試165lptmr 低功耗定時器模塊168快速入門:lptmr 低功耗定時器庫使用方法168lptmr 低功耗定時器測試例程17
7、0DMA 模塊175快速入門:DMA 傳輸端口數據175DMA 測試例程180MCG 模塊超頻183快速入門:MCG 庫使用方法183快速入門:配置頻率188uC/OS192DSP 數字信號處理單元193CMSIS 的介紹及其幫助文檔的查找方法193DSP 常用函數列表197 4 火DSP 測試例程198野火 Kinetis 開發板問題集200資料在哪里可以到?(IAR、Jlink 驅動)200jlink 供電到開發板上200關于 Kinetis 時鐘200IAR 報錯找不到頭文件201BDM問題202prf 使用方法203Kinetis 單片機的 IO 口支不支持 5V 耐壓?203Kine
8、tis 最多可以輸出多少個頻率不同的脈沖波?204kinetis 捕捉編脈沖計數方法204ADC 引腳中帶 a、b 表示的意思205不帶有浮點單元能進行浮點運算嗎?205JlinkKinetis205 5 火Kinetis 的啟動分析(初學者大概瀏覽一下即可)初步入門:初始化函數啟動執行順序上電復位Reset_Handler中斷向量表start中斷向量表在 vectors.c 里定 義,在vectors.h 文件里 前兩在 start.c 文件里定義,精簡后的代碼:上電復位后第一個運行的函數,在crt0.s 里用匯編實現。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 ; 關中斷為_startup),第一個為起始 SP 棧指針、第二個為復位中斷服務函
10、數。上電復位,系統會查詢中斷向量表,把第一個元素的值賦給 SP 寄存器,把第二個值賦給 PC寄存器,即上電后馬上運行 Reset_Hand ler 函數。就是初始化系統:關閉看門狗、數據到內存、配置時鐘,然后進入 main 函數import startBLstart;調用 C 語言 編寫的 start done函數BENDdonecommon_startupsysinitmain中斷向量表、初始化數據初始化時鐘和初始化串口,精簡版代碼:這里就是的執行段、以_ramfunc的子函數函數,在這里編void sysinit (void)到 RAM 區(對 flash 操作的函數必須這樣)寫自己的應用
11、文件。core_clk_mhz =pll_init(MCLK_MHZ);時鐘,用于調試trace_clk_init(); /使能fb_clk_init();/FlexBus 時鐘初始化uart_init(FIRE_PORT, FIRE_BAUD);/初始化 prf 函數所用到的串口pll_initpll_init 這個函數是用于鎖相環超頻的,在 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();/關閉看門狗commstartup();/數據段、中斷向量表到 ramsysinit(); /時鐘初始化main();/* main 函數 */while(1); /避免停止運行火初始化大致思路初始化的整體思路簡單初始化上電wdog_disable關閉看門狗如果ROM啟動,則復制中斷向量表. vec到RAM啟動過程分析步驟修改中斷向量表地址為RAM里的地址初始化數據段.data到RAMcommon_startup清寄存器Reset_Handler清除RAM中初始化為0的數據段.bssstart把以 ramfun
13、c子函數 .textrw到RAM區的初始化鎖相環pll_initsysinit初始化prf函數用到的串口uart_initmain用戶任務注:common_startup 函數并沒有常量數據 .rodata 、代碼.text 。如果是RAM 啟動,代碼會直接編譯進去 RAM,掉電就會丟失數據。如果是 ROM 啟動,就會中斷向量表到 RAM,設置中斷向量表地址為 RAM 的地址,以加快中斷響應速度。 7 火逐步提高:ROM、RAM 啟動工作原理、ICF 文件講解對于初學者而言,對單片機的內存分配往往最讓人頭疼,很多人學了單片機幾年的內存使用情況是如何分配的。要了解 ROM、RAM 啟動,首先都不
14、知道單片機器 Linker 如何分配內存有一定的了解。需要對通常,對于棧生長方向向下的單片機,其內存一般模型是:最低內存地址中斷向量表段 .vec函數代碼段 .text未初始化變量段 .bss 常量段 .rodata已初始化全局變量和靜態變量段 .data動態分配數據程序運行中由程序員調用 malloc 等函數來申請。局部變量在函數定義的非靜態的變量。最高地址 1. a = 0;/全局初始化區,.data 段ic b=20;/全局初始化區,.data 段 2. s3.char *p1;/全局未初始化區 .bss 段/.rodata 段 4. const A = 10;注意區別! 5. vola
15、tile const B=10;/.data 段6.7.main()/代碼區 .text8.9.10.b; char *p2;/棧/棧/全局(靜態)初始化區 .data 段sicc= 0;11.12.13.14.15.16.17.char char p1 =p2 =s*p3=123456;123456;/棧/1234560 在常量區,p3 在棧上。注意區別!(char*) malloc(10); (char*) malloc(20);/分配得來的 10 和 20 個字節的區域就在堆區/1234560 在常量區/編譯器可能會將它與 p3 所指向的123456優化成一個地方strcpy(p1, 1
16、23456);IAR 里可以設置 Linker 合并相同的段,即優化成一個地方。看后面 IAR 設置工程選項中 Linker 的設置注:此表格及代碼內容參考網上資料 8 中斷向量表代碼區數據區堆棧命令行參數火參考原文出處:那編譯到時候,編譯器是如何為這些變量數據分配地址的呢?器 Linker 在發揮它的作用,它會根據配置文件,來為這些變量其實,這就是數據分配合適的地址,這樣就可以不需要考慮這些內存分布就能寫出可運行的代碼。編譯器對代碼進行編譯,一般分為四個步驟:替換和展開宏刪掉注釋編譯和 編譯成匯匯編成機器碼生成可執行文件預編譯匯編優化編語言器 Linker 的配置文件都是由通常情況下,提供,
17、一般情況下,不需要更改這些。但出于學習的目的,非常有必要去研究一下這些配置文件。在 fire_Kinetisbuildconfig files 文件夾下,你可以看到有很多的 linker 配置文件:這里的文件是用來分配數據在內存中的位置,配置ROM、RAM 啟動,linker 根據 這些文件來為 Kinetics 分配 4G 的虛擬尋址空間地址。如果把代碼部分編譯進去 RAM,那就是 RAM 啟動;如果把代碼數據編譯進去 ROM,那就是 ROM 啟動(flash 啟動)。不同的型號,flash 內存大小不一樣,所以配置 Linker 文件也會不一樣,以 K60為例: 9 火野火 Kinetis
18、板自帶為MK60DN512,512KB 的 Program flash 大小,128KB的 SRAM 大小,沒有 FlexNVM 和FlexRAM。K60 的 4G 虛擬尋址空間就是按照內存空間的圖來進行配置: 10 火如果要RAM 啟動,要把代碼編譯進SRAM_L ,定義中斷向量表的位置。可以打開 fire_RAM_K60N512.icf 這個文件(用記事本打開就行),這個配置文件是參考 128KB_Ram.icf 來重新修改和添加了注釋。的配置文件寫得真的思路太亂了,如果你僅僅用 ICF 編輯來配置的配置文件,是非常容易出錯的!你必須要用 ICF 配置好后,還要打開配置文件來修改。野火已經
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 啟動要設置為 RAM 起始地址,ROM 啟動也要設為 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 編輯,下面是由手動配置 */這里是設置第二塊的地址范圍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 函數會把 VECTOR_TABLE 的數據到 _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設置 ROM 和 RAM 的
24、可用definememorymem with size = 4G;/4G 的虛擬尋址空間內存地址范圍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 字節對齊define block HEAPwilignment =8, size=_ICFEDIT_size_heap_; /棧,8 字節對齊/手動初始化,在 common_startup 函數 里完成設置堆棧的大小initialize initializemanually manuallyreadwrite ; section .data;/未初始化數據 .bss已初始化數據initializemanuallysection .textrw;/ ramfunc的子函數取消自動初始化,改為由co
26、mmon_startup 函數來初始化do not initialize section .noinit ;/復位中斷向量服務函數define block CodeRelocate section .textrw_init ; define block CodeRelocateRam section .textrw ;設置中斷向量表位置放在/CodeRelocateRam 把代碼到 RAM 中(對 flash 操作的函數必須這樣)_ICFEDIT_vec_start_地址上place at addressmem: ICFEDIT_vec_start readonly section .vec;
27、中設置 #pragma location = .vec ,告訴編譯器,這個 中斷向量表,編譯進去 ./vectors.cvec設置 .noinit 段放在代碼開頭,即復位中斷服務函數,把復位函數編譯在代碼開頭placeat addressmem: code_start readonly section .noinit ;/在 crt0.s 中設置了復位中斷函數為 SECTION .noinit : CODE ,即把代碼編譯進去 .noinitRAM把只讀數據、代碼都編譯進去 RAMplacein RAM_regionreadonly, block CodeRelocate ;/把代碼編譯進去
28、RAM (調試用,掉電丟失) ,非調試,則設為 ROM_regionplacein RAM_regionreadwrite, block CodeRelocateRam, block CSTACK, block HEAP ;上電復位后,把 0 x00000000 內容給SP,把 0 x00000004 內容給PC。跳轉到 RAM 執行代碼。以后發生中斷,用 RAM 的中斷向量表Linker 根據 icf 配置文件來進行分配內存地址:0 x0000-00000 x0000-0000ROM Bootloader 中斷向量表Flash 配置寄存器中斷向量表Flash512KB0 x0000-0400
29、0 x0000-0410代碼區0 x1-00000 x0007-FRAM Bootloader 中斷向量表數據區RAM 配置寄存器堆Code0 x1-0000SRAM棧128k堆0 x2001-0000棧0 x2000-8命令行參數配置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;設置 P-flash 和 D-flash6./*-Memory Regions-*/的分區大小 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;設
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,即這里的設置。所以減 0 x41031.mon_startup 函數就是把 VECTOR_TABLE 的數據到 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 函數 里完成
36、initialize manually readwrite ; initialize manually section .data;堆棧大小/ 未初始化數據 .bss/ 已初始化數據 56. initialize manually section .textrw ;/ ramfunc的子函數57.58.59.60.61.do not initialize section .noinit ;/ 復位中斷向量服務函數define block CodeRelocate section .textrw init ; define block CodeRelocateRam section .textr
37、w ; 62./ 把 CodeRelocate 代碼到 RAM 中的 CodeRelocateRam (對 flash 操作的函數必須這樣)63.64.place at address mem: ICFEDIT_vec_start readonly section .vec ;65./vectors.c 中設置#pragma location = .vec,告訴編譯器,這個是中斷向量表,編譯進去 .vec66.67.place at address mem: code_start readonly section .noinit ; 13 火/在 crt0.s 中設置了 Reset_Handl
38、er 為 SECTION .noinit : CODE/即把 Reset_Handler 編譯進 code_start 68.69.70.71.72.73.74.placein ROM_regionreadonly, block CodeRelocate ;/把代碼編譯進去 ROM (調試用),非調試,則設為 ROM_regionROM 啟動,就要把只讀數據和代碼編譯進 ROMplacein RAM regionreadwrite, block CodeRelocateRam,75.block CSTACK, block HEAP ;Linker 根據 icf 配置文件來進行分配內存地址:co
39、mmon_startup 函數 把中斷向量表、已到 RAM,以_ramfunc初始化數據的子函數,以加快速度。以后發生中斷就會用 RAM 的中斷向量表0 x0000-00000 x0000-0000ROM Bootloader 中斷向量表Flash512KB中斷向量表0 x0000-04000 x0000-0410Flash 配置寄存器代碼區Code0 x0007-F數據區 .rodata數據區0 x1-0000RAM Bootloader 中斷向量表堆0 x1-0410RAM 配置寄存器Code RAM0 x1-0000SRAM數據區棧.bss和 .data128k堆0 x2001-0000
40、棧命令行參數0 x2000-8配置0 x2001-0000前面的內容,不知道大家是否都看懂呢?熟悉單片機的內存分配,是每一個電子工程師所必備的。如果對單片機的內存分配都不了解,那就算會寫單片機的驅動程序,也難以保證程序的質量。那在 IAR 里,怎么知道編譯生成的文件的內存圖?在工程選項里,設置生成 map file 就行: 14 火設置好,編譯后,在 fire_Kinetisbuild_demo模式List 文件夾下就會有 .map 文件。這里的內容,就是 ICF 配置文件底部的宏替換內容中斷向量表復位中斷服務函數程序代碼 15 火ICF 編輯器呢?那呵呵,在工程名里右鍵OptionsLink
41、er這里就是設置 Linker 配置文件的 ICF 編輯器,可以在里面設置相應的數據中斷向量表地址 16 火ROM、RAN 地址堆棧大小 17 火IAR 的使用安裝 IAR野火的是直接在野火提供的 K60 庫模版上添加自己的代碼,而不是自己重建工程,但學會自己建立工程是必須的,這里給大家詳解建立 IAR 工程的步驟。一、安裝的 IAR for ARM 為 v6.30,支持的 Kinetics 系列目前,因此大家更新,避免因為版本太低而出現不兼容,甚至出現異常錯誤的情況。地址:/folder/fautzfbt 里的 CD-EWARM-6301-3142.7z安裝 IAR 詳細過程后解壓文件,打開
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 后,根據自己情況選擇安裝路徑9.設置開始菜單文件夾,還是繼續 Next 23 火經過漫長的等待10. 噔
43、噔噔噔華麗麗地按個 finish 結束安裝了 24 火11. 運行 IAR,語言選擇,按 OK 結束12. IAR 的編程界面: 25 火相對于 Keil For ARM、CodeWarrior 而言,IARfor ARM 的編程界面是最簡單的,編譯效率高,在系統的調試方面提供了可供調試的插件: 26 火三、安裝仿真器驅動1.又換會原來的安裝導航界面:選擇 Install drivers2.野火 Kinetics 開發板,選擇了用 jlink 作為仿真調試器,因此這里選擇 jlink。運行安裝文件 27 火運行后,會自動安裝驅動,不會有其他提示。可以選擇用 segger 公司的 j-link:
44、另外,為了可以使用擦除等功能, 28 火地址:Setup JLinkARM V436k.zip安裝時,一路狂 Next 就行安裝后,在開始菜單里找到 J-Flash ARM,運行它即可 29 火建立 IAR 工程創建工程文件一、準備材料在建立 IAR 工程前,需要寫好的庫。地址:KINETIS512 SC.zip的 Kinetis 例程,提取里面的配置文件和解壓后,打開目錄,會看到兩個文件夾二、建立 IAR 工程過程以 GPIO 為例子,點亮 LED,一步步操作,講解建立工程的詳細過在這里,程。1. 建立工作空間FileNewWorkspace 30 火2. 建立工程里選擇 ProjectCr
45、eate New Project在 31 火接著在彈出來的框里選擇空的工程,點擊確定 32 火接著彈出選擇保存工程的框。由于還沒建保存工程的文件夾,就直框里新建:右鍵新建文件夾重命名為:fire_Kinetis接在打開新建的 fire_Kinetis 文件夾,再建一個build 文件夾,build 文件里再建一個gpio_demo 文件夾,把工程文件保存在gpio_demo 文件夾里面,工程文件名為 :fire_gpio_demo ,文件結構如下圖: 33 火保存后,進入 IAR 界面,別忘了工作區還沒有保存哦。在菜單欄里找到圖標點擊保存全部文件,把 工作區文件保存在 fire_Kinetis
46、 文件夾下,名字為 fire_Kinetis,: 34 火這樣,一個空的 IAR 工程骨架就建立完畢需要往里面添加自己的模塊。3. 往工程添加 Kinetis自帶函數庫例程文件夾下的文件夾 src 到 fire_Kinetis 文件夾下 :例程文件夾 KINETIS512_SCbuildiar 下的文件 iar.h到 fire_Kinetisbuild 文件夾下。另外,還需要把件夾 config files和 文呵呵,怎么會多了個 settings 呢?這個是保存工作區后 IAR 自動創建的設置文件,不需要管他。4. 添加分組,方便管理代碼返回 IAR 界面,在工程里創建分組: 35 火框里填
47、入 “app” ,這樣就添加了一個 app 分組:在彈出來的如此繼續添加其他分組:common、cpu、drivers這些組用呢?現在就往里面添加源代碼文件,添加后,你就開始明白的。5. 把代碼文件放進分組把 fire_Kinetissrccommon 文件夾 下的 *.c 文件全部添加到 common 分組里: 36 火選中所有的 *.c 文件。如果你想把頭文件也放在工程里,也可以把 *.h 文件選中。 37 火添加后:common 里的都是提供的通用庫。再把 fire_Kinetissru 文件夾 下的 *.c和 crt0.s 文件添加到 cpu 分組里:別漏了還有 crt0.s 哦。cr
48、t0.s 是啟動文件,單片機上電復位后,就會執行里面的匯編代碼。再把 fire_Kinetissrcdrivers 文件夾下的 lptmr、 mcg、uar*.c 文件添加進工程了:og 子文件 里 38 火添加后:再在 fire_Kinetis srcprojects 下創建 fire_gpio_demo 文件夾,在fire_gpio_demo 文件下繼續創建main.c 、isr.c 和 isr.h 文件,往app 分組添加main.c 、isr.c 39 火然后在main.c 里寫個空的 main 函數:在 isr.h 文件里添加一下代碼:22. /* (C) COPYRIGHT 201
49、1 * 23. * 文件名:isr.h* 描述*:重新宏定義中斷號,重中斷向量表里的中斷函數地址,24.25.使其指向所定義的中斷服務函數。中斷服務函數警告:只能在vectors.c被包含,而且必須在vectors.h包含的后面!26.27.*:野火 kinetis 開發板 28. * 實驗庫版本 嵌入系統:29.30.31.*32.33.*作者 淘寶店:34.*技術支持:htt/_list.jsp?_id=100835.36.37.38.39.*/#ifndef ISR_H #define ISR_H 1/*重新定義中斷向量表 40. * 先取消默認的中斷向量元素宏定義#undef VECT
50、OR_ 41. * 在重新定義到自己編寫的中斷函數#define VECTOR_IRQHandler 40 18. void main()19. 20.21. 火* 例如:42.43.*#undef VECTOR_003先取消到中斷向量表里的中斷函數地址宏定義重新定義硬件中斷服務函數44.45.46.* #define VECTOR_003*/HardFault_Handler47.48.49.#endif/_ISR_HVECTOR_003在vectors.h 里已經定義了:default_isr#define VECTOR_003/* isr.h 結尾 */默認中斷向量表里大部分中斷地址都是
51、指向 default_isr ,所以要重新到自己的中斷服務函數。這個頭文件是用來重中斷向量表里的中斷函數地址,使其指向所定義的中斷服務函數。注意:這個頭文件只能在vectors.c中被包含,而且必須在vectors.h包含的后面被包含!即在vectors.c里,頭文件的包含順序為:關于中斷函數的編程和 isr.h 的作用,可以看:中斷函數的編寫方法最后,在 fire_Kinetissrcplatforms命名為 k60_fire.h :一份 k60_tower.h文件夾下,文件出來,在 fire_Kinetissrccommoncommon.h 里找到下面的代碼: 52. /* 41 50.
52、#include vectors.h /兩者順序不能換,如果換了,就不能重到指定的中斷函數地址 51. #include isr.h火#include k60_fire.h ,即注釋掉,并另外,DEBUG_PR在 fire_Kinetissrccommoncommon.h 和fire_Kinetissrcplatforms k60_fire.h 里都 有定義,應該注釋掉 k60_fire.h 里的定義在 fire_Kinetissrccommoncommon.h 添加數據類型的 typedef : 42 1. /*設置數據類型*/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 驅動和點亮 LEDKinetis 的編程步驟:開啟時鐘、復用管腳、設置頻率、設置功能在 fire_Kinetissrcdrivers 文件夾下 建立 gpio 文件夾,再在gpio 文件夾建立gpio.c 和 gpio.h把 gpio.c 添加進工程分組的drivers 里,在 gpio.c 里添加如下gpio 的驅動代碼:1.2.3.4.5.6.7.8.9.10./* (C) COPYRIGHT 2011*文件名描述:gpio.c:gpi
56、o 驅動函數實驗庫版本嵌入系統:野火 kinetis 開發板:作者淘寶店:11.*技術支持: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; /定義五個指針數組保存 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.*函數名稱:gpio_init功能說明:初始化 gpio參數說明:PORTxn IOdata端(PORTA,PORTB,PORTC,PORTD,PORTE)端口引腳引腳方向,0=輸入,1=輸出 輸出初始狀態,0=低電平,1=(對輸入無效)函數返回:無修改時間: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.*函數名稱:gpio_set 功能說明:設置引腳狀態63.64.65.*參數說明:PORTxn data端(PORTA,PORTB,PORTC,PORTD,PORTE)端口引腳輸出初始狀態,0=低電平,1=66.67.68.69.70.71.72.73.74.*函數返回:無修改時間: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/即類似執行:out_char(char)c); 6.7. 火斷言,其實就是一個宏定義:/* 注:野火修改過這里的代
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 員工入職關懷培訓
- 湖北省“黃鄂鄂”2025年高三下學期4月聯考試題 政治 含解析
- 工程施工員試題庫+答案
- 浙江省鎮海市鎮海中學2025屆高考英語倒計時模擬卷含解析
- 電力調度自動化維護員考試題(附參考答案)
- 河北省部分高中2025屆高三下學期4月質量檢測生物試題(原卷版+解析版)
- 測繪數據處理考核試卷
- 棉花倉儲物流成本控制策略考核試卷
- 玻璃行業綠色制造技術考核試卷
- 皮手套舒適性與人體工程學設計考核試卷
- 2024山西汾西礦業集團公司招聘300人公開引進高層次人才和急需緊缺人才筆試參考題庫(共500題)答案詳解版
- MOOC 電路分析基礎-杭州電子科技大學 中國大學慕課答案
- 教你成為歌唱達人智慧樹知到期末考試答案2024年
- JTG D70-2-2014 公路隧道設計規范 第二冊 交通工程與附屬設施
- 廣汽傳祺M8宗師版說明書
- T-CARM 002-2023 康復醫院建設標準
- 數控車床機器人自動上下料系統設計
- 工業機器人雙線碼垛工作站設計
- 各國材料對照表
- 生態安全的主要內容
- 浙江超鈉新能源材料有限公司高性能鈉離子電池材料零碳智能產線項目環評報告
評論
0/150
提交評論