kinetis编程入门指南本以模块底层构件设计为主线按照嵌入式软件工程的要_第1页
kinetis编程入门指南本以模块底层构件设计为主线按照嵌入式软件工程的要_第2页
kinetis编程入门指南本以模块底层构件设计为主线按照嵌入式软件工程的要_第3页
kinetis编程入门指南本以模块底层构件设计为主线按照嵌入式软件工程的要_第4页
kinetis编程入门指南本以模块底层构件设计为主线按照嵌入式软件工程的要_第5页
已阅读5页,还剩156页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章Kinetis微处理器概 ARM简 K10和Kinetis系列控制器比 K10功 第二章实验平台简 K10实验板简 USB接 LED 11实验板使用注意事 第三章KEIL软件Keil介 第四章程序4.1器驱动安 4.2设 第五章切入——Kinetis KEIL硬件调 delay文件介 uart文件介 system文件介 LED灯实 PIT相关寄存 实验 FTM相关寄存 TSI实 TSI模块介 TSI相关寄存 SPILCD实 SPI介 SPI数据传 SPI编程方 LCD液晶屏介 ADC实 DAC实 13内部Flash实 CAN总线的历 SD卡实 SD卡概 MicroSD 第八章应用实例介 8.2信息查 飞思Kinetis系列微控制Kinetis1、ARMCortex-M4Kinetis2、K10实验板有关知识注:本资料中将Kinetis中的MK10DN512ZVLL10简称为K10,给读者带来不便敬请谅解ARM199011月成立于英国,原名为AdvancedRISCMachine公司,是苹果电脑、Acorn电脑和VLSITechnology的合资企业。1993年NipponInvestmentandFinanceARM股东后,ARM开始向全球扩展,分别在亚洲、和欧洲设立了办事处。1998年4月ARM公司在伦敦证劵所和纳斯达克所上市。目前,ARMNEONARMv7DSP和处理能力提高了近4倍,并支持改良的浮点运算,满足了下一代3D物理应用及传统嵌入式控制应用的需求。该内核架构根据应用需求分成三种系系列程序,支持大型嵌入式操作系统,如Andriod、Symbian、Linux以及WindowsRM系列(ARMv7-M):用于深度嵌入、单片机风格的系统中,该系列处理器专为电子系统智能化领域量身打造的,Cortex系列是v7架构的第一次亮相,Cortex-M4就是其中一员,本资料介绍的飞思Kinetis系列微处理器就是采Kinetis系列微处理器是飞思半导体公司于2010年下半年推出的,是业内首款ARMCortex-M4内核。Kinetis是一个新造词,具有“快速”之意。Kinetis系列微控制器采用了飞思90纳米薄膜器(TFS闪存技术和Flex器功能(可配置的内嵌EEPROM,支持超过1000万次的擦写,Kinetis系列微控制器系列融合了的低功耗革新技术,具有高性能、高精度的混合信号能Kinetis系列微处理器的第一阶段产品由五个系列组成,分别为K10、K20Kinetis系列包含了丰富的模拟、通信等外设,其中高端的属于k60系列,k10系列在产品定位上属于,属于级,和其它相比USB、段氏LCD、以太网等的支持。MK10DN512ZVLL10是飞思公司生产的Kinetis系列微控制器的芯片。配合本资料学习的实验板使用的就是该款,该包含512KB的flash器及128KB的运行内存,共100个引脚,采用LQFP封装,尺寸为14*14mm。具体请查询K10K10Sub-FamilyReferenceManual)。 值QQualificationKMFFlashT40105PackageS50=5072=72100=100120=120150=150180=180NTapeandK10功K10是Kinetis系列的级,尽管如此它也集成了许多强大的功能UARTSPII2CI2SCANADC;DAC;电压比较器(CMP);(TSI可编程延时模块(PDB;(FTM;PIT;(LPTMR;载波调制(CMT;RTCFLASH编程模块(FTFL;(SDHC☞MCU:MK10DN512ZVLL10,LQFP100;FLASH:512KB K10实验板上仅有一个机械按键,位于实验板的边缘位置,用于复位,当按下此键时系统将复位重新启动,其在实验板上的原理图如图2.2.2所示。程序时使用(程序完成后最好拔下来,因为有时会对一些引脚产生影响,其在实验板上的原理图如图2.2.3所示。在K10实验板的边沿处有一黑色插排,此接口是用于连接实验板的128*1601.8寸液晶屏,其2.2.4所示。在K10实验板的边缘有四个小方块,标注为K1~K4,配合K10的TSI模块使用,其原理图如图2.2.5所示。原理图如图2.2.6所示。.5供电,另一种是提供USB转串口功能(串口调试使用。其原理图如图2.2.7示。理图如图2.2.8所示。2.2.8LED制它的亮灭,位于实验板的两个边角上,其原理图如图2.2.9所示。(SDI硬件复位(RST、读/写选择线(A0RST线是提供液晶屏复位用的。11坏USB主机。KEIL1、如何使用keilKeil介对k10的开发采用KeiluVisionV4.53版本的软件,此版本包含了k10系列 操作系统:winxp/win732位Keil版本:keiluVision 工具:JlinkV8 Keil的 (注:新建的Kinetis工程使用 为 C语言文件keilProjectNewuVisionProject菜单选项,将弹出例暂把工程名字设为test,如下图所示; 的Kinetis 单击“是”以后,keil就把启动代码加入到了工程下面,如下图所示: K10包含许多功能模块,要让具有某些功能,首先应有该模块的底层驱动,实际就层驱动文件,下面将演示给大家如何将底层驱动文件加入到keil建的工程中。1、首先解压附带的程序包,打开“*实验”文件夹,找到SRC文件夹,将看到三个文件夹,如图1.3.8所示,将这三个文件夹到您刚开始时建立的SRC文件夹下。2、进入keil软件对文件进行管理,keil的窗口里的左边有个Project窗口,此窗口可以实现工程文件的管理,首先鼠标右击Target1文件夹将弹出一个 窗,如图1.3.9所示。1.3.9Mange3、找到MangeComponents选项,点击进入,将弹出如下图1.3.10所示的 图1.3.10Components选项卡在图下所示的框的中间栏单击新建按钮(用红色圆圈标出,也可以通过双击下面的空框,剩下的框点击“ok”就好了界面将弹出如图1.3.16所示框。按照这些..175、点击keil菜单中的按钮,新建一空白C文件,点击保存按钮将弹出如下保存框,找到刚才新建的工程,找到USER文件夹,将文件命名为main.c,点击保存。#include"sys.h" #include"sys.h" #include"delayh" #include"gpio.h" //GPIO构件#include"wdog.h" #include"uarth" //5个文件加上Keil//最小软int{}(编译按钮)编译一下,则OutWindows7、单击下图中的OptionsforTarget按钮,则会弹出OptionsforTarget‘Target1’框,选择“c/c++”选项卡,如图1.3.18所示。1.3.188IcludePaths下拉按钮,在弹出的框中加入SYSTEMHARDWARE两个文件立新的h文件时经常用到此操作1.3.19所示:1.3.19单击ok按钮,返回上一级菜单,再单击ok将返回到编译界面,再次点击编译按钮,发可以项目开发、代码和调试了。1、如何使用keil软件程序注:使用的器为j-linkV84.1器驱动安程序的方式有多种:USB、串口、JTAG、SWD等,本实验板的程序可选用 进入如下图2.2.1所示 1’按钮,将弹出如图2.2.3窗: .89、点击“OK”按钮,进入下一框,再点击“OK”按钮,将返回keil页面,至此程序请用j-link器将电脑与板的口连接好,点击 没有找到没有找到当当 第五章切入——Kinetis3、了解keilADC模块,实现模数转换的功能;PIT模块,实现内部定时中断的功能;UART模块,实现串口通信的功能等等,还有许多模块,这里将不再介绍,具体请参考k10参考手册。K10PORTA、PORTB、PORTC、PORTD、PORTE5I/O端口每个端口包含 的I/O口驱动,I/O口为PORTD端口下的7引脚,控制小灯的亮灭仅需控制PORTD下的7引脚即可实现。1、将小灯的I/O2、使用for3、将小灯的I/O4、使用for u32u32int://GoToDefinitionGPIO_Init(PTD,7,1,1);//初始化PTD7引脚设置为输出,输出1 PDout(7)=1;//PD7电平为1(小灯点亮) ;i++);//延时一定时间PDout(7)=0;//电平为0

Core/SystemClock:96M Clock: Clock: Clock:Core/SystemClock:96M Clock: Clock: Clock:Core/SystemClock:200M Clock: Clock: Clock:外部8M晶振、外部8M晶振超频。)右击Target1,选择OptionforTarget'Target1',将会弹出一框,选择Debug按钮, 在该窗口中,你可以选择你要查看的调试参数,找到需要查看的参数后,右击选择全局变量,否则会出现“cannotevaluate”提示。)查看到变量的变化情况。(注:i变量的定义必须全局参数)3、在Keil动文件,和gpio.hdelay.c文件是存放延时模块的底层驱动文件,用以提供延时uart.csystem.c文控制,用以实现最简单的IO控制功能,这是单片机的基本功能。在GPIOgpio.cgpiohhk10的I/O口输入输出宏定义及一些功能函数。C文件里包含了许多与k10底层硬件相关的设置函数,用以实现对I/O的控制。设置请查看程序包和k10手册。GPIO_InitGPIO_Init(GPIO_Type*port,intindex,intdir,intdata)port代表I/O端PTA,PTB,PTC,PTD,PTE;index引脚号,填0~31;dir输入输出方向控制,0代表输入,1代表输出;data当设置为输出功能时,1代表输出高电平,0代表输出低电平、当设置为输入功能时,1代表上拉电阻,0代表下拉电阻。它的功能是对特定端口提供初始化服务,包括开启特定端口的时钟(K10中,想用哪模GPIO_Toggle函数的函数体为GPIO_Toggle(GPIO_Type*port,intindex)其中port代表I/O端由ARM提供的位带操作实现,可是IO的控制像51那样简便,具体请参考实例程序。GPIO_GetGPIO_Get(GPIO_Type*port,intindex)其中port代表I/O端提供的位带操作实现,可是IO的控制像51那样简便,具体请参考实例程序。delay文件代码是用以驱动延时模块的底层文件,通过此文件可以实现准确的延时功能,用在DELAYdelay.c和delay.h两个文件。在hk10延时模块的DELAY_Ms函数的函数体为DELAY_Ms(u32ms),此函数用以设置毫秒级延时服务。wdog文件代码是用以驱动看门狗模块的底层文件,看门狗的作用是监视程序运行状况,防止程序跑飞、死机等不正常现象出现。它包含WDOG_InitWDOG_Close、WDOG_Open、WDOG_Feed四个函数,如果开启开门狗的话在必须在程序中定时喂狗(调WDOG_Feeduart文件代码是用以驱动uart串口通信模块的底层文件,一般常用的通信波特率为UART2、UART3UART4bus时钟频率,接收方式可以选择中system过sysh文件中的CLOCK_SETUP可以修改K10的时钟频率,最高的频率可以达具体请查看keil软件下里的system_MK10DZ10.C文件。TAB键在keil软件里支持块操作,也就是可以让一片代码整体右移一个制表位,也可以通过SHIFT+TAB键整体左移一个制表位。TAB键来快速修改成比较规范的代具条上Project->Option弹出框中选择Output栏,将里面的BrowseInfomation打钩.2方,然后通过右键选择Advanced→ mentSelection就可以了。章将通过实例,由浅入深,带大家一步步学习k10的部分模块。3、学习嵌入式C输入输出功能是的基本功能,Kinetis系列的输入输出功能通过GPIO模块来实以方便用户参考,参考资料:K10Sub-FamilyReferenceManual,Rev.6,Nov2011。每个端口可支持32个引脚(以实际配置为准。如果想实现目标需要两个功能模块:PORT、一般在K10参考手册中,越靠前的寄存器越重要,(这是一般情况,也有特殊情况。下面K10的每个模块需要一个工作时钟,在对该模块的寄存器配置之前首先应打开该模块的时钟,PORTDSIM_SCGC5寄存器上,通过资料可知,配置该寄存器的第12位为1就可打开该时钟。R010W0000000000000100

W

其C语言编程为:SIM="位赋值1)K10的引脚一般包含几种功能,通过PORT模块可以配置引脚的功能,在这里使用GPIO功能。查看PORT模块包含许多寄存器,不用担心,一般仅仅使用几个寄存器就可以了,在这里仅需配置PORTD_PCR7寄存器。R0F0WW000000000000000000 E0E 0 00在这里使用该引脚的GPIO其C语言编程为:PORTD->PCR[7]&=~0x700;现在开始配置GPIO模块的寄存器,实现引脚输出高电平的功能。打开,会发现许RW0000000000000000RW0000000000000000其C语言编程为:GPIOD->PDDR|=1<<7;配置GPIOx_PDOR寄存器该寄存器的全称:PortDataOutputRegister,翻译:端口数据输出寄存器,该寄存器是RW0000000000000000RW0000000000000000实现PORTD7引脚输出高电平,因此需要将该寄存器的71。其C语言编程为:GPIOD->PDOR|PORTC->PCR[7]|=1<<7;//在这里设置D端口的7引脚为GPIO功能PTD->PDOR|=1<<7;//在这里设置D71main.c文件里,验证程序的正确性,如果没有达到预期效果,这里需要慢慢R0F0WW000000000000000000 E0E 0 0024115610RW10000000000000000RW10000000000000000PIOx_DOR(GIO_SOR(IOx_COR电平;写0无效。(PIOx_PTOR低电平时将变为高电平;写0无效。端口数据输入寄存器(PIOx_PDIR:该寄存器引脚状态。0:引脚处于低电平状(IO_DDR1.4//功能:gpio//说明 io 引脚号0-31, 10 当设置为输入功能时1上拉电 0下拉电{PORT_Type*p;{casecase//开启PORTBcasecase//开启PORTDcase//开启PORTEdefault:} {p->PCR[index]&=~(PORT_PCR_PE_MASK作为输出口时关闭该引脚的上下拉//}{ }}//功能:gpio//说明 io 引脚号0-31, 10 必须先将对应的IO{{}{}}//功能:gpio//说明 io 引脚号0-31, { }//功能:获得gpio//说明 io 引脚号0-31, 10,1代表高电平,0{}}分别连接到分别连接到PTD6、PTD7引脚。HARDWARE文件夹下的LED文件夹下面,保存为led.c。在该文件中输入如下代码:#includevoid文件夹下面,保存为ledh。在该文件中输入如下代码:#ifndefLED_H#defineLED_H#include"gpioh"//IO#define#defineLED0 #defineLED1 voidLED_Init(void);#include"sysh"将ledh保存好,接着按照keil里介绍的方法将h文件加入到工程里,回到主界面#include"sysh"1.4.4如下代码:#include 查看代码。这样操作,就类似于C51单片机的I/O口操作。#include"gpioh"#include"uart.h" int //初始化延时函数,这是delay.c文件的函数,在这里调用 //初始化与LED构件,这是led.c文件的函数,在这里调用绝对延时串口通信是单片机重要外部接口,是与外部进行通信的方式之一,KinetisK10家3UART_TX、UART_RX、GND就可以完成基本的传输功能。10~8UART0、1、2、3号这四个串口的通信模块时钟(如果想对哪 KinetisUART0和UART1使用的时钟源为系统内核时钟,其它接口的UART模块C1)初始化UART//功能:uartx模块,//参数uartch: //说明:在 上,一共有5个uart,分别为u16sbr;u8brfa; //UART0UART1使用CoreClock{case 引脚的时钟使能,参见手册267页 在PTD6

PTD7上使能

//uart0 case //uart1 在PTC4

//在PTC3 //uart1 //caseUART2_BASE: //uart2相关的引脚的时钟使能,参见手册267页 在PTD3

//在PTD2 //uart2 //caseUART3_BASE: //uart3相关的引脚的时钟使能,参见手册267页 PTB11上使能

PTD10上使能 //uart3 //caseUART4_BASE: //uart4相关的引脚的时钟使能,参见手册267页 PTE24上使能

PTE25 //uart4 //default:} 发送接受参见手册1221页 1220 12201218 开启数据发送接受,参见手册1221页}能:1数uartch:回:能:1数uartch:回:成功:1;失败:u32//功能:n//参数uartch: buff: //说明:{inti;{}}if((uartch->S1if((uartch->S1&UART_S1_RDRF_MASK0)//判断接收缓冲区是否满,{ return }}return }6)UART6)UART模块printf//重定义fputc函数为了使用printfstructint/*Whateveryourequirehere.Iftheonlyfileyouareusingis/*standardoutputusingprintf()fordebugging,nofilehandling/*isrequired./*FILEistypedef’dinstdio.h.FILEintfputc(intch,FILEreturn//功能UART3//说明: void#ifndef#ifndefUART_H#defineUART_H#include"sysh"#define#define #define //printfvoidUART_SendN(UART_Type*uartch,u8*buff,u16len);u8UART_Re1(UART_Type*uartch,u8*ch);voidUART3串口和上位机(电脑)进行通信(USB数据线和电脑相连,安装USB转串口CP2101驱动。k10实验板供电的USB线作为串口通信的数据线(usb转串口的UART3进行通信。#include"sysh"#include"delayh"#include"gpioh"#include"sysh"#include"delayh"#include"gpioh"#include"uart.h"#include"led.h"#include"stdio2串口板............intu8 初始化调试串口printf("超核Kinetis 板 printf("CoreClockdHZr\n",PInfo.CoreClock)打印内核时钟printf("CoreClockdHZr\n",PInfo.CoreClock)打印内核时钟{ }} 1模块C1)初始化WDOGvoid{ //在这里大部分选择默认配置,时钟来源为busWDOG->PRESC=(uint16_t)0x0700u;//8,及不分频,参见手册506页}voidWDOG_Close(void){voidWDOG_Close(void){ } #ifndefWDOG_H#defineWDOG_H#include"sysh"SCALEKinetis//Allvoid2.模块HvoidvoidvoidWDOG_Feed(void);#include"sysh"#include#include"sysh"#include"delayh"#include"gpioh"#include"uart.h"#include"led.h"#include"stdio3板1...int{WDOG_Init初始化看门狗{}}在main以作为一些其它模块的触发源,例如周期性的触发DMA模块等,具体使用情况请查考23位是控制PIT1来开启模块时钟(要对此模块 作直到0,将产生中断信号,再登陆这个寄存器的值。//参//参 填voidPIT_Init(u8pit,u32time) SIM->SCGC6|=SIM_SCGC6_PIT_MASK;//开启pit模块时钟,见参考手册269页 //开启pit模块,见参考手册974页 //开启pit模块,见参考手册974页casecase1:NVIC_EnableIRQ(PIT1_IRQn);break;case2:NVIC_EnableIRQ(PIT2_IRQn);break;case3:NVIC_EnableIRQ(PIT3_IRQn);break; 1)初始化PIT//功能:PIT0void{ }//功能:PIT1void{ }//功能:PIT2void{ }//功能:PIT3void{}#ifndefPIT_H#definePIT_H#include"sysh" 板 SCALEKinetis//作者//All#definePIT_CH0 #define #define PIT模块H//#define#definePIT_CH3voidPIT_Init(u8pit,u32time);voidPIT0_IRQHandler(void);voidPIT1_IRQHandler(void);voidPIT2_IRQHandler(void);voidPIT3_IRQHandler(void);#include"sysh"#include#include"sysh"#include"delayh"#include"gpioh"#include"uart.h"#include"led.h"#include板41Kinetis4PIT int{ //开启PITCH0300MS{ }}本示例程序是控制小灯的闪烁,通过PIT模块的PIT0定时器来实现对小灯亮灭的控制。设置中断时间为300ms,小灯每隔300ms将会明暗交替一次。在main在pit.cPIT0_IRQHandler函数里加入如下所示的代码:这些事情完成后点击编译按钮,在BuildOutput窗口会出现提示,说有一个警告,通过题的文件里,在这里出警告是因为此文件的头文件中没有包含“led.hpit.c的文件顶部加入这句话:#include“led.h”,再点击编译按钮将会没有警告。置PORT寄存器就可以实现。开启该模块的时钟,在这里需要该寄存器的9~13位来开关PORT端口的时钟。PORTx_PCRn寄存器16~1910~8位: 面的GPIO章节里有介绍,在这里配置为通用gpio口即可。位:上下拉电阻使能位,在这里置“1”,允许上下拉电阻。此寄存器面的GPIO的章节里已经详细介绍了,在这里配置相应的端口引脚为输入功K10的引脚支持8种外部中断触发方式,分别为:上升沿触发DMA、下降沿触发DMA、上下降沿触发中断、逻辑1触发中断。//功能:exit//说明 io index0~31的数,视 irqc {PORT_Type*p;{break;//PORTA口使能时钟,开启内核接受中断,core_cm4.h default:} // }////功能:PORTx//说明:x代表A、B、C、D、EvoidPORTx_IRQHandler(void){u8 {}case//default:} //清除标志位参见k10241}外部中断H文件代码: EXTI_H#include"sysh" 板 SCALEKinetis //All#defineEXTI_IRQ_DISABLE #defineEXTI_IRQ_DMA_RE (1) #define #define#define#define#define#define#definevoidEXTI_Init(GPIO_Type*port,u8index,u8irqc);voidPORTA_IRQHandler(void);voidPORTB_IRQHandler(void);voidPORTC_IRQHandler(void);voidPORTE_IRQHandler(void);#include"sysh"#include#include"sysh"#include"delayh"#include"gpioh"#include"uart.h"#include"led.h"#include"pit.h"#include///5板...请用导线短接PTB1和PTD7.主程序在while(1)中控制PTD7int{PTB1PTD7(LED0产生的高低电平变化PTB1PTB1PTD7main在k10上包含8个通道的定时器,它支持捕获输入、比较输出和产生 通过该寄存器的4、3位来选择时钟源,本程序选择的是系统内核时钟(配置为01),0~3位是设置时钟分频的,在程序里自动计算选择合适的分频。FTMx_MOD寄存器 SC寄存器手册853页,在这里设置它 //功//说 //Kinetis的FTMBusClock,而非手册上所写的//50HZ-3MHZ注意:当使用<100HZ 开启引脚如下其他FTM端口需要修改初始化函数并自己配//FTM0_CH1//FTM0_CH2//FTM1_CH0//FTM1_CH1//FTM2_CH0//FTM2_CH1 {u8ps; u32mod;)//计算分频和MODE参数 //计算MODE装载参数if(mod>0xFFFF)mod=0xFFFF; {caseFTM0_BASE:SIM->SCGC6|=SIM_SCGC6_FTM0_MASK;break;caseFTM1_BASE:SIM->SCGC6|=SIM_SCGC6_FTM1_MASK;break;caseFTM2_BASE:SIM->SCGC3|=SIM_SCGC3_FTM2_MASK;break;} 页 {case{ // SC_ELSB_MASK);// }case{ // //}case{ }}} 占空比0-10000比如FTM11通道占空比为 u322)设置#ifndefFTM_H_ #include"sysh"#ifndefFTM_H_ #include"sysh"SCALEKinetis _Set(FTM_Type*ftm,u8channel,u32duty);本示例程序设置FTM0、FTM1、FTM2模块产生六路波形输出,每个模块包含两个通道输出相同频率、不同占空比的波形,使用一个For循环函数时刻改变FTM2模块1通道的波形占空比。在main#include"sysh"#include#include"sysh"#include"delayh"#include"gpioh"#include"uart.h"#include"led.h"#include"pit.h"#include"exti.h"板 端口数//FTM0_CH1//FTM0_CH2//FTM1_CH0//FTM1_CH1//FTM2_CH0//FTM2_CH1 1...100HZ以下的波形时请不要使用超频设置(200M主频下最低只能到95HZ) 2Kientis3FTMFTMint{{u16i; //FTM0100HZ //FTM05000HZ {{ }}} 到Inpu(TSI的输,其触控原理是:当有感应物体接近TSI引脚时将会引起电极板电容值的变化,TSI模块通过检测电极板电容值的变化来判断触控动作。TSI模块C///TSI///TSI初始化开启PTB16-19//KEY1PTB16//KEY2PTB17//KEY3 //KEY4 void{SIM->SCGC5|=(SIM_SCGC5_TSI_MASK); //开启TSI时钟 //开启B口时钟 //开启C口时 //设置对应引脚为TSITSI0->GENCS|= TSI0->SCANC&=~TSI_SCANC_EXTCHRG_MASK;//外部振荡器充电电流0-31TSI0->SCANC|= TSI0->SCANC&=~TSI_SCANC_REFCHRG_MASK;//参考时钟充电电路 TSI0->SCANC|= TSI0->SCANC&=~TSI_SCANC_DELVOL_MASK;//增量电压设定选择TSI0->SCANC|= TSI0->SCANC|= TSI0->GENCS|=TSI_GENCS_TSIEN_MASK; //开启TSI /*TSITSI0->GENCS|TSI_GENCS_STM_MASK启动TSI= }void{u16i;TSI0->GENCS|=TSI_GENCS_SWTS_MASK; /*TSI*/while(!(TSI0->GENCS&TSI_GENCS_EOSF_MASK)){};/*等待扫描结束*/for(i=0;i<50000;i++);/*延时一段时间*/counter_temp // ELECTRODE_SHAKE)|TSI_THRESHLD_LTHH(counter_temp-ELECTRODE_SHAKE);counter_temp // ELECTRODE_SHAKE)|TSI_THRESHLD_LTHH(counter_temp-ELECTRODE_SHAKE);counter_temp= ELECTRODE_SHAKE)|TSI_THRESHLD_LTHH(counter_temp-counter_temp= ELECTRODE_SHAKE)|TSI_THRESHLD_LTHH(counter_temp-ELECTRODE_SHAKE);TSI0->GENCS&=~TSI_GENCS_TSIEN_MASK;//先 }//TSIu16TSIStatues; //TSIu16TSIStatues; voidTSI0_IRQHandler(void){u16Status= Status=(u16)(TSI0->STATUS&0x0000FFFF);{//}{\}{\}{ };//TSI0->GENCS|=TSI_GENCS_OUTRGF_MASK; TSI0->GENCS|=TSI_GENCS_EOSF_MASK; TSI0->STATUS=0xFFFFFFFF;// }{}TSI模块H#ifndef#ifndefTSI_H_#defineSCALEKinetis//All#include"sys #defineELECTRODE_SHAKE /*******************TSI16个通道使能宏********************************/#defineTSI_CH0_EN_MASKTSI_PEN_PEN0_MASK#defineTSI_CH1_EN_MASKTSI_PEN_PEN1_MASK#defineTSI_CH2_EN_MASKTSI_PEN_PEN2_MASK#defineTSI_CH3_EN_MASK#defineTSI_CH4_EN_MASK#defineTSI_CH5_EN_MASK #defineTSI_CH6_EN_MASK #defineTSI_CH7_EN_MASK #defineTSI_CH8_EN_MASK #defineTSI_CH9_EN_MASK #defineTSI_CH10_EN_MASKTSI_PEN_PEN10_MASK#defineTSI_CH11_EN_MASKTSI_PEN_PEN11_MASK#defineTSI_CH12_EN_MASKTSI_PEN_PEN12_MASK#defineTSI_CH13_EN_MASKTSI_PEN_PEN13_MASK#defineTSI_CH14_EN_MASKTSI_PEN_PEN14_MASK //为了解决飞思极2!#defineELECTRODE0_COUNT(u16)((TSI0->CNTR1)&0x0000FFFF)#defineELECTRODE1_COUNT(u16)((TSI0->CNTR1>>16)&0x0000FFFF)#defineELECTRODE2_COUNT(u16)((TSI0->CNTR3)&0x0000FFFF)#defineELECTRODE3_COUNT(u16)((TSI0->CNTR3>>16)&0x0000FFFF)#defineELECTRODE4_COUNT(u16)((TSI0->CNTR5>>16)&0x0000FFFF)#defineELECTRODE5_COUNT(u16)((TSI0->CNTR5>>16)&0x0000FFFF)#defineELECTRODE6_COUNT(u16)((TSI0->CNTR7)&0x0000FFFF)#defineELECTRODE7_COUNT(u16)((TSI0->CNTR7>>16)&0x0000FFFF)#defineELECTRODE8_COUNT(u16)((TSI0->CNTR9)&0x0000FFFF)#defineELECTRODE9_COUNT(u16)((TSI0->CNTR9>>16)&0x0000FFFF)#defineELECTRODE10_COUNT(u16)((TSI0->CNTR11)&0x0000FFFF)#defineELECTRODE11_COUNT(u16)((TSI0->CNTR11>>16)&0x0000FFFF)#defineELECTRODE12_COUNT(u16)((TSI0->CNTR13)&0x0000FFFF)#defineELECTRODE13_COUNT(u16)((TSI0->CNTR13>>16)&0x0000FFFF)#defineELECTRODE14_COUNT(u16)((TSI0->CNTR15)&0x0000FFFF)#defineELECTRODE15_COUNT(u16)((TSI0->CNTR15>>16)&0x0000FFFF)voidTSI_Init(void);TSI4个触控引脚,分别为、、、其对应于实验板的k1、k2、k3、k4四个触控按键。点击按键时,小灯会做出反应,同时使用串口,将您当前在main#include"sysh"#include"sysh"#include"gpio#include"uart.h"#include"led.h"#include"pit.h"#include"exti.h"#include"ftm.h"#include#include"uart.h"#include"led.h"#include"pit.h"#include"exti.h"#include"ftm.h"#include板......KEY1PTB16TSI_CH9KEY2PTB17TSI_CH10KEY3 KEY4 // intmain(void));// //TSI/从机输入数据线MOSI和从机片选信号SSSPI进行通信的一般过程:主机发送片选信号SS;主机发送时钟信号SCK;SCK时序发送数据MOSI;初始化SPI//SPI//参数 01 DataLen见k10269k10269spi1NVIC_EnableIRQ(SPI1_IRQn);开启spi中断函数来自 spi2k10264NVIC_EnableIRQ(SPI2_IRQn);开启spi中断函数来自spi->MCR=0|SPI_MCR_CLR_TXF_MASK //TxFIFO计数器k10手册1131页| //RxFIFO计数器|SPI_MCR_PCSIS_MASK 设置所有片选信号在高电平时为高电平。见k10手册1131页|if(Master== | |||||SPI_CTAR_FMSZ(DataLen-1)//设置数据传输的位数,此时设置了传输8+1位 见k10手册1134页| //见k101134k101136k101134页见k10手册1134页}

| //设置通信频率的,进行分频,0~15| //|SPI_CTAR_CPHA_MASK;//设置时钟相位为先改变后捕获 spi->CTAR_SLAVE[0]=0|SPI_CTAR_SLAVE_FMSZ(DataLen-1)//设置数据传输的位数,此时设置了传输8+1位 见k10手册1137页|SPI_CTAR_SLAVE_CPOL_MASK //设置时钟极性在空闲状态是高电平见k10手册1137页|SPI_CTAR_SLAVE_CPHA_MASK;//设置时钟相位为先改变后捕获见k10手册1137页}spi->SR=| | |spi->RSER|SPI_RSER_RFDF_RE_MASKk10页 }33)SPI//功能SPI1//参数:voidSPI1_IRQHandler(void)u32SPI1->RSER&=~SPI_RSER_RFDF_RE_MASKk10 chSPI1->POPR 数据,见k101145 ////参数 spi->SR=|| //清除状态标识,见k101139| #ifndef#ifndefSPI_H_#defineSPI_H_#include"sysh" SCALEKinetis #define 1#define 0voidSPI_Init(SPI_Type*spi,u8Master,u8DataLen);voidSPI_Send1(SPI_Type*spi,u16data);源代码请参见程序中的SPILCD.C文件。A在main#include"sysh"#include#include"sysh"#include"delayh"#include"gpioh"#include"uart.h"#include"led.h"#include"pit.h"#include"exti.h"#include"ftm.h"#include"tsi.h"""//板又能占用较少的IO 3SPILCD2IO软访和硬件SPISPI驱动需要时请修改spilcdh中的宏定义int LCD_ShowString(0,0,"CoreClk: LCD_ShowString(0,10,"LCDW LCD_ShowString(0,20,"LCDH LCD_ShowString(0,40,"CHKV2.2Test8");} }4对差分输入,在这模块下又包含2个独立的ADCADC0、ADC1。N2的N1。例如,AD的采样精度为16位,参考电压为3.3V,则检测到的模拟量最小变化为0.05mV。ADC0orADC1//本构件支持的ADC 此步骤将的数据进行实体化,赋予它一定的物理意义,例如温度、湿度、浓度、大气压ADC模块CK10K10K10K10{{ k10手册页SIM->SOPT7=}{页}

k10手册adc->CFG1|=ADC_CFG1_ADIV(3); {switch{casecase2:break;case3:break;case4:break;case5:{

}case{

}case{

}case{

}case{

}casecase12:{

}case{

}case{

}case15:break;case16:break;case17:{

}case{

}casecasecase20:break;case21:break;case22:break;case23:break;case24:break;default:}}{ }} struct{ }saved_regs;saved_regs.SC2=adc->SC2;/*EnableSoftwareConversionTriggerforCalibrationProcessadc->SC2&=adc->SC3 /*Waitforconversiontocompletewhile(adc->SC2&/*Checkifcalibrationfailedif(adc->SC3& /*Clearcalibrationfailedflag/*calibrationfailed*/return1;/*Calculateplus-sidecalibrationvaluesaccordingtoCalibrationfunctiondescribed/*1.Initialize(clear)a16bvariableinRAM*/cal_var=0x0000;/*2.Addthefollowingplus-sidecalibrationresultsCLP0,CLP1,CLP2,CLP3,CLP4,andCLPStothevariable.*/cal_var+=adc->CLP0;cal_var+=adc->CLP1;cal_var+=adc->CLP2;cal_var+=adc->CLP3;cal_var+=adc->CLP4;cal_var+=adc->CLPS;/*3.Dividethevariablebytwo.*/cal_var=cal_var/2;/*4.SettheMSBofthevariable.*/cal_var+=0x8000;/*5.Storethevalueintheplus-sidegaincalibrationregistersADCPGHandADCPGL.*/adc->PG=cal_var;/*Repeatprocedurefortheminus-sidegaincalibrationvalue./*1.Initialize(clear)a16bvariableinRAM*/ =0x0000;/*2.Addthefollowingplus-sidecalibrationresultsCLM0,CLM1,CLM2,CLM3,CLM4,andC tothevariable.*/ =0x0000;cal_var+=adc->CLM0;cal_var+=adc->CLM1;cal_var+=adc->CLM2;cal_var+=adc->CLM3;cal_var+=adc->CLM4;cal_var+=adc- /*3.Dividethevariablebytwo.*/cal_var=cal_var/2;/*4.SettheMSBofthevariable.*/cal_var+=0x8000;/*5.Storethevalueintheminus-sidegaincalibrationregistersADCMGHandadc->MG=/*ClearCALbit//adc_ptr->SC3&=~ADC_SC3_CAL_MASK;//doneinnextlineadc->SC3=saved_regs.SC3;return0;}ADC模块H#ifndef#ifndef #defineadc_h #defineadc_h #include"sysh"SCALEKinetis//All#defineB#defineADC_8BIT u16ADC_Get(ADC_Type*adc,u8Ch);晶屏上,通过TSI按键Key1和Key4可以进行翻页操作。#include"sys#include"sys#include"delayh"#include"gpioh"#include"wdog.h"#include"uart.h"#include"led.h"#include"pit.h"#include"exti.h"#include"ftm.h"#include"tsi.h"#include"spilcd.h"#include"stdio 板 1K10的ADCADC0ADC1差分输入部分单端输入还可以复用为A通道和B通道 2... 同时在串口和液晶屏上打印出AD各个通道的AD值由于LCD显示内容有限使用TSI的触摸按键功能实现翻页显示 K10 K10 K10 K10 E16-E19K10(USBKinetis)K60USBconstu8{ "AD0-9( "AD0-8( V",//K10Only"AD0-5(E17) V",//K10Only"AD0-6(E18) V",//K10Only"AD0-7(E19) V",//K10Onlyu8LastPage=0上一次的页数intmain(void){u8 //TSI初始化LCD_ShowString(0,0,"CoreClk: PAGE/3K4:Up"); //17E24SPILCDCS{{switch{for(i=0;i<7;i++)LCD_ShowString(0,30+10*i,ADC0_STRING_TABLE1[i]);break;}

);//{据

据 据

据 据}{据

}{ 据 据 据 据}}}换成模拟量,影响DAC模块性能的一般有两个指标://dacvoid{页//dac 页; //开启dac798}1DAC模块C)//Dat0-4096voidDAC_Set(u16Dat){}#ifndefDAC_H#defineDAC_H#include"sysh"#ifndefDAC_H#defineDAC_H#include"sysh"SCALEKinetis//AllvoidDAC_Init(void);1、调用DAC_Init函数,开启DACADC14通道进行模数转换,并将结果显示在液晶屏上,进行注:实验时请将C0引脚与DAC_OUT在main#include"sysh"#include#include"sysh"#include"delayh"#include"gpioh"#include"uart.h"#include"led.h"#include"pit.h"#include"exti.h"#include"ftm.h"#include"tsi.h"#include"spilcd.h"#include"adc.h" 板 1KientisDAC12 2...本实验使用ADC0-SE4(C0)通道 到DAC_OUTint{u16DAC_Value;//数模转换的数字量u16AD_Value=0;//模数转换的结果值();//LCD_ShowString(0,0,"CoreClk: LCD_ShowString(0,10,"CHKV2.2Test10DAC");LCD_ShowString(0,30,"ConnectC0&DAC_OUT"); { 压//显示DAC//显示DACSPILCD_ShowNum(90,60,((DAC_Value*3300)/4096)/1000,1,ASCII1206);//显示ADCSPILCD_ShowNum(90,90AD_Value*3300/4096)/1000,1,ASCII1206显示ADC}}7.11计数实数器,因此最大的计数值为65535。 计数,填写LPTM_CH1-case //port口的模块时钟,详见k10手册268页;238}case{

//port时钟,详见k10268册238页;238}

case{

//port时钟,详见k10268238}}

页 页 页 //开启模块,详见k10984}u16u16 LPTMR0->CSR|=LPTMR_CSR_TEN_MASKk10#ifndeflptm_h#definelptm_h#include"sysh"#ifndeflptm_h#definelptm_h#include"sysh"SCALEKinetis//All#defineLPTM_CH1#defineLPTM_CH2#definevoidLPTM_Init(uint8_tchannel)uint16_tLPTM_Counter(void) 11.4LPTM_InitLPTMLPTM_Counter注:实验时请将C5引脚与A4在main#include"sysh"#include"delay#include"sysh"#include"delayh"#include"gpioh"#include"wdog.h"#include"uart.h"#include"led.h"#include"pit.h"#include"exti.h"#include"ftm.h"#include"tsi.h"#include"spilcd.h"#include"adc.h"#include"dac.h"板111...本实验开启LPTM_CH2(C5)作为脉冲计数输入并开启PIT01000MS 2...开启FTM模块的FTM0_CH1通道产生 int{LCD_ShowString(0,0,"CoreClk: LCD_ShowString(0,20,"ConnectC5&A4"); , 7.12CPUCPUCPU的执搬运一字节数据减1的特性,只需对DMA程序实例的dma.c文件。1、调用DMA_Count_Init函数,配置DMA本示例程序通过调用DMA_Count_Init函数,配置DMA模块实现脉冲计数功能,调用DMAGetCtrFTM3个通道产生一定频率的波形,在main#include"sysh"#include"delay#include"sysh"#include"delayh"#include"gpioh"#include"wdog.h"#include"uart.h"#include"led.h"#include"pit.h"#include"exti.h"#include"ftm.h"#include"tsi.h"#include"spilcd.h"#include"adc.h"#include"dac.h"#include"lptmh"#include 板 14 2 3...本实验开启A4B1B19输出不同频率的 并开启B2C0D0口为脉冲捕捉口试验时请将A4B1B19连接到B2C0D0观察LCD现象即可 4...试验原理:DMA自动对IO 的脉冲进行自动计数程序中开PIT0定时取走脉冲数并使DMA重新1秒内计数不可以超过30000 u16DMACtrValue[5]; intmain(void){LCD_ShowString(0,0,"CoreClk: LCD_ShowString(0,10,"CHKV2.2Test12");LCD_ShowString(0,40,"FTM0_CH1(A4500Hz");LCD_ShowString(0,50,"FTM1_CH1(B1):5000Hz"); //开启PB2和PC0PD0为多路脉冲计数输入DMA_Count_Init(DMA_PORTB,DMA_CH3,2);//B2DMA_Count_Init(DMA_PORTC,DMA_CH4,0);//C0DMA_Count_Init(DMA_PORTD,DMA_CH5,0D0PIT_Init(PIT_CH0,1000);//在中断里统计脉冲个数{}}//功能:PIT中断通道0{ } 到k10实验13Flash户编程功能,可以代替EEPROM的工作,即简化了电路设计,又节约了成本。(Program入是将单元的特定位由二进制的1变成0。Flash的写入操作是以字节为单位进行的,每次写入4个字节。在执行写入之前要除的单位为2K。注:读Fah函数实际就是普通的指针操作,写Fah函数实际包含了三步:读数据块数据、擦SCALEKinetis//All//本程序只供学习使用由苏州大学的flashstaticuint8_t {u16sectorNo=(u32)(sectorNo*(1<<11)+offset);//计算数据 { }} 参数:sectorNo u8 {u16 //备份扇区64字 { } }{u16{ }//判断地址偏移是否对齐(因为最小 单位为32b)if(offset%4!=0)//FTFL->FCCOB0= //{//设 //拷贝数据(此数据排列按照从低位 FTFL->FCCOB4=buffer[3];FTFL->FCCOB5=buffer[2];FTFL->FCCOB6=buffer[1];return2;}return} {{ }=());////FTFL->FCCOB0ERSSCR;////returnreturn}u8{//清 // return(0);//成功}#include"sysh"#include"delayh"#include"gpioh"#include"wdog.h"#include"uart.h"#include"led.h"#include"pit.h"#include"exti.h"#include"ftm.h"#include"tsi.h"#include#include"sysh"#include"delayh"#include"gpioh"#include"wdog.h"#include"uart.h"#include"led.h"#include"pit.h"#include"exti.h"#include"ftm.h"#include"tsi.h"#include"spilcd.h"#include"adc.h"#include"dac.h"#include"flashh" #include"stdioh" 板 13 1...Kinetis的Flash分为块0和块 块0又叫做程序 块1又叫 2Kinetis的Flash最小读写单元是一个扇区 int{u16u8u8LCD_ShowString(0,0,"CoreClk: for(i=0;i<WRITE_LEN;i++)Buf[i]=i;LCD_ShowString(0,40,"WrittingSector100"); 100扇区0偏移写入256LCD_ShowString(0,50,"WrittingSectorok");for(i=0;i<WRITE_LEN;i++)Buf[i]=0; Sectorok");for(i=0;i<WRITE_LEN;i++)printf("%d",Buf[i]);//串口打印所有数据for(i=0;i<WRITE_LEN;i++)if(Buf[i]!=i)err++; {LCD_ShowString(0,70,"FlashTestok!");printf("FlashTestok!\r\n");}{printf("FlashTestfail!\r\n");}{{printf("FlashTestfail!\r\n");}{}}CAN:ControllerAreaNetwork2080年代末,是为简化中信号传输方式并减少日益增加的信号线而。CAN总线是一种单一的网络总线,所有的器件都可以挂接在该总线上。目前,CAN总线技术在、电梯RS485通信总线相比,CAN网络上的任何一个节点均可作为主节点主动与其它节点每个CANCANtxCANrx两个引脚。CANtxCAN总线CAN8字节的数据,对应更详细的帧结CAN模块的特性及一般的工作情况,CAN模块通过以下函数即可实现简单的通//参数:can//can//bus{u8if((u32)can=={//CAN_RX/TXPTB17/18for PORT_PCR_PS_MASK PORT_PCR_PS_MASK}{//CAN_RX/TXPTE24/25 PORT_PCR_PS_MASK PORT_PCR_PS_MASK}can->CTRL1|= can->MCR&=~CAN_MCR_MDIS_MASK; //开启CAN通信模块while((CAN_MCR_LPMACK_MASK&(can->MCR))); can->MCR|=CAN_MCR_SOFTRST_MASK; while(CAN_MCR_SOFTRST_MASK&(can->MCR)); while(!(CAN_MCR_FRZACK_MASK&(can->MCR))); //等待模块进入冻结模式{ ;}=(can->MCR|CAN_MCR_IDAM(0IDA格式,见参考手册1050页can->MCR| (自己理解的,设置传输一bite的时间/*此处可以修改CAN通信的速率 每一位的传输时间为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论