版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
野火嵌入式开 随着技术的发展,单片机型号越来越繁多,的难度也逐渐加多,学习周期自然不断延长。为了让初学者快速,减少学习时间,尤其是为了那些参加智能车比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"//#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"//延时实验说明:野火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年高职车联网技术(车联网应用)试题及答案
- 2025年大学农学(实操应用)试题及答案
- 2025年大学大三(财务管理基础)资金管理实践测试试题及答案
- 2025年高职会计(审计)试题及答案
- 2025年高职第二学年(大数据技术)大数据分析应用试题及答案
- 2026年蔬菜种植(大棚蔬菜管理)试题及答案
- 2026年大豆种植(大豆收割技术)试题及答案
- 比亚迪索赔培训课件
- 2026届四川省泸州高级中学高一生物第一学期期末经典试题含解析
- 路基换填施工方案标准
- 【期末必刷选择题100题】(新教材)统编版八年级道德与法治上学期专项练习选择题100题(含答案与解析)
- 关于怎样展开督导的工作方案
- 中国数联物流2026届校园招聘50人考试题库及答案1套
- 2025年大学网络工程(网络安全技术)试题及答案
- 建筑公司工资薪酬管理制度(3篇)
- 中国餐饮巨头百胜集团深度分析
- 2024-2025学年福建省厦门市双十中七年级(上)期末英语试卷
- 胸锁乳突肌区课件
评论
0/150
提交评论