手冊(cè)三天入門m4kinetisv最適合初學(xué)者Kinetis的教程_第1頁
手冊(cè)三天入門m4kinetisv最適合初學(xué)者Kinetis的教程_第2頁
手冊(cè)三天入門m4kinetisv最適合初學(xué)者Kinetis的教程_第3頁
手冊(cè)三天入門m4kinetisv最適合初學(xué)者Kinetis的教程_第4頁
手冊(cè)三天入門m4kinetisv最適合初學(xué)者Kinetis的教程_第5頁
已閱讀5頁,還剩423頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

三 隨著技術(shù)的發(fā)展,單片機(jī)型號(hào)越來越繁多,的難度也逐漸加多,學(xué)習(xí)周期自然不斷延長(zhǎng)。為了讓初學(xué)者快速,減少學(xué)習(xí)時(shí)間,尤其是為了那些參加智能車比賽而沒時(shí)間學(xué)Kinetis單片機(jī)朋友,我們特意寫Kinetis開發(fā)板的。野火Kinetis開發(fā),主要有IAR的使用、Kinetis啟動(dòng)流程講解、野火K60庫的調(diào)用三個(gè)部分組成。我們不再詳細(xì)講解寄存器,而且推薦直接調(diào)用我少的后顧之憂,可以加快的開發(fā)速度。目前,單片機(jī)型號(hào)如此之多,而產(chǎn)品的開發(fā)所允許給我們的時(shí)間越來越少,我們完全沒有必要深入研究寄存器設(shè)置,就算你能把寄存器背得滾瓜爛熟,過段時(shí)間不去接觸,還是沒法記住的。 自己重新建立自己的函數(shù)庫進(jìn)行開發(fā)。例如ST公司推出的ST庫,讓你可以完全不需 要建立自己的野火Kinetis庫的原因。野火K60庫的函數(shù)接口,盡量追求簡(jiǎn)潔明了、通俗易懂,力求初學(xué)者見其名就會(huì)用。目前提供了6個(gè)Kes板實(shí)驗(yàn)例程 ~~1三 我們喊出這樣 并不是吹的,已經(jīng)有兩位大三參加智能車的朋友(同一個(gè)隊(duì) 與k60庫三天時(shí)間內(nèi)就能把xs128上的 舵機(jī)控制程序移植到Kinetis上跑起來;一位大二的師弟,不到一天的時(shí)間就從到搞 頭ov7725和液晶LCD的移植??你會(huì)是下一位嗎只要我們敢拼,一切皆有可能?。。othingisimpossible?。。∮捎趥€(gè)人能力及時(shí)間所限,出錯(cuò)之處,在所難免,歡迎各 錯(cuò)誤及提出建議m—2012-3-們Technical~~2 三 前 Kinetis的啟動(dòng)分析(初學(xué)者大概瀏覽一下即可 初 :初始化函數(shù)啟動(dòng)執(zhí)行順 逐步提高:ROM、RAM啟動(dòng)工作原理、ICF文件講 IAR的使 安裝 建立IAR工 創(chuàng)建工程文 添加GPIO驅(qū)動(dòng)和點(diǎn)亮 IAR工程選項(xiàng)設(shè) 快速建IAR工 IAR使 功能介 工作區(qū)工程的選定與切 通過 并調(diào) 使用軟件仿真調(diào) IAR界面風(fēng)格設(shè) 野火 板實(shí)驗(yàn)例程列 野火K60庫的使 前 快速開發(fā)指 快 :了解野火Kinetis工 中斷函數(shù)的編寫方 重要變量、函數(shù)、宏定義一覽 安全檢 GPIO模 快 :GPIO庫使用方 GPIO測(cè)試?yán)?LED模 快速:LED庫使用方 LED綜合測(cè)試?yán)?~~3三 EXTI外部GPIO中斷例 快 :EXTI庫使用方 EXTI綜合測(cè)試?yán)?UART模 快 :UART庫使用方 UART綜合測(cè)試?yán)?ADC模 快 :ADC庫使用方 ADC綜合測(cè)試?yán)?DAC模 快 :DAC庫使用方 DAC綜合測(cè)試?yán)? 模 快 庫使用方 綜合測(cè)試?yán)?FTM輸入捕捉模 快 :FTM輸入捕捉庫使用方 FTM輸入捕捉中斷測(cè) PIT定時(shí)中斷模 快 :PIT定時(shí)中斷庫使用方 PIT定時(shí)中斷測(cè)試?yán)?、輸入捕捉、PIT中斷綜合測(cè) I2C模 快 :I2C通信庫使用方 I2C通信實(shí)驗(yàn)測(cè) lptmr低功耗定時(shí)器模 快 :lptmr低功耗定時(shí)器庫使用方 lptmr低功耗定時(shí)器測(cè)試?yán)?DMA模 快 :DMA傳輸端口數(shù) DMA測(cè)試?yán)?MCG模塊超 快 :MCG庫使用方 快 :配置頻 DSP數(shù)字信號(hào)處理單 CMSIS的介紹及其幫助文檔的查找方 DSP常用函數(shù)列 ~~4三 DSP測(cè)試?yán)?野火Kinetis開發(fā)板問題 資料在哪里可 到?(IAR、Jlink驅(qū)動(dòng) jlink供電到開發(fā)板 關(guān)于Kinetis時(shí) IAR報(bào)錯(cuò)找不到頭文 問 printf使用方 Kinetis單片機(jī)的IO口支不支持5V耐壓 Kinetis最多可以輸出多少個(gè)頻率不同 脈沖波 kinetis捕捉 脈沖計(jì)數(shù)方 ADC引腳中帶a、b表示的意 不帶有浮點(diǎn)單元能進(jìn)行浮點(diǎn)運(yùn)算嗎 ~~5 三 Kinetis的啟動(dòng)分析(初學(xué)者大概瀏覽一下即可初 :初始化函數(shù)啟動(dòng)執(zhí)行順上電復(fù) 中斷向量①

中斷向量表在vectors.c里定義,在vectors.h文件里,前兩Reset_Handler(自帶例程startup),第一個(gè)為起始SP棧指針、第二個(gè)為復(fù)位中斷Reset_Handler函數(shù)。

SECTION.noinit:EXPORTReset_Handler;初始化寄存 iimport ;調(diào)用C語言編寫的start函

start.c文件里定義,精簡(jiǎn)后的void{wdog_disable();//關(guān)閉看門 數(shù)據(jù)段、中斷向量表到sysinit();//時(shí)鐘初始化 /**main函數(shù)**/while(1);//避免停止運(yùn)行}main ④

段、以ramfunc 到RAM區(qū)(對(duì)flash操作的函數(shù)

voidsysinit{core_clk_mhz=pll_init(MCG_CLK_MHZ);trace_clk_init();//使能時(shí)鐘,用于調(diào)試fb_clk_init();//FlexBus時(shí)鐘初始化uart_init(FIRE_PORT,//printf函數(shù)所用到

}~~6三

初始化的整體 關(guān)閉看

清寄存

制中斷向量表到 動(dòng)修改中斷向量表地 為RAM里的地 分初始化數(shù) 清除RAM中初始化0的數(shù)據(jù)段把以ramfunc 子函數(shù).textrw到RAM初始化鎖相環(huán)到的串口 用戶任注:common_startup函數(shù)并沒 常量數(shù)據(jù).rodata、代碼.text。如果RAM啟動(dòng),代碼會(huì)直接編譯進(jìn)去RAM,掉電就會(huì)丟失數(shù)據(jù)。如果是ROM啟動(dòng),就會(huì)中斷向量表到RAM,設(shè)置中斷向量表地址為RAM的地址,以加快中斷響應(yīng)速度。~~7 三 逐步提高:ROM、RAM啟動(dòng)工作原理、ICF文件講ROM、RAM啟動(dòng),首先需要對(duì)器Ler如何分配內(nèi)存有一定的了解。最低內(nèi)存地址中斷向量代碼數(shù)據(jù)堆棧命令中斷向量代碼數(shù)據(jù)堆棧命令行參未初始化變量段常量段已初始化全局變量和靜態(tài)變量段.data程序運(yùn)行中由程序員調(diào)用malloc等函數(shù)來申請(qǐng)局部變局部變?cè)诤瘮?shù)內(nèi)部定義的非靜態(tài)的變量最高地inta=0;staticintb=20;char*p1;constintA=volatileconstintB={intb;staticintc=chars[]=char*p3=//.bss//代碼區(qū)//全局(靜態(tài)).datap1char*malloc(10//1020p2=(char*)strcpy(p1,17.地方。看后面IAR設(shè)置工程選項(xiàng)中Linker的設(shè)置~~8三 參考原文出處

-id-火那編譯到時(shí)候,編譯器是如何為這些變量數(shù)據(jù)分配地址的呢火 器Linker在發(fā)揮它的作用,它會(huì)根據(jù)配置文件,來為這些變量數(shù)據(jù)分配合適的地址,這樣我們就可以不需要考慮這些內(nèi)存分布就能寫出可運(yùn)行的碼編譯器對(duì)代碼進(jìn)行編譯,一般分為四個(gè)

編譯和

匯 匯編成

器Linker的配置文件都是由 在fire_Kinetis\build\configfiles文件夾下,你可以看到有很多的linker配置文件這里的文件是用來分配數(shù)據(jù)在內(nèi)存中的位置,配置ROM、RAM啟動(dòng),linker根據(jù)這些文件來為Kinetics4G的虛擬尋址空間地址。如果把代碼部分編譯進(jìn)RAM,那就是RAM啟動(dòng);如果把代碼數(shù)據(jù)編譯進(jìn)去ROM,那就是ROM啟動(dòng)(flash啟動(dòng))。不同的型號(hào),flash內(nèi)存大小不一樣,所以配置Linker文件也會(huì)不一樣,以為例~~9三 野火Kinetis 板自帶為MK60DN512,512KB的Programflash大小,128KB的SRAM大小,沒有FlexNVM和FlexRAM。K60的4G虛擬尋址空間就是按照內(nèi)存空間的映射圖來進(jìn)行配~~10三 如果要RAM啟動(dòng),我們要把代碼編譯進(jìn)SRAM_L,定義中斷向量表可以打開fire_RAM_K60N512.icf這個(gè)文件(用記事本打開就行),這個(gè)配置文件是參考128KB_Ram.icf來重新修改和添加了注釋。的配置文件寫得真的思路太亂了,如果你僅僅用ICF編輯軟件來配置的配置文件,是非常容易出錯(cuò)的!你必須要用ICF配置好后,還要打開配置文件來修改。野火已經(jīng)對(duì)配置文件進(jìn)行修改,在里面添加了很多注/*###ICF###SectionhandledbyICFeditor,don'ttouch!/*-Editorannotationfile-

define =define define = define define

= define define /****EndofICFeditorsection./****上邊是由ICF編輯,下面是由我們手動(dòng)配置****/ Kinetis的SRAM是分成兩塊的。define ;//SRAM是分成兩塊的,RAM2SRAM_U,RAM為define = -

ICFEDIT_region_RAM_start;defineexported VECTOR_TABLE ICFEDIT_intvec_start

//代碼編譯進(jìn)ROM,則0x defineexportedsymbol VECTOR_RAM= //前面RAMRAMUserVector VECTOR_TABLE的數(shù) defineexported BOOT_STACK_ADDRESS -/*決定代碼編譯的地址defineexported

+//代碼編譯進(jìn)ROM, +0x410 +0x410,+0x410,是前面的留給Vectordefinememorymemwithsize defineregion = ICFEDIT_region_ROM_enddefineregion = ICFEDIT_region_RAM_end

| region_RAM2_end~~11三 defineblockCSTACK withalignment=8,size=defineblock withalignment=8,size//手動(dòng)初始common_startup完

//堆,8字節(jié)對(duì)//棧,8字節(jié)對(duì)initializemanually{readwrite}; //未初始化數(shù)據(jù).bssinitializemanually{section.data}; //已初始化數(shù)據(jù)initializemanually{section.textrw donotinitialize{section.noinit defineblockCodeRelocate{section.textrw_initdefineblock msectiontextrw ceataddressmem: {vec//vectors.c中設(shè)置#pragmalocationintvec,告訴編譯器,這個(gè)是中斷向量表,編譯進(jìn)去.noinit段放在代碼開ceataddressmem: {readonlysection.noinit//crt0.s中設(shè)置了復(fù)位中斷函數(shù)為SECTIONnoinitCODE,即把代碼編譯編譯進(jìn)去RAMcein {readonly,blockCodeRelocate//把代碼編譯進(jìn)去RAM(調(diào)試用,掉電丟失,非調(diào)試,則設(shè)為cein {readwrite,block SP,把0x 內(nèi)容給PC。斷,用RAM的中斷向量表Linker根據(jù)icf配置文件來進(jìn)行分配內(nèi)

中斷向量代中斷向量代碼數(shù)據(jù)堆棧命令行參ROMBootloader中斷向量RAMBootloaderRAMBootloader中斷向量RAM配置寄存堆棧 ~~12三 如果是ROM啟動(dòng)(flash啟動(dòng)/*###ICF###SectionhandledbyICFeditor,don'ttouch!/*-Editorannotationfile-

define = define =define = :P-flashk256kD-flash :P-flashkdefine =//前面0x410RAM留給RAMUserVectorTabledefine

= define define =/****EndofICFeditorsection.###ICF###*/19./****ICF編輯,下面是由我們手動(dòng)配置define = define = ICFEDIT_region_RAM_startdefineexported VECTOR_TABLE ICFEDIT_intvec_start//代碼編譯進(jìn)ROM,則 ;RAM, defineexported VECTOR_RAM ICFEDIT_region_RAM_start//RAM留給RAMUserVectorTable,即這里的設(shè)置。所以減

VECTOR_TABLE的數(shù)據(jù) defineexported BOOT_STACK_ADDRESS -//0x2000FFF8;/*決定代碼編譯的地址defineexported +//+0x410,是前面的留給Vectormemorymemwithsize=region ICFEDIT_region_ROM_enddefineregion +0x410 ICFEDIT_region_RAM_end|

region_RAM2_enddefineblock withalignment=8,sizedefineblockHEAP withalignment=8,size=//common_startup完

initializemanuallyreadwrite //未初始化數(shù)據(jù)initializemanuallysection initializemanually{section.textrw};

58.donotinitializesectionnoinit defineblockCodeRelocate{section.textrw_initdefineblock m{section.textrw//把CodeRelocate代碼 到RAM中的CodeReloca m(對(duì)flash操作的函數(shù)必須這樣)ceataddressmem: {vec //vectors.c中設(shè)置#pragmalocationintvec",告訴編譯器,這個(gè)是中斷向量表,編譯進(jìn)去.intvec ceataddressmem: {readonlysection.noinit ~13火三 火ce{readonly,blockCodeRelocate //把代碼編譯進(jìn)去ROM調(diào)試用,非調(diào)試,則設(shè)為cein {readwrite,block blockCSTACK,blockHEAP

代碼編譯進(jìn)ROMLinker根據(jù)icf配置文件來進(jìn)行分配內(nèi)

到RAM,以 RAM的中斷向量ROMBootloader中斷向量中斷向量代碼數(shù)據(jù)命令行參RAMRAMBootloader中斷向量RAM配置寄存Code.bss和堆棧0x1FFF-前面的內(nèi)容,不知道大家是否都看懂呢?熟悉單片機(jī)的內(nèi)存分配,是每一個(gè)電子軟件工程師所必備的。如果對(duì)單片機(jī)的內(nèi)存分配都不了解,那就算會(huì)寫單片機(jī)的驅(qū)動(dòng)程序,也難以保證程序的質(zhì)量。那在IAR里,怎么知道編譯生成的文件的內(nèi)存圖?在工程選項(xiàng)里,設(shè)置生成mapfile就行:~~14三 設(shè)置好,編譯后,在fire_Kinetis\build\xxx_demo\xxx模式\List文件夾下就會(huì)有.map文件。 這里的內(nèi)容,就是ICF配置~~15火 三 火那什么是ICF編輯器呢呵呵,在工程名里右鍵——Options——

ICF編輯器,可以在里面設(shè)~~16三 ~~17 三 IAR的使野火推薦的是直接在野火提供的K60庫模版上添加 重建工程,但學(xué)會(huì)自己建立工程是必須的,這里給大家詳解建立IAR工程的步驟。一 安裝軟 的IARforARM為v6.30,支持 的Kinetics系列 地址 /folder/fautzfbt里的CD-EWARM-6301-二 安裝IAR詳細(xì)過后解壓文件,打 ,運(yùn)行安裝文件~~18三 選擇安裝IAREmbedded~~19三 選擇同意,然后點(diǎn)擊~~20三 需要打開軟 ,找 機(jī)文件,并運(yùn)行它按下任意鍵,會(huì)自動(dòng)打開license.txt文件,并提示:搜索"EWARM",找到所行的key~~21三 key上一行的Installserial即為我們這里所需要的Next后,填入key所在License~~22三 包括#號(hào)哦Next后,根據(jù)自己情況選擇安裝路徑設(shè)置「開始」菜單文件夾,還是繼續(xù)~~23三 經(jīng)過漫長(zhǎng)的等待噔噔噔噔??華麗麗地按個(gè)finish結(jié)束安裝~~24三 運(yùn)行IAR,語言選擇,按OK結(jié)IAR的編程界面~~25三 相對(duì)于KeilForARM、CodeWarrior而言,IAR forARM的編程界面是最簡(jiǎn)單的,~~26 三 三 安裝仿真器驅(qū)又換會(huì)原來的安裝導(dǎo)航界面:選擇Install野火Kinetics開發(fā)板,選擇了用jlink作為仿真調(diào)試器,因此這里選擇jlink運(yùn)行安裝文~~27三 運(yùn)行后,會(huì)自動(dòng)安裝驅(qū)動(dòng),不會(huì)有其他另外,為了可以使用擦 等功能,我們可以選擇用segger公司的j-~~28三 安裝時(shí),一路狂Next就行…安裝后,在開始菜單里找到J-FlashARM,運(yùn)行它即~~29三 建立IAR工程創(chuàng)建工程文件一 準(zhǔn)備材在建立IAR工程前,需要 的Kinetis例程,提取里面的配置文件和地址解壓后,打 ,會(huì)看到兩個(gè)文件二 建立IAR工程過在這里,我們以GPIO為例子,點(diǎn)亮LED,一步步操作,講解建立工程的詳細(xì)程建立工作空File——New——~~30三 建立工 ~~31三 接著在彈出來 框里選擇空的工程,點(diǎn)擊確~~32三 接著彈出選擇保存工程 框。由于我們還沒建保存工程的文件夾,我們就接 框里新建:右鍵——新建——文件夾——重命名為打開新建的fire_Kinetis文件夾,再建一個(gè)build文件夾,build文件里再建一個(gè)gpio_demo文件夾,把工程文件保存在gpio_demo文件夾里面,工程文件名為fire_gpio_demo,文件結(jié)構(gòu)如下圖:~~33三 保存后,進(jìn)入IAR界面,別忘了工作區(qū)還沒有保存哦。在菜單欄里找到圖 點(diǎn)擊保存全部文件,把工作區(qū)文件保存在fire_Kinetis文件夾下,名fire_Kinetis~~34三 這樣,一個(gè)空的IAR工程骨架就建立完畢…往工程添加 自帶函數(shù)例程文件夾下的文件夾srcfire_Kinetis文件夾下 例程文件夾KINETIS512_SC\build\iar下的文件iar.h和文件夾configfiles 到fire_Kinetis\build文件夾下。呵呵,怎么會(huì)多了個(gè)settings呢?這個(gè)是保存IAR自動(dòng)創(chuàng)建的設(shè)置文件,添加分組,方便管理代返回IAR~~35三 在彈出來 框里填入“app”,這樣就添加了一個(gè)app分組如此繼續(xù)添加其他分組:common、cpu、這些組有什么用呢?現(xiàn)在就往里面添加源代碼文件,添加后,你就開始明把代碼文件放進(jìn)分fire_Kinetis\src\common文件夾*.c文件全部添加到common分組里~~36三 選中所有的*.c文件。如果你想把頭文件也放在工程里,也可以把*.h文件選中~~37添加后

三 common里的都 提供的通用庫再把fire_Kinetis\src\cpu文件夾*.ccrt0.s文件添加到cpu分組里別漏了還有crt0.s哦。crt0.s是啟動(dòng)文件,單片機(jī)上電復(fù)位后,就會(huì)執(zhí)行里面的再把fire_Kinetis\src\drivers文件夾下的lptmrmcg、uart、wdog子文件*.c文件添加進(jìn)工程了~~38三 添加后再在fire_Kinetis\src\projects下創(chuàng)建fire_gpio_demo文件夾,在fire_gpio_demo文件下繼續(xù)創(chuàng)建main.c、isr.cisr.h文件,往app分組添加main.c、isr.c~~39三 然后在main.c里寫個(gè)空的main函數(shù)voidvoid{21.在isr.h文件里添加一下代22.22./*******************(C)COPYRIGHT::::*#ifndef#defineISR_H *先取消默認(rèn)的中斷向量元素宏定 #undef*在重新定義到自己編寫的中斷函 #define ~~40*

三 **#define#defineVECTOR_003 vectors.h里已經(jīng)定義了47.#endif//49/*isr.h結(jié)尾

#undef #define#defineVECTOR_003 中斷服務(wù)函數(shù)。注意:這個(gè)頭文件只能在c.ceco.eco.c""#include關(guān)于中斷函數(shù)的編程和isr.h的作用,可以看:中斷函數(shù)的編寫方最后,在fire_Kinetis\src\ tforms文件夾下, 一份k60_tower.h文件出來,命名為k60_fire.h:在fire_Kinetis\src\common\common.h里找到下面的代52.52.~41三 *Include tformspecificheader#if#include#elif#include#include#elif#include#error"No

tform . short long short 注釋掉,并插入#includek60_fire.h",65.*Include tformspecificheader#if#include//#include//#include#include#elif#include#error"No tform77. 另外,DEBUG_PRINT在fire_Kinetis\src\common\common.h /*/*Globaldefinestouseforallboardsfire_Kinetis\src\common\common.h添加數(shù)據(jù)類型的typedef~~42 三 添加GPIO驅(qū)動(dòng)和點(diǎn)亮Kinetis的編程步驟:開啟時(shí)鐘、復(fù)用管腳、設(shè)置頻率、設(shè)置功能fire_Kinetis\src\drivers文件夾下建立gpio文件夾,再在gpio文件夾建gpio.cgpio.c添加進(jìn)工程分組的drivers里,在gpio.c里添加如下gpio的驅(qū)動(dòng)代碼1./*****************(C)COPYRIGHT*文件 *描 **實(shí)驗(yàn)平 *庫版 *嵌入系 * *作 *淘寶 *技術(shù)支持 12.#include#includeE_PTR,PTD_BASE_PTR,PTE_BASE_PTR};//定義五個(gè)指針數(shù)組保存GPIOx的地址volatilestructPORT_MemMap21.22.****參數(shù)說明 端 輸出初始狀態(tài),0=低電平,1=(對(duì)輸入無效**修改時(shí)間:2012-1- * 注33.voidgpio_init(PORTxportx,u8n,IOcfg,u8{ASSERTn32u)&&data2u~~43

三 //PORTx_PCRx,每個(gè)端口都有個(gè)寄存器if(cfg=={GPIO_PDDR_REG(GPIOx[portx| if(data=={GPIO_PDOR_REG(GPIOx[portx|1<<n {])}}GPIO_PDDR_REG(GPIOx[portx& }*****參數(shù)說明 **修改時(shí)間:2012-1- * 注voidgpio_set(PORTxportx,u8n,u8{ASSERTn32u)&&data2uif(data==GPIO_PDOR_REG(GPIOx[portx| GPIO_PDOR_REG(GPIOx[portx& 78.在gpio.h里添加變量和函數(shù) #ifndef#ifndefGPIO_H #define typedefenum ~~44

三 typedefenum { #defineHIGH#define externvolatilestructGPIO_MemMapexternvolatilestructPORT_MemMap*PORTX[5];25 gpio_init(PORTxu8n,IO,u8 26.void (PORTx,u8n, u8data); 28.然后main#include#includelptmr.h"http://GPIOLED

* 注:野火Kinetis開發(fā)板的LED0~3,分別接PTD15~PTD12,低電平點(diǎn)voidgpio_init(PORTD,15,GPO,HIGH);//PTD15,LED0

//設(shè)置PTD15輸出低電平即LED0//設(shè)置PTD15輸出高電平即LED0~45O(∩_∩)o哈哈,添加好文件了,現(xiàn)在需要配置工程了,不然編譯~45三 IAR工程選項(xiàng)設(shè)IAR的工程選項(xiàng)分成兩個(gè):Debug模式Release模式,一個(gè)是調(diào)試模式,一這樣,在調(diào)試的時(shí)候,我們選擇Debug;發(fā)布產(chǎn)品或者比賽的時(shí)候,我們選擇Release,切換起來非常方便。 有時(shí)會(huì)發(fā)現(xiàn)他們并沒有Debug模式和Release模式,取而代之的是ROM模式、RAM模式、flash模式等等,這些都是可以自行修改的:ProjectEditConfigurations來的界面里選擇:new后~~46三 注意,從Debug模式切換到Release模式,會(huì)經(jīng)常出現(xiàn)各種異常的編譯錯(cuò)誤或者運(yùn)行異常,這是因?yàn)镽elease有更嚴(yán)格的檢查,詳細(xì)情況,可看:在IAR的Workspace窗口頂部的下拉菜單中有兩個(gè)選項(xiàng).pdf網(wǎng)上共享的工程模版,改名字后的,他們大部分都是基于Debug模式的,就是怕用戶編Debug模式的優(yōu)化效果不如Release模式,如果我們的程序編程是沒Debug,就不怕把模式調(diào)到Release模式,只不過是在Debug模式下,會(huì)隱藏了一些錯(cuò)誤而讓我們覺得編譯通過了。也有時(shí),debug模式里會(huì)添加一些延時(shí),所以有時(shí)候在Release模式下延時(shí)。就用ebug模式來講解:在工作區(qū)程名上:右鍵——~~47三 然后就會(huì)看到選項(xiàng)框~~48三 記住,是在工程名里右鍵,不要在分組名里右鍵哦,不然彈出 框不是設(shè)工程的如果選擇了分組里的選項(xiàng),則顯~~49三 好了,現(xiàn)在言歸正傳,開始配置工程選項(xiàng)了GeneralOptions—— 設(shè) 型~~50三 野火Kinetis開發(fā)板選擇的默 為在這里,我們選擇~~51三 GeneralOptions—— ~~52三 我們編譯工 到單片機(jī)上的,當(dāng)然選擇C/C++Compiler——Optimizations優(yōu)化等級(jí)在Debug模式里,這里設(shè)為不優(yōu)化,便于調(diào)試方便。事實(shí)上,在調(diào)試的時(shí)候,如Release模式里,可以選擇最大優(yōu)化,但在發(fā)布前,需要對(duì)優(yōu)化后的效果進(jìn)行~~53三 C/C++Compiler——PreprocessorAdditionalincludedirectories:(oneperline)文本編輯框里填83. 在這里在的文件夾,預(yù)處理器編譯的時(shí)候,就會(huì)搜索這些文件夾, 表示Definedsymbols:(oneperline)文本編輯框里填入~~54

三 這里是用來宏定義變量,對(duì)整個(gè)工程有效,相當(dāng)于在頭文件#define#define#define#define注意:如果在Definedsymbolsoneperline這里填入了DEBUG,那就要注釋掉fire_Kinetis\src\common\common.h里面DEBUG的宏定義。OutputConverter——Output這里可以設(shè)置編譯代碼后,把代碼轉(zhuǎn)化成其他格式,我們?cè)O(shè)置轉(zhuǎn)換為hex格~~55三 Linker—— 器配置Linkerconfigurationfile里勾中Overridedefault,重新打開Linker配置文件,在fire_Kinetis\build\configfiles文件里就有多個(gè)Linker配置文件。Linker配置文件,里面設(shè)置了Kinetis 是從ROM啟動(dòng)還是從RAM啟動(dòng),堆棧野火Kinetis開發(fā)板選擇的默 為K60N512LQV100,512KBFlash128KBSRAMDebug模式,如果你想從RAM啟動(dòng),則選擇128KB_Ram.icf;如果先從ROM啟動(dòng),可512KB_Pflash.icf或者256KB_Pflash_256KB_Dflash.icf,兩者的區(qū)別就在于,后512KBFlash分一半出來,作為保存其他數(shù)據(jù)用,而不是全部用來保存程序代碼~~56火三 火Release模式,肯定是從ROM啟動(dòng),即可512KB_Pflash.icf或者256KB_Pflash_256KB_Dflash.icf。而Release模式因?yàn)闆]有調(diào)試信息,所以是不能使用jlink等調(diào)試器來Debug的。運(yùn)行,建議還是修改成相對(duì)地址: 表示IAR工程所在 表示Linker——Automaticruntimelibrary 庫跟預(yù)處理時(shí)設(shè)置頭文件所在的文件夾一樣,這里是設(shè)置庫所在的文件~~57三 如果用到其他已經(jīng)編譯好的庫,那就把庫所在的文件夾添加進(jìn)Linker 優(yōu)化~~58三 在這里,我就不選擇優(yōu)化Linker 可以生成關(guān)于內(nèi)存分布、編譯后生成文件的大小等各種信息的文~~59三 勾上Geerelermpfieebg模式為例,在工程的文件夾下生成:fe_Kiesbdgpo_demoebgList\fe_gpo_demo.mp文件,打開~~60三 里面有很多詳細(xì)的信息,方便我們了解工程編譯后內(nèi)存的使用情況Debugger 在Driver里有多種可供選擇的調(diào)試方式。野火Kinetis開發(fā)板配置了jlink 可供調(diào)試,因此可以在這里選擇J-Link/J-Trace;如果想軟件仿真,那可以選擇Simulator。即硬件調(diào)試,選擇J-Link/J-Trace;軟件仿真,選擇Simulator~~61三 如果是在Release模式,那就不要選擇軟件仿真SimulatorDebugger ,需要勾上Useflashloader,不然 Jlink則不需要也~~62三 J-Link/J-Trace ~~63三 J-Link/J-Trace—— Jlink連接設(shè)~~64火 三 火這里可以選擇Jlink 方式:JTAG和IAR重要的設(shè)置就介紹得差不多了,相信各位會(huì)配置了吧?o(∩_∩)o哈哈Warning[Pa082]:undefinedbehavior:theorderofvolatileaccessesisundefinedinthisstatement提示警告的代碼為printf(printf("Flashparameterversion原因很簡(jiǎn)單,F(xiàn)TFL_FCCOB4,FTFL_FCCOB5,FTFL_FCCOB6,FTFL_FCCOB7這些量都定義為volatile,這樣調(diào)用, 舉個(gè)例intsquare(volatileint{return*ptr* 編譯器將產(chǎn)生類似下面的代碼intsquare(volatileint{inta=b=returna*

正確的代碼應(yīng)該是longsquare(volatileint{inta=}returna*這 一次,}returna*~~65三 快速建IAR工程IAR的工程,只需要建立一次之后,保存好設(shè)置,下次建立工程,僅僅需要修改在fire_Kinetis\build文件下,找到我們已經(jīng)建好的gpio_demo工程文件夾,里面把gpo_demo工程文件夾 一份在原來的文件夾下,改名為自己喜歡的工程字如xxx_demo:打開xxx_demo,刪掉里面的文件夾,把其他文件改名為自己喜歡的名字,例~66fire_xxx_demo,記得保留后綴。~66三 然后在IAR的工作區(qū)里添加工程就行(當(dāng)然,你也可以新建工作區(qū))這樣就可以不需要重新設(shè)置就建立好新~~67IAR使用

三 其實(shí)在打開IAR軟件的時(shí)候,已經(jīng)彈出了IAR使 界面給你 用戶指

飛 Kinetis系列的例程~~68三 提供的都是英文版的,提 英語水平的時(shí)候有到了野火就來個(gè)中文版的簡(jiǎn)單介紹吧,當(dāng)然遠(yuǎn)不 的介紹那么詳細(xì)功能介IAR 包含新建保 功能、查找替換功能、跳轉(zhuǎn)功能、編 功能與其他編譯器項(xiàng)目,IAR 功能簡(jiǎn)單,容易上新建保存功能為~~69三 :新建空白文:打開文:保存文件 :保存所有文件 :剪切

:粘:打:撤:恢查找替換功能為

:查找內(nèi)容,這里為查找fire文:查找上一:查找下一:查:替跳轉(zhuǎn)功能為:光標(biāo)跳到指定行列:設(shè)置書簽:調(diào)到下個(gè)書簽:跳回上個(gè)頁面:跳到下個(gè)頁面編譯功能為譯當(dāng)前文件編譯整個(gè)工程

:取消編置斷 : 載并調(diào) : ,直接調(diào)~~70 三 工作區(qū)工程的選定與切換在IAR里,一個(gè)工作區(qū)可以有多個(gè)工程。如

如果用上圖下面的選框來切換工程~~71三 通過 并調(diào)設(shè)置工程選 方式為:J-Link/J-Jlink有兩 方式:JTAG和~~72三 并調(diào)試或者 然后就進(jìn)入調(diào)試界面~~73三 調(diào)試 :復(fù):暫:步過,執(zhí)行函數(shù),不進(jìn)入函數(shù):步進(jìn),跳進(jìn)函數(shù):步出,跳出

:下一條語:跳到光標(biāo)所指向的:全速運(yùn):退出調(diào)在菜單欄里選擇view,就可以看到很多的調(diào)試工~~74三 如果想看變量的值,可以直接光標(biāo)選中該變量,然后右鍵——addto調(diào)試功能跟其他編譯器類用 進(jìn)入安全保護(hù)狀態(tài),就需要擦 就才能繼續(xù)燒寫程序,燒寫時(shí)會(huì)提示~~75三 由于野火在使用Kinetis過程中,還沒出現(xiàn)過這問題。為此,特意網(wǎng)上找到一個(gè) 在使用JLINK給K60燒寫程序時(shí),如果 被鎖如何處理?用J-LinkCommander看看能不能找到M4內(nèi)核,如果能找到,在運(yùn)行的J-LinkCommander里面,敲入以下命令:UnlockKinetis。然后回車,就能 原文出處 Q群中,野火與其他人交流時(shí),發(fā)現(xiàn)鎖住的比較多是用CW編譯器的,較少是IAR,而野IAR,當(dāng)然也有可能CW的人比較多吧。另外,也不要用帶USB3.0USB接口來Jlink、BDM等器,容易出錯(cuò),甚至不了。使用軟件仿真調(diào)要使用仿真調(diào)試,首先就要在選項(xiàng)里設(shè)置調(diào)試器為軟件仿真~~76三 另外還要 鎖相環(huán)時(shí)鐘設(shè)置和串送,不然仿真的時(shí)候,會(huì)卡在死循不能繼續(xù)調(diào)試。首先,在common.h里添2. 3. #define#defineprintf.h里修改printf函數(shù),即把下面代碼printf(constchar*fmt,{va_listintinfo.dest=DEST_CONSOLE;info.func=&out_char;~~77三 *Initializethepointertothevariablelengthargumentva_start(ap,rvalue=printk(&info,fmt,*Cleanupthevariablelengthargumentreturn21.修改為#ifdef //禁用printf(constchar*fmt,{return6.printf(constchar*fmt,{va_listintPRINTK_INFOinfo.dest=info.func=

即添加*Initializethepointertothevariablelengthargumentva_start(ap,rvalue=printk(&info,fmt,*Cleanupthevariablelengthargumentreturn#endif這樣就可以使用仿真了。如果不是仿真 燒寫 上,記得注釋common.h里的Simulator31. 31. 方方式跟jlink一樣,直接點(diǎn)擊的按鈕~~78 三 IAR界面風(fēng)格設(shè)計(jì)在菜單欄——Tools——~~79三 ~~80 三 野火 模實(shí)151編程風(fēng)格的GPIO實(shí)驗(yàn)輸251編程風(fēng)格的GPIO實(shí)驗(yàn)輸入輸出測(cè)3GPIO實(shí)驗(yàn)簡(jiǎn)單測(cè)4GPIO實(shí)驗(yàn)并行讀寫測(cè)5GPIO實(shí)驗(yàn)綜合測(cè)6LED綜合測(cè)7EXTI綜合8串口發(fā)送例9串口串口ADC綜合DACLEDDAC實(shí)驗(yàn)萬用表測(cè)DAC實(shí)驗(yàn)ADC實(shí)驗(yàn)示波器簡(jiǎn)單LED測(cè)試FTM輸入捕捉中斷測(cè)PIT定時(shí)中斷測(cè)試?yán)⑤斎氩蹲?、PITLPT脈沖PIT定LPTDMAGPIO數(shù)據(jù)實(shí)I2C通信實(shí)~~81 三 配置系統(tǒng)頻 SDHC帶文件系統(tǒng)操 CMSIS庫cos、sin測(cè)試實(shí)~~82 三 K60前想快速上手K60單片機(jī)嗎?野火KinetisK60庫,是你最好的選擇:簡(jiǎn)單的調(diào)用函數(shù)接口,良好的編程風(fēng)格,讓你可以不了解寄存器配置的情況下快速Kinetis 快,寄存器越來越多,就算你能完全記住51的所有寄存器,但你能記得所有的Kinetis系列的寄存器嗎?現(xiàn)在的發(fā)展方向是單片機(jī)功能越來越強(qiáng)大,寄存器越來越復(fù) 野火KineticsK60庫,盡可能地把底層的驅(qū)動(dòng)完善,用戶可API接口,而不必慢慢對(duì)著datasheet來研究。例如UART、FTM、I2C等模塊,函數(shù)內(nèi)部會(huì)根據(jù)當(dāng)然main函數(shù)里中途更改時(shí)鐘頻率,就需要重新初始化,以便重新計(jì)算和選野火KineticsK60庫,部分功能的實(shí)現(xiàn),提供了兩種或兩種以上的實(shí)現(xiàn)方法,一在編寫庫的工程中,部分代碼參考了其他人例程,在KineticsK60庫代碼中都有備注。代碼會(huì)不斷更新,不一定更新到上,如果與代碼有相互不由于個(gè)人能力及時(shí)間所限,出錯(cuò)之處,在所難免,歡迎各位錯(cuò)誤及提出建議m—淘寶地址—~~83快速開發(fā)指南

三 快 :了解野火Kinetis工Kinetisconfig

模版工程的app文

~~84 三 頭文件作通用配置同文件,與其他工程共用的通工程頭文件,用于針對(duì)特定的工程的配置和包含底層動(dòng)頭文件工程的中斷配置頭文野火整理出來的快速復(fù)用管腳設(shè)置配置時(shí)鐘和開發(fā)板選打開fire_Kinetis文件

IR工程模版工區(qū)工程 作件IARfire_Kinetis\buildIAR工程文件夾。使用過IAR的應(yīng)該知道IAR里可以建立一~~85三

工作我們現(xiàn)在就是要把所有的工程文件都放在這個(gè)fire_Kinetis\build文件夾里打開另外,fire_Kinetis\build文件夾里還有configfiles文件夾iar.h文件configfiles文件夾里放的就是linker配置文件~~86三 iar.h是用來專門配置IAR編譯的頭文件,這里實(shí)際上沒用到所有的源代碼文件都放在這里

如printf函數(shù)。野火編寫的Kinetis例 這個(gè)工作區(qū)里,包含了多個(gè)工程,用IAR~~87三 里面有包含多個(gè)工程,按照工程的上下順序?qū)W習(xí),就可以容易熟悉野火K60庫工程 用戶應(yīng)用文件放在fire_Kinetis\src\app文件夾例程的應(yīng)用文件放在fire_Kinetis\src\projects\fire_xxx_demo文件夾~~88 三 野火K60庫,本身已經(jīng)設(shè)置了默認(rèn)的各個(gè)模塊通道所對(duì)應(yīng)的管腳。其實(shí)就fire_Kinetis\src\drivers\fire_drivers_cfg.h文件里進(jìn)行設(shè)腳,不需要修改函數(shù)。~~89 三 中斷函數(shù)的編寫飛 公司提供的模版里,已經(jīng)提供有中斷函數(shù)的參考注釋主要用到fire_Kinetis\src\cpuvectors.cvectors.h文件,這兩個(gè)用來定義中斷向量表和定義了一個(gè)默認(rèn)的中斷服務(wù)函數(shù)。vectors.c里vectors.h文件里~~90三 默認(rèn)的定def_r默認(rèn)的中斷向量服務(wù)函數(shù)里。有時(shí)候,我們的程序運(yùn)行異常,不妨打開串口助手,看看是不是跑到defa_r服務(wù)函數(shù)里,如果是,那往往都是代碼有bu。為了重新映射中斷到指向我們指定的中斷向量服務(wù)函數(shù)里,我們建立isr.hisr.c兩個(gè)文件來重映射中斷向量指針和編寫中斷向量服務(wù)函~~91三 在isr.h文件里,可以看到野火K60模版里已經(jīng)在注解上寫了參考模版,依葫#define****ISR_H#define****ISR_H1#define#defineextrenvoid17.17.#endif//19./*Endof"isr.h"**11.具體例子,可參**11.FTM輸入捕捉中斷測(cè)PIT定時(shí)中斷測(cè)試?yán)⑤斎氩蹲?、PIT中斷綜合~~92 三 重要變量、函數(shù)、宏定義一覽表重要的全部變量列名功能說內(nèi)核時(shí)鐘內(nèi)核時(shí)鐘總線時(shí)中斷向重要的全局宏定義列名功能說定義Debug模定義輸出調(diào)試信定義系統(tǒng)頻定義軟件仿重要的函數(shù)列表名功能說串口輸設(shè)置鎖在工程選項(xiàng)那里定

~~93三 功能說用來定義進(jìn)入DEBUG如果定義了,則會(huì)輸出一些調(diào)試信息,執(zhí)行一些防錯(cuò)誤的檢測(cè),否則取消這些動(dòng)例如:使用斷言,可以幫助我們?cè)谡{(diào)試的時(shí)候檢查函數(shù)傳遞的參數(shù)是否正當(dāng)我們發(fā)布的時(shí)候,就需要取消這些檢common.h里定定1.1.#define~~94功能

三 用來定義是否通過串口顯示調(diào)試信息printf.c函數(shù)原

voidsysinit{uart_init(FIRE_PORT,}//printf(constchar*fmt,要使用printf,需要定義printf的輸出信息,在k60_fire.h里注 這里是定義了輸出的端口和波特率,然后在sysinit.c文件里的sysinit函數(shù)里調(diào)用功能說通過串口發(fā)送數(shù)據(jù)重定printf函數(shù)是可以重映射輸出的,在printf.c里有printf函數(shù)intprintf(constchar*fmt,{PRINTK_INFOinfo.func=rvalue=printk(&info,fmt,~~959.

三 intprintk(PRINTK_INFO*info,constchar*fmt,va_list{for(p=(char*)fmt;(c=*p)!=0;{printk_putc(c,&count,//c傳遞給}11.voidout_char(char{}printk里printk_putc里staticvoidprintk_putc(intc,int*count,PRINTK_INFO{7.out_char函數(shù)在io.c里定義綜上所述,要重映射輸出,有兩種printf函數(shù)里把info.func改為其他函數(shù)地址 info.func 修改out_char函數(shù)里的輸出函數(shù),例如改為L(zhǎng)CD輸出為了加強(qiáng)程序的健壯性,減少bug,野火為此而在程序里添加了一些安全措施方便在調(diào)試階段就能檢查出錯(cuò)誤,消滅bug斷言相信現(xiàn)在還存在著很多連斷言是什么都不知道的軟件工程師,更別說是初學(xué)者了~~96 三 斷言,其實(shí)就是一個(gè)宏定提提供例子是不一樣的/*注:野火修改過這里的代碼////如果斷言條件不成立,進(jìn)入了錯(cuò)誤狀態(tài),就會(huì)打印錯(cuò)誤信息和用LED來顯示////用流水燈來指示進(jìn)入錯(cuò)誤狀U例如傳遞給函數(shù)的變量取值范圍是否正確。例如在AC模塊里,可以看到很多函數(shù)的開頭都有這樣一個(gè)語句:////使用斷言檢 _CHn是否正如果傳遞錯(cuò)誤的參量,就會(huì)出錯(cuò),在串口里可以看到錯(cuò)誤的位這樣在調(diào)試階段,我們就能發(fā)現(xiàn)傳遞給函數(shù)的變量是不是超出了范圍,在調(diào)試段就解決bug~~97typedef{ typedef{ 關(guān)于斷言的使用, 的《高質(zhì)量C編程指南》里提取了一段斷言的使用則程序一般分為Debug版本和Release版本,Debug版本用于內(nèi)部調(diào)試版 給用戶使用斷言assert是僅在Debug版本起作用的宏,它用于檢查“不應(yīng)該”發(fā)生的情況【規(guī)則6-5-1】使用斷言捕捉不應(yīng)該發(fā)生的情況。不要情況與錯(cuò)誤【規(guī)6-5-2】在函數(shù)的處,使用斷言檢查參數(shù)的有效性()【建議651】在編寫函數(shù)時(shí),要進(jìn)行反復(fù)的考查,并且自問:“我打算做哪些【建議652】一般教科書都鼓勵(lì)程序員們進(jìn)行防錯(cuò)設(shè)計(jì),但要記住這種編程風(fēng)要使用斷言進(jìn)行。枚舉序員可以及時(shí)發(fā)現(xiàn)錯(cuò)誤和修正錯(cuò)誤。滅b。ADC.h文件如果打開其他如果打開其他網(wǎng)絡(luò)上共享的工程會(huì)發(fā)現(xiàn)他們往往都是使用宏定義,但宏~~98三 師來說,對(duì)程序的安全性進(jìn)行檢測(cè),那是一1.1.void ,ADC_Ch舉個(gè)例子告告~~99GPIO模塊

三 快 :GPIO庫使用方形參變 名及其作形參變作取端口PORTA,PORTB,PORTC,PORTD,n引腳輸入輸出配GPI,GPO,GPI_DOWN,GPI_UP,GPI_PF,GPI_DOWN_PF,GPI_UP_PF, GPO_HDS_SSR。數(shù)常用枚舉列名功能說端管腳輸入輸出配函數(shù)列函數(shù)名函數(shù)功初始化設(shè)置引腳狀反轉(zhuǎn)引腳狀獲取IO宏定義列宏定功能說設(shè)置引腳輸出電平(這里的x要替換成A~E,n要替換為0~31的數(shù),表示對(duì)應(yīng)的例如引腳輸入電平(這里的x要替換A~E,n要替換為0~31的數(shù),表示對(duì)~~100

引腳號(hào)火( 這里的x要替換(例如設(shè)置8位引腳輸出電平(這里的x要替換A~E,n要替換0~3的數(shù),表示對(duì)應(yīng)的8位引腳號(hào))例如PTA_BYTE0_OUT表示PTA7~PTA0PTA_BYTE1_OUT表示PTA15~PTA8PTA_BYTE2_OUT表示PTA23~PTA16PTA_BYTE3_OUT表示PTA31~設(shè)置8位引腳輸入電平(這里的x要替換A~E,n要替換0~3的數(shù),表示對(duì)應(yīng)的8位引腳號(hào))設(shè)置8位引腳輸入輸出方向(這里的x要替換成A~E,n要替換為0~3的數(shù),表示對(duì)應(yīng)的8位引腳號(hào))換成A~E,n要替換為0~1的數(shù),表示對(duì)應(yīng)的16位引腳號(hào))例如PTA_WORD0_OUT表示PTA15~PTA0PTA_WORD1_OUT表示PTA31~PTA16設(shè)置16位引腳輸入電平(這里的x要替換成A~E,n要替換為0~1的數(shù),表示對(duì)應(yīng)的16位引腳號(hào))要替A~E,n要替換為0~1的數(shù),表示對(duì)應(yīng)的16位引腳號(hào))獲取IO狀態(tài)寫1位數(shù)據(jù)1位數(shù)2位數(shù)2位數(shù)4位數(shù)~~1014位數(shù)8位數(shù)4位數(shù)8位數(shù)8位數(shù)16位數(shù)16位數(shù)枚舉定

enum{枚舉作用來定義端枚舉定

typedefenumGPIO_CFG |GPI_PF|GPI_PF16.=|枚舉作用來定義GPIO管腳輸入輸出的配置~~102三 常用的就前面五種,例如輸入濾波,可用著按鍵上,可以設(shè)置為上拉下拉外部電阻函數(shù)詳解函數(shù)原

1.1. gpio_init(PORTxu8nGPIO_CFG,u8 功能說初始化gpio,設(shè)置端口的輸入輸出方向,輸出數(shù)據(jù)。初始化后,才能對(duì)IO口進(jìn) 調(diào)用例函數(shù)原

4.4. gpio_set(PORTx,u8n,u8 功能說設(shè)置IO口電平,需要先初始化GPIO端口為輸出方向調(diào)用例5.5. //PTA27=函數(shù)原

//PTA27//初始化PTA266.6. gpio_turn(PORTx,u8 功能說翻轉(zhuǎn)IO口電傳遞參參考形參變 名及其作用~~103函數(shù)無調(diào)用

三 7.7. 函數(shù)原

8. (PORTx,u8 功能說引腳狀傳遞參參考形參變 名及其作用函數(shù)返返回1bit的端口電平狀調(diào)用例9.9. //PTA27=宏定義功能說

設(shè)置電平輸出。這個(gè)是通用顯示名字而已,實(shí)際上這里的x要替換成A~E的,n要替換為0~31的數(shù),表示對(duì)應(yīng)的引腳號(hào),例如調(diào)用例子舉 PTB16_OUT1;//PTB16PTE28_OUT0;//PTE28~~104 三 功能說電平輸入。這個(gè)是通用顯示名字而已,實(shí)際上這里的x要替換成A~E的端n要替換為0~31的數(shù),表示對(duì)應(yīng)的引腳號(hào),例如PTA0_IN調(diào)用例子舉 data=PTB16_IN;data=PTE28_IN;功能說

設(shè)置引腳輸入輸出方向。這個(gè)是通用顯示名字而已,實(shí)際上這里的x要替換A~E,n要替換為0~31的數(shù),表示對(duì)應(yīng)的引腳號(hào)。例如調(diào)用例子舉功能說

設(shè)置8位引腳輸出電平(這里的x要替換成A~E,n要替換為0~3的數(shù),表示對(duì)應(yīng)的8位引腳號(hào))調(diào)用例子舉PTA_BYTE0_OUT=0x12PTA_BYTE0_OUT=0x12//表示PTA7~ 8位輸出PTA_BYTE1_OUT=0x12//表示PTA15~ 8位輸出PTA_BYTE2_OUT=0x12//表示PTA23~PTA168位輸出PTA_BYTE3_OUT=0x12//表示PTA31~PTA248位輸出功能說

設(shè)置8位引腳輸入電平(這里的x要替換成A~E,n要替換為0~3的數(shù),表示對(duì)應(yīng)的8位引腳號(hào))~~105火調(diào)用例子舉chardata=PTA_BYTE0_IN//表示PTA7~ 8位數(shù)據(jù)輸入到data變data=PTA_BYTE1_IN//表示PTA15~ 8位數(shù)據(jù)輸入到data變dataPTA_BYTE2_IN//表示PTA23~PTA168位數(shù)據(jù)輸入到data變dataPTA_BYTE3_IN//表示PTA31~PTA248位數(shù)據(jù)輸入到data變功能說

設(shè)置8位引腳輸入輸出方向(這里的x要替換成A~E,n要替換為0~3的數(shù),表示對(duì)應(yīng)的8位引腳號(hào))調(diào)用例子舉DDRA_BYTE0=0xFF;DDRA_BYTE0=0xFF;//表示PTA7~ DDRA_BYTE1=0xFF;//表示PTA15~ DDRA_BYTE2=0xFF;//表示PTA23~PTA168DDRA_BYTE3=0xFF;//表示PTA31~PTA248功能說

設(shè)置16位引腳輸出電平(這里的x要替換成A~E,n要替換為0~1的數(shù),表示對(duì)應(yīng)的16位引腳號(hào))調(diào)用例子舉1.PTA15~2.PTA31~功能說

設(shè)置16位引腳輸入電平(這里的x要替換成A~E,n要替換為0~1的數(shù),表示對(duì)應(yīng)的16位引腳號(hào))調(diào)用例子舉1.u16data=PTA15~輸入數(shù)據(jù)到data2.u16data=PTA31~輸入數(shù)據(jù)到data~~106三 功能說設(shè)置16位引腳輸入輸出方向(這里的x要替換成A~E,n要替換為0~1的數(shù),表示對(duì)應(yīng)的16位引腳號(hào))調(diào)用例子舉1.PTA15~2.PTA31~19.#define19.#define 功能說設(shè)置輸出電平為傳遞參 電平狀態(tài),只能為01。注意,不能為變量或其他宏定義(如果需要傳遞變量,可以用GPIO_SET_1bit或者gpio_get展開舉GPIO_SET(PORTA,27,1);GPIO_SET(PORTA,27,1);//PA27GPIO_SET(PORTA,26,0);//PA26定22.22.#define (GPIO_PDOR_REG(GPIOx[PORTx])^=功能說翻轉(zhuǎn)指定管腳的輸出電傳遞參參考形參變 名及其作用展開舉 //展開后:(GPIO_PDOR_REG(GPIOx[PORTA^1~~107 三 定25.25.#define 功能說引腳狀傳遞參參考形參變 名及其作用展開舉26. 這個(gè)是舉例說明,n需要替換為 提供的1、2、4、8、16。以n替換為8舉例:定功能說

28.#define ((GPIO_PDOR_REG(GPIOx[(PORTx)])&~(0xff<<(n))28.#define ((GPIO_PDOR_REG(GPIOx[(PORTx)])&~(0xff<<(n))傳遞參參考形參變 名及其作用展開舉((GPIO_PDOR_REG(GPIOx[PORTA])&~(0xff<<8)這個(gè)是舉例說明,n需要替換 提供的1、2、4、8、16n替換為8~~10833.#define ((GPIO_PDOR_REG(GPIOx[(PORTx)])>>(n))& 三33.#define ((GPIO_PDOR_REG(GPIOx[(PORTx)])>>(n))&定功能說相鄰的8位引腳輸出狀態(tài)(n為最低位引腳號(hào))傳遞參參考形參變 名及其作用展開舉\((GPIO_PDOR_REG(GPIOx[PORTA])>>17)&aGPIO_GET_8bit(PORTA,17);\((GPIO_PDOR_REG(GPIOx[PORTA])>>17)&逐步提高:GPIO初始化講GPIO是初始化,主要分為如下步使能模塊時(shí)復(fù)用管腳和配置管腳屬設(shè)置管腳輸入輸出方向,如果是輸出方向,還需要設(shè)置輸出GPIO測(cè)試?yán)?1編程風(fēng)格的GPIO51編程風(fēng)格的GPIO實(shí)驗(yàn)輸出測(cè)試實(shí)驗(yàn)說明:野火GPIO實(shí)驗(yàn),利用LED來顯示電平高低實(shí)驗(yàn)操作:實(shí)驗(yàn)效果:LED0每隔實(shí)驗(yàn)?zāi)康模好靼兹绾斡?1編程風(fēng)格來設(shè)置IO口電~~109三 *修改時(shí)間:2012-2- 已測(cè)** 注:野火Kinetis開發(fā)板的LED0~3,分別接PTD15~PTD12,低電平點(diǎn)void{gpio_init //初始PTD15:輸出高電平,即初始化LED0{ // // 31.

51編程風(fēng)格的GPIO* 51編程風(fēng)格的GPIO實(shí)驗(yàn)輸入**實(shí)驗(yàn)說明:野火51編程風(fēng)格的GPIOLED來顯示電平高**實(shí)驗(yàn)操作:短接PTD15**實(shí)驗(yàn)效果:LED0、LED1同時(shí)閃爍,間隔**實(shí)驗(yàn)?zāi)康模好靼兹绾问?1編程風(fēng)格的GPIO操**修改時(shí)間:2012-2- 已測(cè)*

* 注:野火Kinetis開發(fā)板的LED0~3,分別接PTD15~PTD12,低電平點(diǎn)void{gpio_init //初始PTD15:輸出高電平,即初始化LED0gpio_init //初始PTD14:輸出高電平,即初始化LED1{//DDRD14 //PTD設(shè)為輸入(初始化已經(jīng)設(shè)置了,這里就不設(shè)置了if(PTD14_IN==1{ //如果PTD14輸入1,即PTD15輸出為1,那就設(shè)PTD15輸出0 { //如果PTD14輸入0,即PTD15輸出為0,那就設(shè)PTD15輸出1 //延時(shí) 36.GPIOGPIOLED*******~~110*

三 *IO口電**修改時(shí)間:2012-2- ** 注:野火Kinetis開發(fā)板的LED0~3,分別接PTD15~PTD12,低電平點(diǎn)void{gpio_init //初始化PTD15:輸出高電平,即初始化LED0,{ //設(shè)置PTD15輸出低電平,即 //設(shè)置PTD15輸出高電平,即LED0 67.實(shí)驗(yàn)效果

可以看到LED0在閃爍注 GPIO////初始化PTD15:輸出高電平,始化LED0,//初始PTD14,始LED1,//初始化PTD13//初始化PTD12PTD15~PTD12的u32value;void{備GPIO_SET_nbit實(shí)驗(yàn)效果:LED0、LED2LED1、LED3輪流間500ms閃GPIOLED*************~~111 火火{if(value&valueif(value&value= GPIO_SET_2bit(PORTD,14,(~value)&0x03 36.實(shí)驗(yàn)效果

GPIO *

實(shí)驗(yàn)說明:野火GPIO實(shí)驗(yàn),利用LED來顯示電平高低實(shí)驗(yàn)效果:LED1和LED2同時(shí)亮滅,因?yàn)長(zhǎng)ED2的亮滅都是 每次LED1亮,LED3都會(huì)翻轉(zhuǎn)亮滅??梢钥吹絃ED的亮滅順序?yàn)?******

√×√×

√×√×

√√××

實(shí)驗(yàn)?zāi)康膅pio_init、gpio_get、gpio_turn函 void{

u8u8

//初始化PTD15:輸出高電平,即初始化LED1,//初始化PTD14:輸出高電平,即初始化LED2,//初始化PTD13:輸出高電平,即初始化LED3,~~112 三 { //設(shè)置PTD15輸出電平n//即n為控制LED1亮滅變//PTD15_OUTn代//這步可以用level=PTD15_IN代//這步//這步可以用level=PTD15_IN代//這步可以PTD12_OUTlevel代到PTD15的電//設(shè)置PTD14的電平設(shè)if(level==if(level=={ //PTD13_OUT~PTD13_OUT代 58.實(shí)驗(yàn)效果

~~113LED模塊

三 快速:LED庫使用方形參變量名及其作形參變作取LEDPORTA,PORTB,PORTC,PORTD,LEDLED_ON,常用枚舉列名功能說LEDLED狀函數(shù)列函數(shù)名函數(shù)功初始化翻轉(zhuǎn)LED狀設(shè)置LED亮測(cè)試用宏定義列宏定功能說設(shè)置LED初始化翻轉(zhuǎn)LED狀設(shè)置LED亮枚舉定

enum{

~~114三 7.枚舉作用來定義LED對(duì)應(yīng)的引腳備注:LED_PORT宏定義LED所在的 枚舉定

枚舉作用來定義LED亮暗的高低電函數(shù)原

13.13. 功能說初始化LED函數(shù)原

enum{=12.LED_OFF114.14. 功能說設(shè)置LED傳遞參參考形參變 名及其作用~~115調(diào)用

三 15 設(shè)置LED1函數(shù)原

16.16. 功能說翻轉(zhuǎn)LED傳遞參參考形參變 名及其作用調(diào)用例1717 函數(shù)原

18.18. 功能說用于調(diào)用例1919 20.20. 功能說定義LED所在的端口,根據(jù)個(gè)人的開發(fā)板外設(shè)不同而修改定21.21.#defineLED~~11629.三 29.功能說初始化定26.26.#define 功能說翻轉(zhuǎn)LED傳遞參參考形

溫馨提示

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

評(píng)論

0/150

提交評(píng)論