下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
三天入门Cortex-M4——Kinetis系 三天入门Cortex-M4——Kinetis系随着技术的发展,单片机型号越来越繁多,入门的难度也逐渐加多,学习周期自然不断延长。为了让初学者快速入门,减少学习时间,尤其是为了那些参加智能车比KetsKets开发板的。力求大大减少初学者的学习时间。野火Kinetis开发,主要有IAR的使用、Kinetis启动流程讲解、野火K60库的调用三个部分组成。我们不再详细讲解寄存器,而且推荐直接调用我少的后顾之忧,可以加快的开发速度。目前,单片机型号如此之多,而产品的开发所允许给我们的时间越来越少,我们完全没有必要深入研究寄存器设置,就算你能把寄存器背得滚瓜烂熟,过段时间不去接触,还是没法记住的。现在的单片机开发,工程师往往都用 的固件库来进行开发,而不靠自己重新建立自己的函数库进行开发。例如T公司推出的ST库,让你可以完全不需要考虑底层开发而直接开发自己的。飞思卡尔公司,在这方便确实让到失望这也是野火嵌入式 要建立自己的野火Kies库的原因。野火K60库的函数接口,尽量追求简洁明了、通俗易懂,力求初学者见其名就会用。目前提供了6Kes板实验例程想快速上手K60单片机吗?野火KinetisK60库,是你最好的选我们 是:三天入门~1三天入门Cortex-M4——Kinetis系 我们喊出这样 并不是吹的,已经有两位大三参加智能车的朋友(同一个队在使用我们的与k60库三天时间内就能xs128上的0v7725驱动程序和舵机控制程序移植到Kinetis上跑起来;一位大二的师弟,不到一天的时间就从入门到搞定头ov7725和液晶LCD的移植„„你会是下一位吗?只要我们敢拼,一切皆有可能!!!Nothingisimpossible!!!由于个人能力及时间所限,出错之处,在所难免,欢迎各 错误及提出建议m——野火嵌入式开2012-3-们Technical~2 三天入门Cortex-M4——Kinetis系 三天入门Cortex-M4——Kinetis系 前 Kinetis的启动分析(初学者大概浏览一下即可 初步入门:初始化函数启动执行顺 逐步提高:ROM、RAM启动工作原理、ICF文件讲 IAR的使 安装 建立IAR工 创建工程文 添加GPIO驱动和点亮 IAR工程选项设 快速建IAR工 IAR使 功能介 工作区工程的选定与切 通过 并调 使用软件仿真调 IAR界面风格设 野火 板实验例程列 野火K60库的使 前 快速开发指 快速入门:了解野火Kinetis工 中断函数的编写方 重要变量、函数、宏定义一览 安全检 GPIO模 快速入门:GPIO库使用方 GPIO测试例 LED模 快速入门:LED库使用方 LED综合测试例 ~3三天入门Cortex-M4——Kinetis系 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三天入门Cortex-M4——Kinetis系 DSP测试例 野火Kinetis开发板问题 资料在哪里可 到?(IAR、Jlink驱动 jlink供电到开发板 关于Kinetis时 IAR报错找不到头文 问 printf使用方 Kinetis单片机的IO口支不支持5V耐压 Kinetis最多可以输出多少个频率不同 脉冲波 kinetis捕捉 脉冲计数方 ADC引脚中带a、b表示的意 不带有浮点单元能进行浮点运算吗 ~5 三天入门Cortex-M4——Kinetis系 Kinetis的启动分析(初学者大概浏览一下即可初步入门:初始化函数启动执行顺序上电复 中断向量①
中断向量表在vectors.c里定义,在vectors.h文件里前两BOOT_STACK_ADDRESSReset_Handler(自带例程startup),第一个为起始SP栈指针、第二个为复位中断Reset_Handler函数。
crt0.s里用汇SECTION.noinit:EXPORTReset_Handler;初始化寄存 iimport ;调用C语言编写的start函
start.c文件里定义,精简后的void{wdog_disable();//关闭看门 数据段、中断向量表到sysinit();//时钟初始化 /**main函数**/while(1);//避免停止运行}main④
段、以ramfunc 到RAM区(对flash操作的函数
voidsysinit{core_clk_mhz=pll_init(MCG_CLK_MHZ);trace_clk_init();//使能时钟,用于调试fb_clk_init();//FlexBus时钟初始化uart_init(FIRE_PORT,//printf函数所用到
}~6三天入门Cortex-M4——Kinetis系
初始化的整体 关闭看
清寄存
制中断向量表到 动修改中断向量表地 为RAM里的地 分初始化数 清除RAM中初始化0的数据段把以ramfunc 子函数.textrw到RAM初始化锁相环到的串口 用户任注:common_startup函数并没 常量数据.rodata、代码.text。如果RAM启动,代码会直接编译进去RAM,掉电就会丢失数据。如果是ROM启动,就会中断向量表到RAM,设置中断向量表地址为RAM的地址,以加快中断响应速度。~7 三天入门Cortex-M4——Kinetis系 逐步提高:ROM、RAM启动工作原理、ICF文件讲ROM、RAM启动,首先需要对器Ler如何分配内存有一定的了解。最低内存地址中断向量代码数据堆栈命令中断向量代码数据堆栈命令行参未初始化变量段常量段已初始化全局变量和静态变量段.data程序运行中由程序员调用malloc等函数来申请局部变局部变在函数内部定义的非静态的变量最高地inta=0;staticintb=20;char*p1;constintA=volatileconstintB={intb;staticintc=chars[]=char*p3=//.bss//代码区//全局(静态).datap1char*malloc(10//1020p2=(char*)strcpy(p1,17.~8火 三天入门Cortex-M4——Kinetis系 火参考原文出处 -id-那编译到时候,编译器是如何为这些变量数据分配地址的呢其实,这就是器Lir数据分配合适的地址,这样我们就可以不需要考虑这些内存分布就能写出可运行的代编译器对代码进行编译,一般分为四个
编译和
汇 汇编成
器Linker的配置文件都是由 在fire_Kinetis\build\configfiles文件夹下,你可以看到有很多的linker配置文件这里的文件是用来分配数据在内存中的位置,配置ROM、RAM启动,linker根据这些文件来为Kinetics4G的虚拟寻址空间地址。如果把代码部分编译进RAM,那就是RAM启动;如果把代码数据编译进去ROM,那就是ROM启动(flash启动)。不同的型号,flash内存大小不一样,所以配置Linker文件也会不一样,以为例~9三天入门Cortex-M4——Kinetis系 野火Kinetis 板自带为MK60DN512,512KB的Programflash大小,128KB的SRAM大小,没有FlexNVM和FlexRAM。K60的4G虚拟寻址空间就是按照内存空间的映射图来进行配~10三天入门Cortex-M4——Kinetis系 如果要RAM启动,我们要把代码编译进SRAM_L,定义中断向量表可以打开fire_RAM_K60N512.icf这个文件(用记事本打开就行),这个配置文件是参考128KB_Ram.icf来重新修改和添加了注释。的配置文件写得真的思路太乱了,如果你仅仅用ICF编辑软件来配置的配置文件,是非常容易出错的!你必须要用ICF配置好后,还要打开配置文件来修改。野火已经对配置文件进行修改,在里面添加了很多注/*###ICF###SectionhandledbyICFeditor,don'ttouch!/*-Editorannotationfile-/*
define =define define = define define
= define define /****EndofICFeditorsection./****上边是由ICF编辑,下面是由我们手动配置****/ Kinetis的SRAM是分成两块的。define ;//SRAM是分成两块的,RAM2SRAM_U,RAM为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_enddefineregion = ICFEDIT_region_RAM_end
| region_RAM2_end~11三天入门Cortex-M4——Kinetis系 defineblockCSTACK withalignment=8,size=defineblock withalignment=8,size//手动初始common_startup完
//堆,8字节对//栈,8字节对initializemanually{readwrite}; //未初始化数据.bssinitializemanually{section.data}; //已初始化数据initializemanually{section.textrw donotinitialize{section.noinit defineblockCodeRelocate{section.textrw_initdefineblockCodeRelocateRamsectiontextrw placeataddressmem: {vec//vectors.c中设置#pragmalocationintvec,告诉编译器,这个是中断向量表,编译进去.noinit段放在代码开placeataddressmem: {readonlysection.noinit//crt0.s中设置了复位中断函数为SECTIONnoinitCODE,即把代码编译编译进去RAMplacein {readonly,blockCodeRelocate//把代码编译进去RAM(调试用,掉电丢失,非调试,则设为placein {readwrite,block SP,把0x 内容给PC。断,用RAM的中断向量表Linker根据icf配置文件来进行分配内
中断向量代中断向量代码数据堆栈命令行参ROMBootloader中断向量RAMBootloaderRAMBootloader中断向量RAM配置寄存堆栈~12三天入门Cortex-M4——Kinetis系 如果是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./****ICF编辑,下面是由我们手动配置define = define = ICFEDIT_region_RAM_startdefineexported VECTOR_TABLE ICFEDIT_intvec_start//代码编译进ROM,则 ;RAM, defineexported VECTOR_RAM ICFEDIT_region_RAM_start//RAM留给RAMUserVectorTable,即这里的设置。所以减
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,size 51. blockwithalignment=8,size=//common_startup完
initializemanuallyreadwrite //未初始化数据initializemanuallysection
initializemanually{section.textrw};
58.donotinitializesectionnoinit defineblockCodeRelocate{section.textrwinitdefineblockCodeRelocateRam{section.textrw//把CodeRelocate代码 到RAM中的CodeRelocateRam(对flash操作的函数必须这样)placeataddressmem: {vec//vectors.c中设置#pragmalocationintvec",告诉编译器,这个是中断向量表,编译进去.intvecplaceataddressmem: {readonlysection.noinit野火嵌入式开发工作 ~13火三天入门Cortex-M4——Kinetis系 火//crt0.sReset_Handler为SECTIONnoinit//Reset_Handler编译进code_startplacein {readonly,blockCodeRelocate//把代码编译进去ROM调试用,非调试,则设为placeinRAM {readwrite,blockblockCSTACK,blockHEAP
代码编译进ROMLinker根据icf配置文件来进行分配内
到RAM,以 断就会RAM的中断向量ROMBootloader中断向量中断向量代码数据命令行参RAMBootloaderRAMBootloader中断向量RAM配置寄存Code.bss和堆栈0x1FFF-前面的内容,不知道大家是否都看懂呢?熟悉单片机的内存分配,是每一个电子软件工程师所必备的。如果对单片机的内存分配都不了解,那就算会写单片机的驱动程序,也难以保证程序的质量。那在IAR里,怎么知道编译生成的文件的内存图?在工程选项里,设置生成mapfile就行:~14三天入门Cortex-M4——Kinetis系 设置好,编译后,在fire_Kinetis\build\xxx_demo\xxx模式\List文件夹下就会有.map文件。 这里的内容,就是ICF配置~15火 三天入门Cortex-M4——Kinetis系 火那什么是ICF编辑器呢呵呵,在工程名里右键——Options——
ICF编辑器,可以在里面设~16三天入门Cortex-M4——Kinetis系 ~17 三天入门Cortex-M4——Kinetis系 IAR的使野火推荐的是直接在野火提供的K60库模版上添加 重建工程,但学会自己建立工程是必须的,这里给大家详解建立IAR工程的步骤。一 安装软 的IARforARM为v6.30,支持 的Kinetics系列 地址 /folder/fautzfbt里的CD-EWARM-6301-二 安装IAR详细过后解压文件,打 ,运行安装文件~18三天入门Cortex-M4——Kinetis系 选择安装IAREmbedded~19三天入门Cortex-M4——Kinetis系 选择同意,然后点击~20三天入门Cortex-M4——Kinetis系 需要打开软 ,找 机文件,并运行它按下任意键,会自动打开license.txt文件,并提示:搜索"EWARM",找到所行的key~21三天入门Cortex-M4——Kinetis系 key上一行的Installserial即为我们这里所需要的Next后,填入key所在License~22三天入门Cortex-M4——Kinetis系 包括#号哦Next后,根据自己情况选择安装路径设置「开始」菜单文件夹,还是继续~23三天入门Cortex-M4——Kinetis系 经过漫长的等待噔噔噔噔„„华丽丽地按个finish结束安装~24三天入门Cortex-M4——Kinetis系 运行IAR,语言选择,按OK结IAR的编程界面~25三天入门Cortex-M4——Kinetis系 相对于KeilForARM、CodeWarrior而言,IAR forARM的编程界面是最简单的,~26 三天入门Cortex-M4——Kinetis系 三 安装仿真器驱又换会原来的安装导航界面:选择Install野火Kinetics开发板,选择了用jlink作为仿真调试器,因此这里选择jlink运行安装文~27三天入门Cortex-M4——Kinetis系 运行后,会自动安装驱动,不会有其他另外,为了可以使用擦 等功能,我们可以选择用segger公司的j-~28三天入门Cortex-M4——Kinetis系 地址:SetupJLinkARM安装时,一路狂Next就行安装后,在开始菜单里找到J-FlashARM,运行它即~29三天入门Cortex-M4——Kinetis系 建立IAR工程创建工程文件一 准备材在建立IAR工程前,需要 的Kinetis例程,提取里面的配置文件和地址:KINETIS512解压后,打 ,会看到两个文件二 建立IAR工程过在这里,我们以GPIO为例子,点亮LED,一步步操作,讲解建立工程的详细程建立工作空File——New——~30三天入门Cortex-M4——Kinetis系 建立工 里选择Project——CreateNew~31三天入门Cortex-M4——Kinetis系 接着在弹出来 框里选择空的工程,点击确~32三天入门Cortex-M4——Kinetis系 接着弹出选择保存工程 框。由于我们还没建保存工程的文件夹,我们就接 框里新建:右键——新建——文件夹——重命名为打开新建的fire_Kinetis文件夹,再建一个build文件夹,build文件里再建一个gpio_demo文件夹,把工程文件保存在gpio_demo文件夹里面,工程文件名为:fire_gpio_demo,文件结构如下图:~33三天入门Cortex-M4——Kinetis系 保存后,进入IAR界面,别忘了工作区还没有保存哦。在菜单栏里找到图 点击保存全部文件,把工作区文件保存在fire_Kinetis文件夹下,名字为fire_Kinetis~34三天入门Cortex-M4——Kinetis系 这样,一个空的IAR工程骨架就建立完毕…往工程添加 自带函数例程文件夹下的srcfire_Kinetis文件夹下 例程文件夹KINETIS512_SC\build\iar下的文件iar.h和文件夹configfiles 到fire_Kinetis\build文件夹下。呵呵,怎么会多了个settings呢?这个是保存IAR自动创建的设置文件,添加分组,方便管理代返回IAR~35三天入门Cortex-M4——Kinetis系 在弹出来 框里填入“app”,这样就添加了一个app分组如此继续添加其他分组:common、cpu、这些组有什么用呢?现在就往里面添加源代码文件,添加后,你就开始明把代码文件放进分fire_Kinetis\src\common文件夹下的*.c文件全部添加到common分组里~36三天入门Cortex-M4——Kinetis系 选中所有的*.c文件。如果你想把头文件也放在工程里,也可以把*.h文件选中~37添加后
三天入门Cortex-M4——Kinetis系 common里的都 提供的通用库再把fire_Kinetis\src\cpu文件夹*.ccrt0.s文件添加到cpu分组里别漏了还有crt0.s哦。crt0.s是启动文件,单片机上电复位后,就会执行里面的再把fire_Kinetis\src\drivers文件夹下的lptmrmcg、uart、wdog子文件*.c文件添加进工程了~38三天入门Cortex-M4——Kinetis系 添加后再在fire_Kinetis\src\projects下创建fire_gpio_demo文件夹,在fire_gpio_demo文件下继续创建main.c、isr.cisr.h文件,往app分组添加main.c、isr.c~39三天入门Cortex-M4——Kinetis系 然后在main.c里写个空的main函数voidvoid{21.在isr.h文件里添加一下代2222/*******************CCOPYRIGHT2011:::*#ifndef#defineISR_H *先取消默认的中断向量元素宏定 #undef*在重新定义到自己编写的中断函 #define ~40*
三天入门Cortex-M4——Kinetis系 #defineVECTOR_00344.#defineVECTOR_00344.45.#define#defineVECTOR_00347.#endif//49/*isr.h结尾中断服务函数。注意:这个头文件只能在c.ceco.eco.c"#include#includevectors.h//关于中断函数的编程和isr.h的作用,可以看:中断函数的编写方最后,在fire_Kinetis\src\platforms文件夹下, 一份k60_tower.h文件出来,命名为k60_fire.h:在fire_Kinetis\src\common\common.h里找到下面的代52.52.~41三天入门Cortex-M4——Kinetis系 *Includetheplatformspecificheader#if#include#elif#include#include#elif#include#error"Novalidplatform注释掉,并插入#includek60_fire.h",*Includetheplatformspecificheader#if#include"k40#elif(defined(TWR#elif#include#error"Novalidplatform//#include#include另外,DEBUG_PRINT在fire_Kinetis\src\common\common.hfire_Kinetis\src\platforms\k60_fire.h里都有定义,应该注释掉k60_fire.h里的定/*/*Globaldefinestouseforallboardsfire_Kinetis\src\common\common.h添加数据类型的typedef2. 3. 4. 6. 7.short8.long~42 三天入门Cortex-M4——Kinetis系 添加GPIO驱动和点亮Kinetis的编程步骤:开启时钟、复用管脚、设置频率、设置功能fire_Kinetis\src\drivers文件夹下建立gpio文件夹,再在gpio文件夹建gpio.cgpio.c添加进工程分组的drivers里,在gpio.c里添加如下gpio的驱动代码1./*****************CCOPYRIGHT2011*文件 *描 **实验平 *库版 *嵌入系 * *作 10.*淘宝 11.* /bbs/bbslist.jsp?bbs12.#include#includeE_PTR,PTD_BASE_PTR,PTE_BASE_PTR};//定义五个指针数组保存GPIOx的地址volatilestructPORT_MemMap21.22 ***26.*参数说明 输出初始状态,0=低电平,1=(对输入无效**修改时间:2012-1- * 注33.voidgpio_init(PORTxportx,u8n,IOcfg,u8{ASSERTn32u)&&data2u~43
三天入门Cortex-M4——Kinetis系 //PORTx_PCRx,每个端口都有个寄存器if(cfg=={GPIO_PDDR_REG(GPIOx[portx| if(data=={GPIOPDORREG(GPIOx[portx|1<<n {GPIOPDORREG(GPIOx[portx&~(1<<n);//}} GPIOPDDRREG(GPIOx[portx])& 56.58. ****参数说明 **修改时间:2012-1- * 注voidgpio_set(PORTxportx,u8n,u8{ASSERTn32u)&&data2uif(data==GPIOPDORREG(GPIOx[portx])| GPIOPDORREG(GPIOx[portx])& 78.在gpio.h里添加变量和函数 #ifndefGPIO_H#defineGPIO_Htypedefenum ~4411.
三天入门Cortex-M4——Kinetis系 typedefenum { #defineHIGH#define externvolatilestructGPIO_MemMapexternvolatilestructPORT_MemMap*PORTX[5];25 gpio_init(PORTxu8n,IO,u8 26.void (PORTx,u8n, u8data); 28.然后main#include#includelptmr.h"//GPIOLED
* 注:野火Kinetis开发板的LED0~3,分别接PTD15~PTD12,低电平点voidgpioinit(PORTD,15,GPO,HIGH);//PTD15,LED0timedelayms(500);
//设置PTD15输出低电平即LED0//设置PTD15输出高电平即LED0~45O(∩_∩)o哈哈,添加好文件了,现在需要配置工程了,不然编~45三天入门Cortex-M4——Kinetis系 IAR工程选项设IAR的工程选项分成两个:Debug模式Release模式,一个是调试模式,一这样,在调试的时候,我们选择Debug;发布产品或者比赛的时候,我们选择Release,切换起来非常方便。 有时会发现他们并没有Debug模式和Release模式,取而代之的是ROM模式、RAM模式、flash模式等等,这些都是可以自行修改的:ProjectEditConfigurations来的界面里选择:new后~46三天入门Cortex-M4——Kinetis系 注意,从Debug模式切换到Release模式,会经常出现各种异常的编译错误或者运行异常,这是因为Release有更严格的检查,详细情况,可看:在IAR的Workspace窗口顶部的下拉菜单中有两个选项.pdf网上共享的工程模版,改名字后的,他们大部分都是基于Debug模式的,就是怕用户编Debug模式的优化效果不如Release模式,如果我们的程序编程是没Debug,就不怕把模式调到Release模式,只不过是在Debug模式下,会隐藏了一些错误而让我们觉得编译通过了。也有时,debug模式里会添加一些延时,所以有时候在Release模式下延时。就用ebug模式来讲解:在工作区程名上:右键——~47三天入门Cortex-M4——Kinetis系 然后就会看到选项框~48三天入门Cortex-M4——Kinetis系 记住,是在工程名里右键,不要在分组名里右键哦,不然弹出 框不是设工程的如果选择了分组里的选项,则显~49三天入门Cortex-M4——Kinetis系 好了,现在言归正传,开始配置工程选项了GeneralOptions—— 设 型~50三天入门Cortex-M4——Kinetis系 野火Kinetis开发板选择的默 为在这里,我们选择~51三天入门Cortex-M4——Kinetis系 GeneralOptions—— ~52三天入门Cortex-M4——Kinetis系 我们编译工 到单片机上的,当然选择C/C++Compiler——Optimizations优化等级在Debug模式里,这里设为不优化,便于调试方便。事实上,在调试的时候,如Release模式里,可以选择最大优化,但在发布前,需要对优化后的效果进行~53三天入门Cortex-M4——Kinetis系 C/C++Compiler——PreprocessorAdditionalincludedirectories:(oneperline)文本编辑框里填在这里在的文件夹,预处理器编译的时候,就会搜索这些文件夹, 表示Definedsymbols:(oneperline)文本编辑框里填入~54
三天入门Cortex-M4——Kinetis系 这里是用来宏定义变量,对整个工程有效,相当于在头文件#define#define#define#define注意:如果在Definedsymbolsoneperline这里填入了DEBUG,那就要注释掉fire_Kinetis\src\common\common.h里面DEBUG的宏定义。OutputConverter——Output这里可以设置编译代码后,把代码转化成其他格式,我们设置转换为hex格~55三天入门Cortex-M4——Kinetis系 Linker—— 器配置Linkerconfigurationfile里勾中Overridedefault,重新打开Linker配置文件,在fire_Kinetis\build\configfiles文件里就有多个Linker配置文件。Linker配置文件,里面设置了Kinetis 是从ROM启动还是从RAM启动,堆栈野火Kinetis开发板选择的默 为K60N512LQV100,512KBFlash128KBSRAMDebug模式,如果你想从RAM启动,则选择128KB_Ram.icf;如果先从ROM启动,可以选择512KB_Pflash.icf或者256KB_Pflash_256KB_Dflash.icf,两者的区别就在于,后512KBFlash分一半出来,作为保存其他数据用,而不是全部用来保存程序代码~56火 三天入门Cortex-M4——Kinetis系 火Release模式,肯定是从ROM启动,即可512KB_Pflash.icf或者256KB_Pflash_256KB_Dflash.icf。而Release模式因为没有调试信息,所以是不能使用jlink等调试器来Debug的。运行,建议还是修改成相对地址: 表示IAR工程所在 表示Linker——Automaticruntimelibrary 库跟预处理时设置头文件所在的文件夹一样,这里是设置库所在的文件~57三天入门Cortex-M4——Kinetis系 如果用到其他已经编译好的库,那就把库所在的文件夹添加进Linker 优化~58三天入门Cortex-M4——Kinetis系 在这里,我就不选择优化Linker 可以生成关于内存分布、编译后生成文件的大小等各种信息的文~59三天入门Cortex-M4——Kinetis系 勾上Geerelermpfieebg模式为例,在工程的文件夹下生成:fe_Kiesbdgpo_demoebgList\fe_gpo_demo.mp文件,打开~60三天入门Cortex-M4——Kinetis系 里面有很多详细的信息,方便我们了解工程编译后内存的使用情况Debugger 在Driver里有多种可供选择的调试方式。野火Kinetis开发板配置了jlink 可供调试,因此可以在这里选择J-Link/J-Trace;如果想软件仿真,那可以选择Simulator。即硬件调试,选择J-Link/J-Trace;软件仿真,选择Simulator~61三天入门Cortex-M4——Kinetis系 如果是在Release模式,那就不要选择软件仿真SimulatorDebugger ,需要勾上Useflashloader,不然 Jlink则不需要也~62三天入门Cortex-M4——Kinetis系 J-Link/J-Trace ~63三天入门Cortex-M4——Kinetis系 J-Link/J-Trace—— Jlink连接设~64火 三天入门Cortex-M4——Kinetis系 火这里可以选择Jlink 方式:JTAG和IAR重要的设置就介绍得差不多了,相信各位会配置了吧?o(∩_∩)o哈哈Warning[Pa082]:undefinedbehavior:theorderofvolatileaccessesisundefinedinthisstatement提示警告的代码为printf(printf("Flashparameterversion原因很简单,FTFL_FCCOB4,FTFL_FCCOB5,FTFL_FCCOB6,FTFL_FCCOB7这些量都定义为volatile,这样调用, 举个例intsquare(volatileint{return*ptr* 编译器将产生类似下面的代码intsquare(volatileint{inta=b=returna*
正确的代码应该是longsquare(volatileint{inta=}}returna*~65这三天入门Cortex-M4——Kinetis系 快速建IAR工程IAR的工程,只需要建立一次之后,保存好设置,下次建立工程,仅仅需要修改在fire_Kinetis\build文件下,找到我们已经建好的gpio_demo工程文件夹,里面把gpo_demo工程文件夹 一份在原来的文件夹下,改名为自己喜欢的工程字如xxx_demo:打开xxx_demo,删掉里面的文件夹,把其他文件改名为自己喜欢的名字,例~66fire_xxx_demo,记得保留后缀。~66三天入门Cortex-M4——Kinetis系 然后在IAR的工作区里添加工程就行(当然,你也可以新建工作区)这样就可以不需要重新设置就建立好新~67IAR使用
三天入门Cortex-M4——Kinetis系 其实在打开IAR软件的时候,已经弹出了IAR使 界面给你IAR入门 用户指
飞思卡尔Kinetis系列的例程~68三天入门Cortex-M4——Kinetis系 提供的都是英文版的,提 英语水平的时候有到了野火就来个中文版的简单介绍吧,当然远不 的介绍那么详细功能介IAR 包含新建保 功能、查找替换功能、跳转功能、编 功能与其他编译器项目,IAR 功能简单,容易上新建保存功能为~69三天入门Cortex-M4——Kinetis系 :新建空白文:打开文:保存文件 :保存所有文件 :剪切
:粘:打:撤:恢查找替换功能为
:查找内容,这里为查找fire文:查找上一:查找下一:查:替跳转功能为:光标跳到指定行列:设置书签:调到下个书签:跳回上个页面:跳到下个页面编译功能为译当前文件编译整个工程
:取消编~70置~70 载并调 : ,直接调 三天入门Cortex-M4——Kinetis系 工作区工程的选定与切换在IAR里,一个工作区可以有多个工程。如
如果用上图下面的选框来切换工程~71三天入门Cortex-M4——Kinetis系 通过 并调设置工程选 方式为:J-Link/J-Jlink有两 方式:JTAG和~72三天入门Cortex-M4——Kinetis系 并调试或者 然后就进入调试界面~73三天入门Cortex-M4——Kinetis系 调试 :复:暂:步过,执行函数,不进入函数:步进,跳进函数:步出,跳出
:下一条语:跳到光标所指向的:全速运:退出调在菜单栏里选择view,就可以看到很多的调试工~74三天入门Cortex-M4——Kinetis系 如果想看变量的值,可以直接光标选中该变量,然后右键——addto调试功能跟其他编译器类用 进入安全保护状态,就需要擦 就才能继续烧写程序,烧写时会提示~75三天入门Cortex-M4——Kinetis系 由于野火在使用Kinetis过程中,还没出现过这问题。为此,特意网上找到一个 在使用JLINK给K60烧写程序时,如果 被锁如何处理?用J-LinkCommander看看能不能找到M4内核,如果能找到,在运行的J-LinkCommander里面,敲入以下命令:UnlockKinetis。然后回车,就能 原文出处 Q群中,野火与其他人交流时,发现锁住的比较多是用CW编译器的,较少是IAR,而野火用的是IAR,当然也有可能是用CW的人比较多吧。另外,也不要用带USB3.0USB接口来Jlink、BDM等器,容易出错,甚至不了。使用软件仿真调要使用仿真调试,首先就要在选项里设置调试器为软件仿真~76三天入门Cortex-M4——Kinetis系 另外还要 锁相环时钟设置和串送,不然仿真的时候,会卡在死循不能继续调试。首先,在common.h里添2. 3. #define#defineprintf.h里修改printf函数,即把下面代码printf(constchar*fmt,{va_listintinfo.dest=DEST_CONSOLE;info.func=&out_char;~77三天入门Cortex-M4——Kinetis系 *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,*Cleanupthevariablelengthargument#endifreturn#endif这样就可以使用仿真了。如果不是仿真 烧写 上,记得注释common.h里的Simulator定义方方式跟jlink一样,直接点击的按钮~78 三天入门Cortex-M4——Kinetis系 IAR界面风格设计在菜单栏——Tools——~79三天入门Cortex-M4——Kinetis系 ~80 三天入门Cortex-M4——Kinetis系 野火 模 实验 实51编程风格的GPIO51编程风格的GPIO实验输入输出测
GPIO实验简单测GPIO实验并行读写测GPIO实验综合测 LED综合测 EXTI综合 串口发送例 串口 ADC综合 DACLED DAC实验万用表测DAC实验ADC
LEDFTM输入捕捉中断测PIT定时中断测试例、输入捕捉、PITLPTPIT定 LPT脉冲计数实DMAGPIO数据实I2C通信实~81 三天入门Cortex-M4——Kinetis系 配置系统频 CMSIS库cos、sin测试实~82 三天入门Cortex-M4——Kinetis系 K60前想快速上手K60单片机吗?野火KinetisK60库,是你最好的选择:简单的调用函数接口,良好的编程风格,让你可以不了解寄存器配置的情况下Kinetis 快,寄存器越来越多,就算你能完全记住51的所有寄存器,但你能记得所有的Kinetis系列的寄存器吗?现在的发展方向是单片机功能越来越强大,寄存器越来越复 野火KineticsK60库,尽可能地把底层的驱动完善,用户可API接口,而不必慢慢对着datasheet来研究。例如UART、FTM、I2C等模块,函数内部会根据当然main函数里中途更改时钟频率,就需要重新初始化,以便重新计算和选野火KineticsK60库,部分功能的实现,提供了两种或两种以上的实现方法,一在编写库的工程中,部分代码参考了其他人例程,在KineticsK60库代码中都有备注。代码会不断更新,不一定更新到上,如果与代码有相互不由于个人能力及时间所限,出错之处,在所难免,欢迎各位错误及提出建议m——野火嵌入式开——野火嵌入式开~83快速开发指南
三天入门Cortex-M4——Kinetis系 快速入门:了解野火Kinetis工程Kinetisconfig
模版工程的app文
~84 三天入门Cortex-M4——Kinetis系 头文件作通用配置同文件,与其他工程共用的通工程头文件,用于针对特定的工程的配置和包含底层动头文件工程的中断配置头文野火整理出来的快速复用管脚设置配置时钟和开发板选打开fire_Kinetis文件夹下IAR工程文件源代码文件 工程模版工作区文 工程例程工作区IARfire_Kinetis\buildIAR工程文件夹。使用过IAR的应该知道IAR里可以建立一~85三天入门Cortex-M4——Kinetis系 工作我们现在就是要把所有的工程文件都放在这个fire_Kinetis\build文件夹里打开另外,fire_Kinetis\build文件夹里还有configfiles文件夹iar.h文件configfiles文件夹里放的就是linker配置文件~86三天入门Cortex-M4——Kinetis系 iar.h是用来专门配置IAR编译的头文件,这里实际上没用到所有的源代码文件都放在这里 Kinetis
如printf函数。野火编写的Kinetis例 这个工作区里,包含了多个工程,用IAR~87三天入门Cortex-M4——Kinetis系 里面有包含多个工程,按照工程的上下顺序学习,就可以容易熟悉野火K60库用户应用文件放在fire_Kinetis\src\app文件夹例程的应用文件放在fire_Kinetis\src\projects\fire_xxx_demo文件夹~88 三天入门Cortex-M4——Kinetis系 野火K60库,本身已经设置了默认的各个模块通道所对应的管脚。其实就fire_Kinetis\src\drivers\fire_drivers_cfg.h文件里进行设脚,不需要修改函数。~89 三天入门Cortex-M4——Kinetis系 中断函数的编写飞思卡尔公司提供的模版里,已经提供有中断函数的参考注主要用到fire_Kinetis\src\cpuvectors.cvectors.h文件,这两个用来定义中断向量表和定义了一个默认的中断服务函数。vectors.c里vectors.h文件里~90三天入门Cortex-M4——Kinetis系 默认的定def_r默认的中断向量服务函数里。有时候,我们的程序运行异常,不妨打开串口助手,看看是不是跑到defa_r服务函数里,如果是,那往往都是代码有bu。为了重新映射中断到指向我们指定的中断向量服务函数里,我们建立isr.hisr.c两个文件来重映射中断向量指针和编写中断向量服务函~91三天入门Cortex-M4——Kinetis系 在isr.h文件里,可以看到野火K60模版里已经在注解上写了参考模版,依葫12.#define11.12.#define11.****#define#ifndefISR_H#define#ifndefISR_H#defineISR_H1*extrenvoid17.17.#endif//19./*Endof"isr.h"具体例子,可参考以下例FTM输入捕捉中断测PIT定时中断测试例、输入捕捉、PIT中断综合~92 三天入门Cortex-M4——Kinetis系 重要变量、函数、宏定义一览表重要的全部变量列名功能说内核时钟内核时钟总线时中断向重要的全局宏定义列名功能说定义Debug模定义输出调试信定义系统频定义软件仿重要的函数列表名功能说串口输设置锁在工程选项那里定
~93三天入门Cortex-M4——Kinetis系 功能说用来定义进入DEBUG如果定义了,则会输出一些调试信息,执行一些防错误的检测,否则取消这些动例如:使用断言,可以帮助我们在调试的时候检查函数传递的参数是否正当我们发布的时候,就需要取消这些检common.h里定定1.1.#define~94功能
三天入门Cortex-M4——Kinetis系 用来定义是否通过串口显示调试信息printf.c里定函数原
voidsysinit{uart_init(FIRE_PORT,}//printf(constchar*fmt,要使用printf,需要定义printf的输出信息,在k60_fire.h里注注 野火嵌入式开这里是定义了输出的端口和波特率,然后在sysinit.c文件里的sysinit函数里调用功能说通过串口发送数据重定printf函数是可以重映射输出的,在printf.c里有printf函数intprintf(constchar*fmt,{PRINTK_INFOinfo.func=&outrvalue=printk(&info,fmt,~959.
三天入门Cortex-M4——Kinetis系 intprintk(PRINTK_INFO*info,constchar*fmt,va_list{for(p=(char*)fmt;(c=*p)!=0;{printk_putc(c,&count,}11.voidout_char(char{}printk里printk_putc里staticvoidprintk_putc(intc,int*count,PRINTK_INFO{7.out_char函数在io.c里定义综上所述,要重映射输出,有两种printf函数里把info.func改为其他函数地址 info.func 修改out_char函数里的输出函数,例如改为LCD输出为了加强程序的健壮性,减少bug,野火为此而在程序里添加了一些安全措施,方便在调试阶段就能检查出错误,消灭bug。断言相信现在还存在着很多连断言是什么都不知道的软件工程师,更别说是初学者了~96 三天入门Cortex-M4——Kinetis系 断言,其实就是一个宏定提供例子是不一样的/*注:野提供例子是不一样的////如果断言条件不成立,进入了错误状态,就会打印错误信息和用LED来显示////用流水灯来指示进入错误状EG例如传递给函数的变量取值范围是否正确。例如在AC模块里,可以看到很多函数的开头都有这样一个语句:////使用断言检 _CHn是否正如果传递错误的参量,就会出错,在串口里可以看到错误的位bu。~97typedef{ 三天入门Cortex-M4——Kinettypedef{ 关于断言的使用, 的《高质量C编程指南》里提取了一段断言的使用则程序一般分为Debug版本和Release版本,Debug版本用于内部调试版 给用户使用断言assertDebug版本起作用的宏,它用于检查“不应该”发生的情况【规则6-5-1】使用断言捕捉不应该发生的情况。不要情况与错误【规6-5-2】在函数的处,使用断言检查参数的有效性()【建议651】在编写函数时,要进行反复的考查,并且自问:“我打算做哪些【建议652】一般教科书都鼓励程序员们进行防错设计,但要记住这种编程风要使用断言进行。枚举序员可以及时发现错误和修正错误。灭b。ADC.h文件如果打开其他如果打开其他网络上共享的工程会发现他们往往都是使用宏定义,但宏~98三天入门Cortex-M4——Kinetis系 师来说,对程序的安全性进行检测,那是一1.1.void ,ADC_Ch举个例子告告~99GPIO模块
三天入门Cortex-M4——Kinetis系 快速入门:GPIO库使用方形参变 名及其作形参变作取端口PORTA,PORTB,PORTC,PORTD,n引脚输入输出配GPI,GPO,GPI_DOWN,GPI_UP,GPI_PF,GPI_DOWN_PF,GPI_UP_PF, GPO_HDS_SSR。数常用枚举列名功能说端管脚输入输出配函数列函数名函数功初始化设置引脚状反转引脚状获取IO宏定义列宏定功能说设置引脚输出电平(这里的x要替换成A~E,n要替换为0~31的数,表示对应的例如引脚输入电平(这里的x要替换A~E,n要替换为0~31的数,表示对~100引脚号例如设置引脚输入输出方(x例如设置8位引脚输出电平(这里的x要替换A~E,n要替换0~3的数,表示对应的8位引脚号)例如PTA_BYTE0_OUT表示PTA7~PTA0PTA_BYTE1_OUT表示PTA15~PTA8PTA_BYTE2_OUT表示PTA23~PTA_BYTE3_OUT表示PTA31~设置8位引脚输入电平(这里的x要替换A~E,n要替换0~3的数8位引脚号设置8位引脚输入输出方向(这里的x替换成A~E,n要替换为0~3的数,表示对应的8位引脚号)应的16位引脚号)例如PTA_WORD0_OUTPTA15~PTA_WORD1_OUT表示PTA31~设置16位引脚输入电平(这里的x要替换成A~E,n要替换为0~1的数,表示应的16位引脚号设置16位引脚输入输出方向(这里的要替A~E,n要替换为0~1的数,示对16位引脚号设置引脚状翻转引脚状获取IO1位数1位数2位数2位数4位数三天入门三天入门Cortex-M4——is系 火~1014位数8位数8位数164位数8位数8位数16位数16位数枚举定
enum{枚举作用来定义端枚举定
typedefenumGPIGPIDOWNPF=GPIDOWN|GPIPF|GPI_PF16.GPO_HDS_SSR=GPO_HDS|枚举作用来定义GPIO管脚输入输出的配置~102三天入门Cortex-M4——Kinetis系 常用的就前面五种,例如输入滤波,可用着按键上,可以设置为上拉下拉外部电阻函数详解函数原
1.1. gpio_init(PORTxu8nGPIO_CFG,u8 功能说初始化gpio,设置端口的输入输出方向,输出数据。初始化后,才能对IO口进 调用例函数原
4.4. gpio_set(PORTx,u8n,u8 功能说设置IO口电平,需要先初始化GPIO端口为输出方向5. //PTA275. //PTA27=函数原
gpiogpio//PTA27//PTA266.6. gpio_turn(PORTx,u8 功能说翻转IO口电传递参参考形参变 名及其作用~103函数无调用
三天入门Cortex-M4——Kinetis系 7.7. 函数原
8. (PORTx,u8 功能说引脚状传递参参考形参变 名及其作用函数返返回1bit的端口电平状态调用例9.9. //PTA27=宏定义功能说
设置电平输出。这个是通用显示名字而已,实际上这里的x要替换成A~E的,n要替换为0~31的数,表示对应的引脚号,例如调用例子举PTA0PTA0 PTB16_OUT1;//PTB16PTE28_OUT0;//PTE28~104 三天入门Cortex-M4——Kinetis系 功能说电平输入。这个是通用显示名字而已,实际上这里的x要替换成A~E的端n要替换为0~31的数,表示对应的引脚号,例如PTA0_IN调用例子举 data=PTB16_IN;data=PTE28_IN;功能说
设置引脚输入输出方向。这个是通用显示名字而已,实际上这里的x要替换A~E,n要替换为0~31的数,表示对应的引脚号。例如调用例子举功能说
设置8位引脚输出电平(这里的x要替换成A~E,n要替换为0~3的数,表示对应的8位引脚号)调用例子举PTAPTABYTE0OUT=0x12//表示PTA7~ 8位输出PTA_BYTE1_OUT=0x12//表示PTA15~ 8位输出PTABYTE2OUT=0x12//表示PTA23~PTA168位输出PTA_BYTE3_OUT=0x12//表示PTA31~PTA248位输出功能说
设置8位引脚输入电平(这里的x要替换成A~E,n要替换为0~3的数,表示对应的8位引脚号)~105 三天入门Cortex-M4三天入门Cortex-M4——Kinetis系 火chardata=PTA_BYTE0_IN//表示PTA7~ 8位数据输入到data变data=PTA_BYTE1_IN//表示PTA15~ 8位数据输入到data变dataPTA_BYTE2_IN//表示PTA23~PTA168位数据输入到data变dataPTA_BYTE3_IN//表示PTA31~PTA248位数据输入到data变功能说
设置8位引脚输入输出方向(这里的x要替换成A~E,n要替换为0~3的数,表示对应的8位引脚号)DDRA_BYTE0=0xFF;//表示DDRA_BYTE0=0xFF;//表示PTA7~ DDRA_BYTE1=0xFF;//表示PTA15~ DDRA_BYTE2=0xFF;//表示PTA23~PTA168DDRA_BYTE3=0xFF;//表示PTA31~PTA248功能说
设置16位引脚输出电平(这里的x要替换成A~E,n要替换为0~1的数,表示对应的16位引脚号)调用例子举1.2.功能说
设置16位引脚输入电平(这里的x要替换成A~E,n要替换为0~1的数,表示对应的16位引脚号)调用例子举1.u16data=PTA15~输入数据到data2.u16data=PTA31~输入数据到data~106 三天入门Cor
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024版个人车辆长途运输及车辆检测、维修、保养、租赁、保险、改装与租赁服务合同3篇
- 2024年分项工程专业劳务外包合同2篇
- 2024年度租赁合同(影视器材及道具)
- 2024年度航空公司票务系统升级与维护合同3篇
- 2024年团队出境旅游全程导游陪同服务合同3篇
- 2024年标准电源设备买卖合同模板版B版
- 2024年度危险品运输道路通行权购买合同3篇
- 2024年度房地产股权并购与整合解决方案合同3篇
- 2024年度网络科技有限公司服务合同2篇
- 2024版太阳能灯箱广告安装与维护服务合同3篇
- 《电镀员工培训教材》课件
- 酒精所致精神障碍个案查房
- 部队密码安全教育课件
- 幼儿园教职工交通安全教育培训
- 监控维修安装培训课件
- 2024 年政府采购评审专家考试真题(附含答案)
- 2024年中国铁路南宁局集团有限公司招聘笔试参考题库附带答案详解
- 加油站防雷与防静电安全管理手册
- TBT2927-2015 高分子材料钢轨绝缘件
- 商务ktv项目计划书
- 2020全国行政区划-省市县列表
评论
0/150
提交评论