




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
野火嵌入式開 隨著技術的發展,單片機型號越來越繁多,的難度也逐漸加多,學習周期自然不斷延長。為了讓初學者快速,減少學習時間,尤其是為了那些參加智能車比KinetisKinetis開發板的。Kinetis開發,主要有IAR的使用、Kinetis啟動流程講解、野火K60庫的調用三個部分組成。我們不再詳細講解寄存器,而且推薦直接調用我少的后顧之憂,可以加快的開發速度。 自己重新建立自己的函數庫進行開發。例如ST公司推出的ST庫,讓你可以完全不需 要建立自己的野火Kinetis庫的原因。K60庫的函數接口,盡量追求簡潔明了、通俗易懂,力求初學者見其名就會26個實驗:野火Kinetis~1~2 野火嵌入式開 三 Cortex-M4——Kinetis系 :初始化函數啟動執行順 逐步提高:ROM、RAM啟動工作原理、ICF文件講 安裝 建立IAR工 創建工程文 添加GPIO驅動和點亮 IAR工程選項設 快速建IAR工 IAR使 功能介 工作區工程的選定與切 并調 使用軟件仿真調 IAR界面風格設 快速開發指 :了解野火Kinetis工 中斷函數的編寫方 重要變量、函數、宏定義一覽 GPIO模 :GPIO庫使用方 GPIO測試例 LED模 快速:LED庫使用方 LED綜合測試例 ~3 野火嵌入式開 EXTI外部GPIO中斷例 :EXTI庫使用方 EXTI綜合測試例 UART模 :UART庫使用方 UART綜合測試例 ADC模 :ADC庫使用方 ADC綜合測試例 DAC模 :DAC庫使用方 DAC綜合測試例 庫使用方 綜合測試例 FTM輸入捕捉模 :FTM輸入捕捉庫使用方 FTM輸入捕捉中斷測 PIT定時中斷模 :PIT定時中斷庫使用方 PIT定時中斷測試例 、輸入捕捉、PIT中斷綜合測 I2C模 :I2C通信庫使用方 I2C通信實驗測 lptmr低功耗定時器模 :lptmr低功耗定時器庫使用方 lptmr低功耗定時器測試例 DMA模 :DMA傳輸端口數 DMA測試例 MCG模塊超 :MCG庫使用方 :配置頻 DSP數字信號處理單 CMSIS的介紹及其幫助文檔的查找方 DSP常用函數列 ~4 野火嵌入式開 DSP測試例 資料在哪里可 到?(IAR、Jlink驅動 jlink供電到開發板 關于Kinetis時 IAR報錯找不到頭文 printf使用方 Kinetis單片機的IO口支不支持5V耐壓 Kinetis最多可以輸出多少個頻率不同 脈沖波 kinetis捕捉 脈沖計數方 ADC引腳中帶a、b表示的意 不帶有浮點單元能進行浮點運算嗎 ~5 野火嵌入式開 ①
中斷向量表在vectors.c里定義,在vectors.h文件里前兩Reset_Handler(自帶例程startup),第一個為起始SP棧指針、第二個為復位中斷Reset_Handler函數。
EXPORT iimport ;Cstart函
void{ 數據段、中斷向量表到sysinit();//時鐘初始化 while(1);//避免停止運行}main④
段、以ramfunc 到RAM區(對flash操作的函數
voidsysinit{core_clk_mhzpll_init(MCG_CLK_MHZ);trace_clk_init()使能時鐘,用于調試fb_clk_init();//FlexBus時鐘初始化//printf
}~6 野火嵌入式開
初始化的整體
動 分 把以ramfunc 子函數.textrw到RAM到的串口 RAM啟動,代碼會直接編譯進去RAM,掉電就會丟失數據。如果是ROM啟動,就會RAMRAM的地址,以加快中斷響應速度。~7 野火嵌入式開 ROM、RAM啟動,首先需要對器Linker如何分配內存有一定的了解。堆棧常量段.rodatainta=0;staticintb=20;char*p1;constintA=volatileconstintB={intb;char*p2;staticintc=0;chars[]=char*p3=//全局未初始化區.bss//代碼區//全局(靜態)初始化區.datap1char*malloc(10//1020p2=(char*)strcpy(p1,17.地方。看后面IAR設置工程選項中Linker的設置~8火 野火嵌入式開火 其實,這就是器Linker在發揮它的作用,它會根據配置文件,來為這些變量
編譯和編譯成匯
器Linker的配置文件都是由 這里的文件是用來分配數據在內存中的位置,配置ROM、RAM啟動,linker根據Kinetics4GRAM,RAMROMROM啟動(flash啟動)。~9 野火嵌入式開 野火Kinetis 板自帶為MK60DN512,512KB的Programflash大小,128KB的SRAM大小,沒有FlexNVM和FlexRAM。~10 野火嵌入式開火的配置文件寫得真的思路太亂了,如果你僅僅用ICF編輯軟件來配置的ICF配置好后,還要打開配置文件來修改。/*###ICF###SectionhandledbyICFeditor,don'ttouch!/*-Editorannotationfile-/*
define =define define = define define
= define define /****EndofICFeditorsection./****上邊是由ICF編輯,下面是由我們手動配置****/ define ;//SRAM是分成兩塊的,RAM2SRAM_URAM為define = -
ICFEDIT_region_RAM_start;defineexported VECTOR_TABLE ICFEDIT_intvec_start
//代碼編譯進ROM,則 ;RAM, defineexported VECTORRAM ICFEDITregionRAM //RAMRAMUserVector VECTOR_TABLE的數 defineexported BOOT_STACK_ADDRESS -/*決定代碼編譯的地址
defineexported code ICFEDITintvec +//代碼編譯進ROM, +0x410 +0x410,+0x410,是前面的留給Vectordefinememorymemwithsize defineregionROM = ICFEDITregionROM ICFEDIT_region_ROM_end
region=ICFEDIT_region_RAM_end| region_RAM2_end~11 野火嵌入式開 defineblockCSTACK withalignment=8,size=defineblock withalignment=8,size//common_startup
//堆,8//棧,8initializemanually{readwrite}; //未初始化數據.bssinitializemanually{section.data}; //已初始化數據initializemanually{section.textrw donotinitialize{section.noinit defineblockCodeRelocate{section.textrw_initdefineblock msection.textrw ceataddressmem: {vec//vectors.c中設置#pragmalocation".intvec.noinit段放在代碼開ceataddressmem: {readonlysection.noinit//crt0.s中設置了復位中斷函數為SECTION.noinitCODE,即把代碼編譯進去編譯進去RAMcein {readonly,blockCodeRelocate//把代碼編譯進去RAM(調試用,掉電丟失,非調試,則設為cein {readwrite,block SP,把0x SP,把0x 斷,用RAM的中斷向量表0x0007-0x2001-
0x0000-堆棧堆棧ROMBootloader0x0000-RAMBootloaderRAMBootloaderRAM堆棧0x2000- 0x2001-~12 野火嵌入式開 如果是ROM啟動(flash啟動/*###ICF###SectionhandledbyICFeditor,don'ttouch!/*-Editorannotationfile-
/* _0.xml"define = define =define = :P-flashk256kD-flash :P-flashkdefine =//0x410RAM留給RAMUserVectorTabledefine ICFEDITregionRAM = define define =/****EndofICFeditorsection.###ICF###*/19./****ICFdefine = define = ICFEDIT_region_RAM_startdefineexported VECTOR_TABLE ICFEDIT_intvec_start//代碼編譯進ROM,則 ;RAM, defineexported VECTOR_RAM ICFEDIT_region_RAM_start//RAMRAMUserVectorTable,即這里的設置。所以減
VECTOR_TABLE的數據 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 //未初始化數據initializemanuallysection initializemanually{section.textrw};
58.donotinitializesectionnoinit defineblockCodeRelocate{section.textrwinitdefineblock m{section.textrw//把CodeRelocate代碼 到RAM中的CodeReloca m(對flash操作的函數必須這樣)ceataddressmem: {vec//vectors.c中設置#pragmalocationintvec".intvecceataddressmem: {readonlysection.noinit野火嵌入式開發工作 ~13火 野火嵌入式開火//crt0.sReset_HandlerSECTIONnoinit//Reset_Handlercode_startcein {readonly,blockCodeRelocate//把代碼編譯進去ROM調試用,非調試,則設為ceinRAM {readwrite,block blockCSTACK,blockHEAP
代碼編譯進ROM0x0007-0x2001-
0x0000- 到RAM,以 RAMROMBootloader0x0000-RAMRAMBootloaderRAMCode.bss和堆棧0x1FFF-0x2000-0x2001-在工程選項里,設置生成mapfile就行:~14 野火嵌入式開 設置好,編譯后,在fire_Kinetis\build\xxx_demo\xxx模式\List文件夾下就會有.map文件。 這里的內容,就是ICF配置~15火 野火嵌入式開火
~16 野火嵌入式開 ~17 野火嵌入式開 野火推薦的是直接在野火提供的K60庫模版上添加 重建工程,但學會自己建立工程是必須的,這里給大家詳解建立IAR工程的步驟。 的IARforARM為v6.30,支持 的Kinetics系列 /folder/fautzfbt里的CD-EWARM-6301- ~18 野火嵌入式開 ~19 野火嵌入式開 選擇同意,然后點擊~20 野火嵌入式開 ~21 野火嵌入式開 ~22 野火嵌入式開 ~23 野火嵌入式開 ~24 野火嵌入式開 ~25 野火嵌入式開 相對于KeilForARM、CodeWarrior而言,IAR forARM的編程界面是最簡單的,~26 野火嵌入式開 ~27 野火嵌入式開 ~28 野火嵌入式開 地址:SetupJLinkARM~29 野火嵌入式開 在建立IAR工程前,需要 的Kinetis例程,提取里面的配置文件和地址:KINETIS512 ~30 野火嵌入式開 ~31 野火嵌入式開 ~32 野火嵌入式開 fire_Kinetis文件夾,再建一個build文件夾,build文件里再建一個gpio_demo文件夾,把工程文件保存在gpio_demo文件夾里面,工程文件名為:fire_gpio_demo,文件結構如下圖:~33 野火嵌入式開 ~34 野火嵌入式開 例程文件夾KINETIS512_SC\build\iar下的文件iar.h和文件夾configfiles 到fire_Kinetis\build文件夾下。settingsIAR自動創建的設置文件,~35 野火嵌入式開 ~36 野火嵌入式開 ~37
野火嵌入式開 crt0.s哦。crt0.s是啟動文件,單片機上電復位后,就會執行里面的~38 野火嵌入式開 再在fire_Kinetis\src\projects下創建fire_gpio_demo文件夾,在fire_gpio_demo文件下繼續創建main.c、isr.cisr.h文件,往app分組添加main.c、isr.c~39 野火嵌入式開 voidvoid{21.2222/*******************CCOPYRIGHT2011:::*35.#ifndef#defineISR_H *先取消默認的中斷向量元素宏定 #undef*在重新定義到自己編寫的中斷函 #define ~40*
野火嵌入式開 **
#undef #defineVECTOR_003 #endif///*isr.h結尾
VECTOR_003在vectors.h#define #include#includevectors.h"http://#include最后,在fire_Kinetis\src\ tforms文件夾下, 一份k60_tower.h文件出來,命名為k60_fire.h:52.52.~4165.*Includetformspecific65.*Includetformspecificheader#if#include"k40#elif(defined(TWR//#include#include#elif#include#error"No tform*Include tformspecificheader#if#include#elif#include#include#elif#include#error"No tform /*/*Globaldefinestouseforallboards//#define.2. 3. 4. shortint8.long~42 野火嵌入式開 gpio.cgpio.c添加進工程分組的drivers里,gpio.c里添加如下gpio/*****************(C)COPYRIGHT2011野火嵌入式開 *文件 *描 **實驗平 *庫版 *嵌入系 **作 10.*淘寶 11.*技術支 /bbs/bbslist.jsp?bbs12.#include#includeE_PTR,PTD_BASE_PTR,PTE_BASE_PTR};//定義五個指針數組保存GPIOx的地址volatilestructPORT_MemMap21. ****參數說明 高電平**修改時間:2012-1- * 33.voidgpio_init(PORTxportx,u8n,IOcfg,u8{ASSERT(n32u)&&data2u)~43
野火嵌入式開 //PORTx_PCRxif(cfg=={]) if(data=={GPIOPDORREG(GPIOx[portx])|=(1<<n) {}} GPIOPDDRREG(GPIOx[portx&= 58. ****參數說明 **修改時間:2012-1- * voidgpio_set(PORTxportx,u8n,u8{ASSERT(n32u)&&data2u)if(data==GPIOPDORREG(GPIOx[portx|= GPIOPDORREG(GPIOx[portx&= #ifndef#ifndefGPIO_H #define typedefenum ~4411.
野火嵌入式開 #include"gpio.h"#include"lptmr.h"http://延時實驗說明:野火GPIO實驗,利用LED來顯示電平高低16.*void //設置PTD15輸出低電平即LED0timedelay gpioset(PORTD,15,HIGH);//設置PTD15輸出高電平即LED0 typedefenum { #defineHIGH#define externvolatilestructGPIO_MemMapexternvolatilestructPORT_MemMap*PORTX[5];25. gpio_init(PORTx,u8n,IO,u8 26.void (PORTx,u8n, u8data); ~45~45 野火嵌入式開 Release,切換起來非常方便。 有時會發現他們并沒有Debug模式和Release模式,取而代之的是ROM模式、RAM模式、flash模式等等,這些都是可以自行修改的:~46 野火嵌入式開 運行異常,這是因為Release有更嚴格的檢查,詳細情況,可看:在IAR的Workspace窗口頂部的下拉菜單中有兩個選項.pdf網上共享的工程模版,改名字后的,他們大部分都是基于Debug模式的,就是怕Debug模式的優化效果不如Release模式,如果我們的程序編程是沒DebugRelease模式,只不過是在Debug模式下,會隱藏了一些錯誤而讓我們覺得編譯通過了。也有時,debug模式里會添加一些延時,所以有時候在Release模式下延時。就用Debug模式來講解:~47 野火嵌入式開 ~48 野火嵌入式開 ~49 野火嵌入式開 GeneralOptions—— ~50 野火嵌入式開 為~51 野火嵌入式開 GeneralOptions—— ~52 野火嵌入式開 C/C++Compiler——OptimizationsRelease模式里,可以選擇最大優化,但在發布前,需要對優化后的效果進行~53 野火嵌入式開 C/C++Compiler——Preprocessor ~54
野火嵌入式開 #define#define#define#define注意:如果在Definedsymbols:(oneperline這里填入了DEBUG,那就要注釋掉fire_Kinetis\src\common\common.h里面DEBUG的宏定義。OutputConverter——Output~55 野火嵌入式開 Linker—— LinkerconfigurationfileOverridedefaultLinker配置文件,fire_Kinetis\build\configfilesLinker配置文件。Linker配置文件,里面設置了Kinetis 是從ROM啟動還是從RAM啟動,堆棧 為K60N512LQV100,512KBFlash128KBSRAM512KB_Pflash.icf256KB_Pflash_256KB_Dflash.icf,兩者的區512KBFlash分一半出來,作為保存其他數據用,而不是全部用來~56火 野火嵌入式開火Release模式,肯定是從ROM啟動,即可選擇512KB_Pflash.icf或者256KB_Pflash_256KB_Dflash.icfRelease模式因為沒有調試信息,所以是不能使用jlink等調試器來Debug的。 Linker——Automaticruntimelibrary 庫~57 野火嵌入式開 Linker ~58 野火嵌入式開 Linker ~59 野火嵌入式開 勾上GeneratelinkermapfileDebug模式為例,在工程的文件夾下生成:fire_Kinetis\build\gpio_demo\Debug\List\fire_gpio_demo.map文件,打開~60 野火嵌入式開 Debugger 在Driver里有多種可供選擇的調試方式。野火Kinetis開發板配置了jlink 可供調試,因此可以在這里選擇J-Link/J-Trace;如果想軟件仿真,那可以選擇Simulator。~61 野火嵌入式開 Debugger ,需要勾上Useflashloader,不然 ~62 野火嵌入式開 J-Link/J-Trace ~63 野火嵌入式開 J-Link/J-Trace—— ~64火 野火嵌入式開火 方式:JTAG和Warning[Pa082]:undefinedbehavior:theorderofvolatileaccessesisundefinedinthisstatementprintf(printf("Flashparameterversion量都定義為volatile,這樣調用, intsquare(volatileint{return*ptr* intsquare(volatileint{inta=b=returna*
longsquare(volatileint{inta=}}returna*~65 野火嵌入式開 fire_Kinetis\build文件下,找到我們已經建好的gpio_demo工程文件夾,里面把gpio_demo工程文件夾 字,例如xxx_demo:~66~66 野火嵌入式開 ~67
野火嵌入式開
~68 野火嵌入式開 ~69 :火:保存所有文件:剪切
:打印:撤銷
:光標跳到指定行列:設置書簽:調到下個書簽:跳回上個頁面:跳到下個頁面:編譯當前文件:編譯整個工程
~70~70 野火嵌入式開
~71 野火嵌入式開 ~72 野火嵌入式開 并調試或者 ~73 野火嵌入式開
~74 野火嵌入式開 ~75 野火嵌入式開 在使用JLINK給K60燒寫程序時,如果 被鎖如何處理?用J-LinkCommander看看能不能找到M4內核,如果能找到,在運行的J-LinkCommander里面,敲入以下命令:UnlockKinetis。然后回車,就能 QCW編譯器的,較IARIARCW的人比較多吧。另外,也不要USB3.0USBJlink、BDM等器,容易出錯,甚至不了。~76 野火嵌入式開 #define#define
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=DESTinfo.func=
.31. *Initializethepointertothevariablelengthargumentva_start(ap,rvalue=printk(&info,fmt,*Cleanupthevariablelengthargumentreturn#endif common.h里的Simulator的~78 野火嵌入式開 ~79 野火嵌入式開 ~80 野火嵌入式開 野火 123456789~81 野火嵌入式開 ~82 野火嵌入式開 K60 快,寄存器越來越多,就算你能完全記住51的所有寄存器,但你能記得所有的 KineticsK60API接口,而不必慢慢對著datasheet來研究。例如UART、FTM、I2C等模塊,函數內部會根據main函數里中途更改時鐘頻率,就需要重新初始化,以便重新計算和選KineticsK60庫,部分功能的實現,提供了兩種或兩種以上的實現方法,一KineticsK60庫代碼中都有備注。代碼會不斷更新,不一定更新到上,如果與代碼有相互不m~83
野火嵌入式開
模版工程的app文
~84 野火嵌入式開 IAR~85 野火嵌入式開 ~86 野火嵌入式開
如printf函數。野火編寫的Kinetis例 uC/OS相關的代碼~87 野火嵌入式開 ~88 野火嵌入式開 ~89 野火嵌入式開 fire_Kinetis\src\cpuvectors.cvectors.h文件,這兩個用來定義中斷向量表和定義了一個默認的中斷服務函數。~90 野火嵌入式開 default_isr默認的中跑到default_isr服務函數里,如果是,那往往都是代碼有bug。~91#ifndefISR_H#defineISR_H1*******#define#defineextren17.#endif//19./*Endof"isr.h"~92 野火嵌入式開
~93 野火嵌入式開 用來定義進入DEBUG1.1.#define~94
野火嵌入式開
voidsysinit{uart_init(FIRE_PORT,}//初始化printf(constchar*fmt,#define intprintf(constchar*fmt,{PRINTK_INFOinfo.func=&outrvalue=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{}staticvoidprintk_putc(intc,int*count,PRINTK_INFO{7. info.func ~96 野火嵌入式開 /*/*注:野火修改過這里的代碼, 提供例子是不一樣的whileDEBUG,就會對斷言里的條件進行檢查,條件不成立就提示錯誤信ADC模塊里,可以看到很多函數的 ~97typedef{ typedef{ 程序一般分為Debug版本和Release版本,Debug 6-5-1】使用斷言捕捉不應該發生的情況。不要情況與錯誤6-5-2】在函數的處,使用斷言檢查參數的有效性()6-5-2】一般教科書都鼓勵程序員們進行防錯設計,但要記住這種編程風要使用斷言進行。滅bug。~98 野火嵌入式開 1.1.void ,ADC_Ch ~99
野火嵌入式開 PORTA,PORTB,PORTC,PORTD,nGPI,GPO,GPI_DOWN,GPI_UP,GPI_PF,GPI_DOWN_PF,GPI_UP_PF, GPO_HDS_SSR。初始化設置引腳輸出電平(這里的x要替換成~~100設置引腳輸入輸出方這里的x要替換A~E,n0~3的數,表示對應的8位引腳號)PTA_BYTE0_OUT表示PTA7~PTA0PTA_BYTE1_OUT表示PTA15~PTA8PTA_BYTE2_OUTPTA23~PTA_BYTE3_OUT表示PTA31~A~E,n0~3的數,表示對應的8位引腳號)A~E,n0~3的數,表示對應的8位引腳號)應的16位引腳號)PTA_WORD0_OUT表示PTA15~PTA0PTA_WORD1_OUTPTA31~PTA1616位引腳號16位引腳號 野火嵌入式開火~101 野火嵌入式開火
enum{
typedefenumGPIGPIDOWNPF=GPIDOWN|GPIPF|GPI_PFGPO_HDS_SSR=GPO_HDS|~102 野火嵌入式開
1.1. gpio_init(PORTx,u8n,GPIO_CFG,u8
4.4. gpio_set(PORTx,u8n,u8 5.5. //PTA27=
gpiogpio//PTA27//初始化PTA266.6. gpio_turn(PORTx,u8 ~103無
野火嵌入式開 7.7.
8. (PORTx,u8 9.9. //PTA27=
PTA0PTA0 = PTB16_OUT1;//PTB16PTE28_OUT0;//PTE28~104 野火嵌入式開火 野火嵌入式開火 data=PTB16_IN;data=PTE28_IN;
應的8位引腳號)PTAPTABYTE0OUT=0x12//表示PTA7~ 8位輸出PTA_BYTE1_OUT=0x12//表示PTA15~ 8位輸出PTABYTE2OUT=0x12//表示PTA23~PTA168位輸出PTA_BYTE3_OUT=0x12//表示PTA31~PTA248位輸出
應的8位引腳號)~105chardata=PTA_BYTE0_IN//表示PTA7~ 8位數據輸入到data變data=PTA_BYTE1_IN//表示PTA15~ 8位數據輸入到data變dataPTA_BYTE2_IN//表示PTA23~PTA168datadataPTA_BYTE3_IN//表示PTA31~PTA248data
示對應的8位引腳號)DDRA_BYTE0=0xFF;DDRA_BYTE0=0xFF;//表示PTA7~ DDRA_BYTE1=0xFF;//表示PTA15~ 8位設置輸入輸出方向為輸DDRA_BYTE2=0xFF;//表示PTA23~PTA168DDRA_BYTE3=0xFF;//表示PTA31~PTA248
應的16位引腳號)1.2.
野火嵌入式開火應的16位引腳號)1.u16data=PTA15~輸入數據到data2.u16data=PTA31~輸入數據到data~106 野火嵌入式開 示對應的16位引腳號)1.DDRAPTA15~2.PTA31~19.19.#define GPIOGPIOSET(PORTA,27,1);//PA27GPIOSETGPIO_SET(PORTA,26,0);//PA2622.22.#define (GPIO_PDOR_REG(GPIOx[PORTx])^= 23.23.//展開后:(GPIO_PDOR_REG(GPIOx[PORTA^=(1~~107 野火嵌入式開 25.25.#define 以n替換為8舉例:
26.a=GPIO26.a=GPIO28.#define ((GPIO_PDOR_REG(GPIOx[(PORTx)])&~(0xff<<(n)) 展開后:GPIOPDOR((GPIO_PDOR_REG(GPIOx[PORTA])&~(0xff<<8)n8~10833.#define ((GPIO_PDOR_REG(GPIOx[(PORTx)])>>(n))& 33.#define ((GPIO_PDOR_REG(GPIOx[(PORTx)])>>(n))& aaGPIOGET8bit(PORTA,17); \((GPIO_PDOR_REG(GPIOx[PORTA])>>17)&51編程風格的GPIO實驗說明:野火GPIO實驗,利用LED來顯示電平高低~109 野火嵌入式開 *修改時間:2012-2- ** 注:野火Kinetis開發板的LED0~3,分別接PTD15~PTD12,低電平點void{gpio_init { 31.
51編程風格的GPIO ***實驗操作:短接PTD15****修改時間:2012-2- *
引腳的輸入數* 注:野火Kinetis開發板的LED0~3,分別接PTD15~PTD12,低電平點void{gpio_init gpio_init {//DDRD14 if(PTD14IN==1{ 0 { 1}}}38.38.實驗說明:野火GPIO實驗,利用LED來顯示電平高低*******~110 野火嵌入式開KinetisLED0~3PTD15~PTD12備KinetisLED0~3PTD15~PTD12備*****火*{gpio_init //初始化PTD15:輸出高電平,即初始化LED0{ //設置PTD15輸出低電平,即 //設置PTD15輸出高電平,即LED0 67.
注 ~111//初始化PTD15:輸出高電平,即初始化LED0//初始化PTD14:輸出高電平,即初始化LED1//PTD13//PTD12PTD15~PTD12u32value;void{備GPIO_SET_nbit實驗效果:LED0、LED2LED1、LED3500ms實驗說明:野火GPIO實驗,利用LED來顯示電平高低*************{
野火嵌入式開 value if(value& { 36.
位,這里只是示范而加多“&
實驗說明:野火GPIO實驗,利用LED來顯示電平高低實驗效果:LED1和LED2同時亮滅,因為LED2的亮滅都是 每次LED1亮,LED3都會翻轉亮滅。LED*******
√×√×
√×√×
√√××
實驗目的:測試gpio_init、gpio_get、gpio_turn函數 void{
u8u8
//初始化PTD15:輸出高電平,即初始化LED1//初始化PTD14:輸出高電平,即初始化LED2//初始化PTD13:輸出高電平,即初始化LED3~112 野火嵌入式開 { //設置PTD15輸出電平n//即n為控制LED1//PTD15_OUTnlevel PTD15//level=PTD15_IN //設置PTD14的電平設 到PTD15的電//PTD12_OUTlevelif(level=={ 到PTD15為低電平,即LED1亮//就翻轉PTD13電平,即亮滅//PTD13_OUT~PTD13_OUT 58.
翻轉引腳的輸出數~113
野火嵌入式開 PORTA,PORTB,PORTC,PORTD,LED_ON,
enum{
~114 野火嵌入式開 7.
13.13.
enum{LED= LED_OFF112.14.14. ~115
野火嵌入式開 15 設置LED1
16.16. 1717
18.18. 1919 20.20. 21.21.#defineLED~11629.LED(LED1,LED 29.LED(LED1,LED26.26.#define 2727 28.28.#define 31.31. *~117***
野火嵌入式開 *實驗效果:LED0LED1500ms**實驗目的:測試ledinit、led、ledturn**修改時間:2012-2- 已測** 注:野火Kinetis開發板的LED0~3,分別接PTD15~PTD12,低電平點void{ //初始化4{led(LED0,LED //LED0 timedelayms(500); //LED0LED 62. 設置LED的亮暗 翻轉LED的亮暗~118 野火嵌入式開火PORTA,PORTB,PORTC,PORTD,nzero_down,//低電平觸發,內部下拉rising_down上升沿觸發,內部下拉falling_down,//下降沿觸發,內部下拉either_down,//跳變沿觸發,內部下拉one_down,//高電平觸發,內部下拉zero_upfalling_up,//下降沿觸發,內部上拉either_up,跳變沿觸發,內部上拉
typedefenum{eitherdown=====~119 野火嵌入式開 = rising = = = one =
16.16.voidexti_init(PORTx,u8 1717voidexti_init(PORTA,17,rising_down);//5.PTA26PORTAPORTA中斷:PORTA_IRQHandler我們需要在isr.c里編寫PORTAIRQHandler中斷服務函數isr.h里面重新宏定義中斷號,重映射中斷向量表里的中斷函數地址實驗操作:用跳線短接PTA27和PTA26extiinit~120*
野火嵌入式開 * 注:野火Kinetis開發板的LED0~3,分別接PTD15~PTD12,低電平點void{ gpio //gpioPTA27//PORTA26{GPIO 54.
觸發的是PORTA中斷)和 #undef#defineVECTOR
PORTA externvoid * *功能說明:PORTA * * *修改時間:2012-1- 已測10.* 注:引腳號需要自己初始化來清11.12.void13. u8 16./*根據自己的引腳號,自己編寫,這里給出n0的模版,即PTAn *也給出n=26例子,自行修改n即可 20.n0模版 if(PORTA_ISFR& PORTA_ISFR| /*以下為用戶任 ~121
野火嵌入式開 /*以上為用戶任 31.if(PORTA_ISFR& {PORTA_ISFR| /*以下為用戶任 /*以上為用戶任 43.
if(PORTA_ISFR&{PORTA_ISFR|=/*以下為用戶任務/*以上為用戶任務}~122
野火嵌入式開
~123 野火嵌入式開火
typedefenum --RXD--可以復用其他通道,請自行修改
68.68.voiduart_init(UARTn,u32初始化uartx6969uart_init //1
70.70.char ~124
野火嵌入式開 7171ch 72.72.charuart_pendchar(UARTn,char* 1,并把接收到的數據保存在ch指針指向的地址。charchar))
75.75.int 10~~125 野火嵌入式開火7878uart_putchar
79.79.void (UARTn,uint8*buff,uint168080uart_sendN
81.81.void (UARTn,constu8*
~12683.void
野火嵌入式開 8484
85.85.void 8686
87.87.#define 89UART_IRQ_EN(UART1)89UART_IRQ_EN(UART1);//~127 野火嵌入式開 #define#defineUART_IRQ_DIS(UARTn) 9292
**
k60_fire.h里定義了printf函數的輸出設置:**
#defineFIREPORT#define
UART119200野火 *****
Software
66MHz
K60-144pinSiliconrev1.2FlashparameterversionFlashversionID512kBytesofP-flashP-flash128kBytesof~128 野火嵌入式開 *修改時間:2012-2- 已測** 注:printf函數的底層是調用uart_putchar來發送void{uart_init(UART1, {uart_putchar uart_sendN 59. 初始化串口 注:printfk60_fire.h里定義所用到~129 野火嵌入式開 ** UART1,TXPTC4,RX k60_fire.hprintf #define #define 這里的串口接收實驗也使用UART1,這樣就可以使用printf**19200 **** 內核頻率:200MHz * Software* Siliconrev Flashparameterversion FlashversionID 512kBytesofP- P-flash 128kBytesof* * * * * *****修改時間:2012-2- 已測** 注void{charchar , { 測試無限等待接 ~130 野火嵌入式開 測試有限等待接收一個字 printf("o(︶︿︶)o唉,趕不及了!收不到你的數據。 測試有限等待接收字符 printf("o(︶︿︶)o唉,趕不及了!收不到你的數據。 87.******k60_fire.h里定義了printf~131~132 ~132 #defineFIRE #define 這里的串口接收實驗也使用UART1,這樣就可以使用printf 1 isr.c里編寫USART1_IRQHandler isr.h**19200 *** ** 內核頻率:200MHz * Software* Siliconrev Flashparameterversion FlashversionID 512kBytesofP- P-flash 128kBytesof* * * * *****修改時間:2012-2- 已測** 注*1*void{ 關接收中uart_init(UART1, 開接收中{
野火嵌入式開 #undef#define externvoid********1備void{uint8ch=uart_getchar(UART1);} 80. ~133
野火嵌入式開 ADC模塊號ADC0, //當SC1n[DIFF]=0為
對應管 ADC0ADC1ADC0ADC1PGA0PGA1ADC0ADC1
保 -- 保 -- 保 -- 保 --AD4b=AD4a,// ADC0SE4b --PTC2 ADC1SE4b --PTC8AD5b=AD5a,// ADC0SE5b --PTD1 ADC1SE5b --PTC9AD6b=AD6a,// --PTD5 AD7b=AD7a, ADC0 -- ADC1 --AD8=8,//ADC0SE8--PTB0 ADC1SE8--PTB0AD9=9,//ADC0_SE9--PTB1 ADC1_SE9--PTB1AD10=10,//ADC0SE10--PTA7 ADC1SE10--PTB4AD11=11,//ADC0SE11--PTA8 ADC1SE11--PTB5AD12=12,//ADC0SE12--PTB2 ADC1SE12--PTB6AD13=13,//ADC0_SE13--PTB3 ADC1_SE13--PTB7AD14=14,//ADC0SE14--PTC0 ADC1SE14--PTB10AD15=15,//ADC0_SE15--PTC1 ADC1_SE15--PTB11AD16=16,//ADC0SE16 ADC1SE16 --PTE24 ADC0SE18 --PTE25 VREFOutput ADC0DM0 ADC1DM0 保 保 保 保 TemperatureSensor(S.E) Bandgap(S.E) Bandgap(S.E) 保 保 VREFH VREFH 禁用 禁用
軟件觸發不支持B通道,目前庫只支持軟件觸發。ADC_8bit,ADC_12bit,ADC_10bit,~134 野火嵌入式開火typedef{6.
//提醒,用的時候,可以直接用DP0代替DAD0,其他的也類似,因為有個宏定義:#define typedefenum{//SC1n[DIFF]=//ADC0野火開發板絲印層|ADC1野火開發板絲印層 //ADCx_CFG2[MUXSEL]位決定ADCx_SEn通道為a或 保 ADC1_SE4a-- 保 ADC1_SE5a--~135 野火嵌入式開 保 ADC1_SE6a-- 保 ADC1_SE7a--//4、5、6、AD4b=AD4a, -- ADC1_SE4b--AD5b=AD5a, -- ADC1_SE5b--AD6b=AD6a, -- ADC1_SE6b--AD7b=AD7a, ADC0 -- ADC1SE7b-- -- ADC1_SE8-- -- ADC1_SE9--AD10=10, -- ADC1_SE10--AD11=11, ADC0 -- ADC1SE11--AD12=12, -- ADC1_SE12--AD13=13, -- ADC1_SE13--AD14=14, -- ADC1_SE14--AD15=15, -- ADC1_SE15--AD16=16, ADC0 ADC1AD17=17, -- ADC1_SE17--AD18=18, -- VREFAD19=19, AD20=20, AD21=21, AD22=22,AD23=23, DAC0OUT(12-bit)--DAC0 DAC1OUT(12-AD24=24, 保 保AD25=25, 保 保AD26=26, TemperatureSensor TemperatureSensorAD27=27, Bandgap BandgapAD28=28, 保 保AD29=29, VREFH VREFHAD30=30, 禁用 禁用注:調用時直接寫模塊_”后面的通道號就可以。如SE16、SE4a等。軟件觸發不支持B通道,目前庫只支持軟件觸發。typedefenumADC{
~~136
野火嵌入式開 1.1. adc_init 1.1.adc_init(ADC1,SE16);//ADC1_SE16
2.2. 3.3.result=ad_once
4.4. 5.result=5.result=ad_mid(ADC1,SE16,ADC_16bit);//ADC1_SE16上采樣三次的中值,16~137 野火嵌入式開 6. 返回采樣N次的ADC值平均值。按
9.9. adc_start 1010adc_start
result=(11.11. adc_stop 1212adc_stop ~138*** 野火嵌入式開 *ADC UART1,TXPTC4,RX k60_fire.hprintf #define #define **ADC1_SE4aADC1_SE4a0~3.3V 打開串口助手,設置波特率為19200 *** 內核頻率:200MHz * Software* Siliconrev Flashparameterversion FlashversionID 512kBytesofP- P-flash 128kBytesof* ****ADC**修改時間:2012-2- 已測** 注:adc.h有各個ADC通道所對應管腳的表格,方便查void{u16 ,{ 一次 ADC1_SE4a,16 三次,取中值 ADC1_SE4a,16 十次次,取平均值 ADC1_SE4a,16 81.~139
野火嵌入式開 連接到DACREF_1)和VDDA(3.3v,連接到DACREF_2)。常見的DAC模塊原理圖
火 野火嵌入式開火輸出電壓Vout=Vin*(1+DACDAT0[11:0])/4096 ②擺動模式,當讀指針到頂部時,不再返回底部,而是每觸發一次DAC轉換,讀指針減1。轉換時,讀指針指向正在轉換的數據,即可以通過 讀指針從底部到頂部,在中間可以設置水位標志位(DACbufferwatermark)作為作用,水位標志位選擇范圍為離棧頂1~4雙字節。當讀指針指向水位標志位時,DACBFWMF置1,可設置產生中斷請求。~141 野火嵌入式開 VREF_OUT、~142 野火嵌入式開火{
{VREFOUT,
2.2.void ~143
野火嵌入式開 初始化DAC1.1.
1.1.void ,u16 1.1.dac_once_convert(DAC0,0x10);//DAC一次轉換操作,轉換輸出:3300*(10x10)/4096
2.2.u16dac_once_get 3.3.valdac_once_get //DACVDDA或 ***實驗操作:短接DAC0和**實驗效果:LED3~144*
野火嵌入式開 *DAC**修改時間:2012-3- 已測** 注:野火Kinetis開發板的LED0~3,分別接PTD12~PTD15,低電平點void{u16 {{ 33. //DACVDDA或 ***實驗操作:串口里發送'+'或**實驗效果:LED3****修改時間:2012-3- 已測** 注void{u16u8 {printf("\n請發送或來控制電壓增減com=uart_getchar(FIRE_PORT); {casecase'-':i-}if(i>=0x1000)~145
野火嵌入式開 if(USR_VREF printf("\n輸出電壓:%dmV\n",(u32)(3300*1i))>>12);//printf("\n輸出電壓:%dmV\n",(u32)(1200*1i))>>12);// 47.//DACVDDA**********************實驗操作:短接ADC0和 總線頻率flex頻率:100MHzflashCoreLockupEventSiliconrevFlashparameterversionFlashversionID512kBytesofP-flashP-flash128kBytesof~146**
野火嵌入式開 或 **
或 * 或 *****修改時間:2012-3- 已測** void{u16u16u8 ,{printf("\n請發送或來控制電壓增減。發送其他則保存不變com=uart_getchar(FIRE_PORT); {casecase'-':i- if(i>=0x1000) ADresult ADC0_SE14,12 到ADC值為:%d 76.~147 野火嵌入式開 ~148 野火嵌入式開
FTM0, ×××××××××××× 設置通道占空比設置通道占空比,(dutyFTM_PRECISON)*100%。_Duty建議直接使用建議直接使用精度(duty的取值,通道占空比為:duty/FTM_PRECISON>~~149 野火嵌入式開火
enumenum{6.
enum{××××××××××××19.
20.void_init(FTMn,CHn,u32freq,u32~150
野火嵌入式開
23.void u32/24.24. FTM1_CH0輸出占空比為
25.void u32建議直接使用FTM__init。26.26. 27.27.#defineFTM_PRECISON~151
野火嵌入式開 duty
FTM1_CH0產生PTA8把PTA8接入示波器實驗效果:可以測出頻率為35kHz實驗目的:測試頻率是否正確修改時間:2012-2-29備FTM.hFTMFTM_PRECISONvoid{ {}26.~~152 野火嵌入式開
實驗操作:這里用FTM1_CH0產生 在FTM.h里,可以查到FTM1_CH0對應管腳為把PTA8接入LED0,即PTA8和PTD15短接實驗效果:可以看到LED0由暗變亮,再突然暗,如此下去…… 注:野火Kinetis開發板的LED0~3,分別接PTD15~PTD12,低電平點FTM_PRECISONvoid{u32
{{
33.
}
//改變占空比,逐漸變小,LED逐漸變亮(低電平點亮~153 野火嵌入式開FTM火FTM0, ×××× ×× ××××××
Rising,Falling,初始化FTMenum{
~1546.
野火嵌入式開
28.28.void2929
30.30.#defineSC_REG(FTMx[FTMn],CHn)|=SC_CHIE_MASK//開啟FTMn_CHnFTMIRQ////開啟FTM1CH0 34.34.#defineSC_REG(FTMx[FTMn],CHn)&=//FTMn_CHn~155
野火嵌入式開 3636 //FTM1_CH0 ** PTA9PTA9PTA8 即PTA9FTM1_CH0**實驗效果:LED0**實驗目的:測試FTM1_CH0**修改時間:2012-2- ** 注:FTM.h里有各個FTM通道所對應管腳的表格,方便查*void{ { 41.
SourcemoduleFTM1~~156#undefVECTOR079#define 野火嵌入式開 externvoid void ~157 野火嵌入式開 PIT0,PIT1,PIT2,時間,單位為初始化pit初始化pit
enumenum{7.~158 野火嵌入式開
pit_init(PITn,u32
pit_init(PITn,ms* ~159 野火嵌入式開
PITLED0顯示進入了中斷函數。實驗目的:測試PIT是否定時產生中斷 注:野火Kinetis開發板的LED0~3,分別接PTD15~PTD12,低電平點void{ 45.
{}
//PIT0#undef#defineVECTORPIT0externvoid在isr.h里重定向中斷向量表的中斷函數指針和 用PIT0觸發中斷,所以用PIT0的中斷服務函數。在vectors.h里的注解列表的Sourcemodule查到PIT0的中斷向量號為VECTOR_084):8.函數名稱:PIT0備59.~160 野火嵌入式開 void{ 65. **實驗說明:野 利用FTM2_CH0產 FTM1_CH0輸入捕捉FTM2_CH0產生 **實驗操作:短接PTA8和PTA10,即FTM2_CH0和FTM1_
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年食品分離機械合作協議書
- 2025年水基聚合物防水涂料項目合作計劃書
- 2025年新式茶飲合作協議書
- 腫瘤TNM分期系統解析
- 夫妻忠誠協議:出軌行為處罰與賠償細則
- 微信小程序電商運營培訓與市場拓展協議
- 學區房學位名額限時搶購買賣合同
- 時尚家居品牌代言人合作協議書
- 通信設備供應商投標人合規性審查及售后服務協議
- 生物醫藥創新藥研發項目股權合作框架協議
- 2025江蘇南京大數據集團有限公司招聘45人筆試參考題庫附帶答案詳解
- 2025呼倫貝爾農墾集團有限公司校園招聘44人筆試參考題庫附帶答案詳解
- 高等數學-第十二章-無窮級數
- 郵政寄遞安全培訓
- 狂犬病知識教學課件
- 血透室手衛生規范
- 儲能測試面試題及答案
- 銷售公司內勤員工績效考核制度
- 社工招聘筆試題庫及答案
- 2025年-山東省建筑安全員A證考試題庫附答案
- 電子商務教學技術應用試題及答案
評論
0/150
提交評論