下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2012三天入门 Cortex-M4Kinetis 系列野火 Kinetics 开发板最适合初学者入门 Kinetis 的freescale作者:野火2012-3-16火前言随着技术的发展,单片机型号越来越繁多,入门的难度也逐渐加多,学习周期自然不断延长。为了让初学者快速入门,减少学习时间,尤其是为了那些参加智能车比赛而没时间学习深入研究 Kinetis 单片机朋友,力求大大减少初学者的学习时间。特意写了 Kinetis 开发板的。野火 Kinetis 开发,主要有 IAR 的使用、Kinetis 启动流程讲解、野火K60 库的调用 三个部分组成。不再详细讲解寄存器,而且直接调用我们的函数库。
2、野火 K60 函数库,函数会自动计算频率,设置分频,直接调用,减少的后顾之忧,可以加快的开发速度。目前,单片机型号如此之多,而产品的开发所允许给的时间越来越少,完全没有必要深入研究寄存器设置,就算你能把寄存器背得滚瓜烂熟,过段时间不去接触,还是没法记住的。现在的单片机开发,工程师往往都是利用的固件进行开发,而不再是靠自己重新建立自己的函数库进行开发。例如ST 公司推出的ST 库,让你可以完全不需要考虑底层开发而直接开发自己的产品。飞思公司,在这方便确实让人感到失望,要建立自己的野火Kinetis 库的原因。这也是野火野火 K60 库的函数接口,尽量追求简洁明了、通俗易懂,力求初学者见其名就会用
3、。目前提供了 26 个入门实验:野火 Kinetis板实验例程 ,包含了目前智能车比赛最常用的几个模块。想快速上手 K60 单片机吗?野火 Kinetis K60 库,是你最好的选择!是:三天入门 Kinetis!的 1 火喊出这样的并不是吹的,已经有两位大三参加智能车的朋友(同一个队)与 k60 库三天时间内就能把 xs128 上的头 0v7725 驱动程序和在使用的舵机控制程序移植到 Kinetis 上跑起来;一位大二的师弟,不到一天的时间就从入门头 ov7725 和液晶 LCD 的移植你会是下一位吗?到搞定敢拼,一切皆有可能!Nothing is imsible !只要由于个人能力及时间
4、所限,出错之处,在所难免,欢迎各位m错误及提出建议:2012-3-27们Technical support 2 火目录三天入门 Cortex-M4Kinetis 系列1前言1目录3Kinetis 的启动分析(初学者大概浏览一下即可)6初步入门:初始化函数启动执行顺序6逐步提高:ROM、RAM 启动工作原理、ICF 文件讲解8IAR 的使用18安装IAR18建立IAR 工程30创建工程文件30添加GPIO 驱动和点亮LED43IAR 工程选项设置46快速建 IAR 工程66IAR 使用68功能介绍69工作区工程的选定与切换71通过 jlink并调试72使用仿真调试76IAR 界面风格设计79野火
5、 Kinetis板实验例程列表81野火 K60 库的使用83前言83快速开发指南84快速入门:了解野火 Kinetis 工程84中断函数的编写方法90重要变量、函数、宏定义一览表93安全检查96GPIO 模块100快速入门:GPIO 库使用方法100GPIO 测试例程109LED 模块114快速入门:LED 库使用方法114LED 综合测试例程117 3 火EXTI 外部GPIO 中断例程119快速入门:EXTI 库使用方法119EXTI 综合测试例程120UART 模块123快速入门:UART 库使用方法123UART 综合测试例程128ADC 模块134快速入门:ADC 库使用方法134A
6、DC 综合测试例程138DAC 模块140快速入门:DAC 库使用方法142DAC 综合测试例程144FTM模块149快速入门:库使用方法149综合测试例程152FTM 输入捕捉 模块154快速入门:FTM 输入捕捉库使用方法154FTM 输入捕捉中断测试156PIT 定时中断模块158快速入门:PIT 定时中断库使用方法158PIT 定时中断测试例程160、输入捕捉、PIT 中断综合测试161I2C 模块164快速入门:I2C 通信库使用方法164I2C 通信实验测试165lptmr 低功耗定时器模块168快速入门:lptmr 低功耗定时器库使用方法168lptmr 低功耗定时器测试例程17
7、0DMA 模块175快速入门:DMA 传输端口数据175DMA 测试例程180MCG 模块超频183快速入门:MCG 库使用方法183快速入门:配置频率188uC/OS192DSP 数字信号处理单元193CMSIS 的介绍及其帮助文档的查找方法193DSP 常用函数列表197 4 火DSP 测试例程198野火 Kinetis 开发板问题集200资料在哪里可以到?(IAR、Jlink 驱动)200jlink 供电到开发板上200关于 Kinetis 时钟200IAR 报错找不到头文件201BDM问题202prf 使用方法203Kinetis 单片机的 IO 口支不支持 5V 耐压?203Kine
8、tis 最多可以输出多少个频率不同的脉冲波?204kinetis 捕捉编脉冲计数方法204ADC 引脚中带 a、b 表示的意思205不带有浮点单元能进行浮点运算吗?205JlinkKinetis205 5 火Kinetis 的启动分析(初学者大概浏览一下即可)初步入门:初始化函数启动执行顺序上电复位Reset_Handler中断向量表start中断向量表在 vectors.c 里定 义,在vectors.h 文件里 前两在 start.c 文件里定义,精简后的代码:上电复位后第一个运行的函数,在crt0.s 里用汇编实现。1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.
9、16.17.18.19.20.21.22.23.SECTION .noinit : CODE个元素分别到EXPORT Reset_Handler Reset_Handler ;初始化寄存器_BOOT_STACK_ADDRESS 和(自带例程MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV CPSIEr0,#0 r1,#0 r2,#0 r3,#0 r4,#0 r5,#0 r6,#0 r7,#0 r8,#0 r9,#0 r10,#0 r11,#0 r12,#0i ; 关中断为_startup),第一个为起始 SP 栈指针、第二个为复位中断服务函
10、数。上电复位,系统会查询中断向量表,把第一个元素的值赋给 SP 寄存器,把第二个值赋给 PC寄存器,即上电后马上运行 Reset_Hand ler 函数。就是初始化系统:关闭看门狗、数据到内存、配置时钟,然后进入 main 函数import startBLstart;调用 C 语言 编写的 start done函数BENDdonecommon_startupsysinitmain中断向量表、初始化数据初始化时钟和初始化串口,精简版代码:这里就是的执行段、以_ramfunc的子函数函数,在这里编void sysinit (void)到 RAM 区(对 flash 操作的函数必须这样)写自己的应用
11、文件。core_clk_mhz =pll_init(MCLK_MHZ);时钟,用于调试trace_clk_init(); /使能fb_clk_init();/FlexBus 时钟初始化uart_init(FIRE_PORT, FIRE_BAUD);/初始化 prf 函数所用到的串口pll_initpll_init 这个函数是用于锁相环超频的,在 mcg.c 里定义。MCG 模块一共有 9 中工作模式,按功耗高低顺序:PEE、FEE、FEI、PBE、FBE、FBI、BLPE、BLP I、stop。高频率意味着高功率,为了获取更高的频率,这里 pll_init 就是把模式进入 PEE。 6 Res
12、et_Hand lervoid start(void)wdog_disable();/关闭看门狗commstartup();/数据段、中断向量表到 ramsysinit(); /时钟初始化main();/* main 函数 */while(1); /避免停止运行火初始化大致思路初始化的整体思路简单初始化上电wdog_disable关闭看门狗如果ROM启动,则复制中断向量表. vec到RAM启动过程分析步骤修改中断向量表地址为RAM里的地址初始化数据段.data到RAMcommon_startup清寄存器Reset_Handler清除RAM中初始化为0的数据段.bssstart把以 ramfun
13、c子函数 .textrw到RAM区的初始化锁相环pll_initsysinit初始化prf函数用到的串口uart_initmain用户任务注:common_startup 函数并没有常量数据 .rodata 、代码.text 。如果是RAM 启动,代码会直接编译进去 RAM,掉电就会丢失数据。如果是 ROM 启动,就会中断向量表到 RAM,设置中断向量表地址为 RAM 的地址,以加快中断响应速度。 7 火逐步提高:ROM、RAM 启动工作原理、ICF 文件讲解对于初学者而言,对单片机的内存分配往往最让人头疼,很多人学了单片机几年的内存使用情况是如何分配的。要了解 ROM、RAM 启动,首先都不
14、知道单片机器 Linker 如何分配内存有一定的了解。需要对通常,对于栈生长方向向下的单片机,其内存一般模型是:最低内存地址中断向量表段 .vec函数代码段 .text未初始化变量段 .bss 常量段 .rodata已初始化全局变量和静态变量段 .data动态分配数据程序运行中由程序员调用 malloc 等函数来申请。局部变量在函数定义的非静态的变量。最高地址 1. a = 0;/全局初始化区,.data 段ic b=20;/全局初始化区,.data 段 2. s3.char *p1;/全局未初始化区 .bss 段/.rodata 段 4. const A = 10;注意区别! 5. vola
15、tile const B=10;/.data 段6.7.main()/代码区 .text8.9.10.b; char *p2;/栈/栈/全局(静态)初始化区 .data 段sicc= 0;11.12.13.14.15.16.17.char char p1 =p2 =s*p3=123456;123456;/栈/1234560 在常量区,p3 在栈上。注意区别!(char*) malloc(10); (char*) malloc(20);/分配得来的 10 和 20 个字节的区域就在堆区/1234560 在常量区/编译器可能会将它与 p3 所指向的123456优化成一个地方strcpy(p1, 1
16、23456);IAR 里可以设置 Linker 合并相同的段,即优化成一个地方。看后面 IAR 设置工程选项中 Linker 的设置注:此表格及代码内容参考网上资料 8 中断向量表代码区数据区堆栈命令行参数火参考原文出处:那编译到时候,编译器是如何为这些变量数据分配地址的呢?器 Linker 在发挥它的作用,它会根据配置文件,来为这些变量其实,这就是数据分配合适的地址,这样就可以不需要考虑这些内存分布就能写出可运行的代码。编译器对代码进行编译,一般分为四个步骤:替换和展开宏删掉注释编译和 编译成汇汇编成机器码生成可执行文件预编译汇编优化编语言器 Linker 的配置文件都是由通常情况下,提供,
17、一般情况下,不需要更改这些。但出于学习的目的,非常有必要去研究一下这些配置文件。在 fire_Kinetisbuildconfig files 文件夹下,你可以看到有很多的 linker 配置文件:这里的文件是用来分配数据在内存中的位置,配置ROM、RAM 启动,linker 根据 这些文件来为 Kinetics 分配 4G 的虚拟寻址空间地址。如果把代码部分编译进去 RAM,那就是 RAM 启动;如果把代码数据编译进去 ROM,那就是 ROM 启动(flash 启动)。不同的型号,flash 内存大小不一样,所以配置 Linker 文件也会不一样,以 K60为例: 9 火野火 Kinetis
18、板自带为MK60DN512,512KB 的 Program flash 大小,128KB的 SRAM 大小,没有 FlexNVM 和FlexRAM。K60 的 4G 虚拟寻址空间就是按照内存空间的图来进行配置: 10 火如果要RAM 启动,要把代码编译进SRAM_L ,定义中断向量表的位置。可以打开 fire_RAM_K60N512.icf 这个文件(用记事本打开就行),这个配置文件是参考 128KB_Ram.icf 来重新修改和添加了注释。的配置文件写得真的思路太乱了,如果你仅仅用 ICF 编辑来配置的配置文件,是非常容易出错的!你必须要用 ICF 配置好后,还要打开配置文件来修改。野火已经
19、对配置文件进行修改,在里面添加了很多注释:中断向量表地址。Flash 和 SRAM/*#ICF# Section handled by ICF editor, dont touch! */*-Editor annoion file-*/* IcfEditorFi/*-Spels-*/$TOOLKIT_DIR$ configideIcfEditorcortex_v1_0.definembol ICFEDIT_vec_start = 0 x10000;/RAM 启动要设置为 RAM 起始地址,ROM 启动也要设为 ROM 的起始地址/*-Memory Regions-*/define define
20、 definesymbol symbol symbol ICFEDIT_region_ROM_start_ ICFEDIT_region_ROM_end ICFEDIT_region_RAM_start_=0 x0;0 x00040000;/ROM 地址0 x10000;/RAM 地址definesymbol ICFEDIT_region_RAM_end =0 x20000000;/*-Sizes-*/define symbol define symbol ICFEDIT_size_cstack_ = 0 x1000;/堆大小/栈大小 ICFEDIT_size_heap = 0 x800;/*
21、 End of ICF editor section. #ICF#*/Kinetis 的 SRAM 是分成两块的。/* 上边是由 ICF 编辑,下面是由手动配置 */这里是设置第二块的地址范围define definesymbol region_RAM2_start = 0 x20000000;/SRAM是分成两块的,RAM2 即 SRAM_U , RAM 为 SRAM_Lsymbol region_RAM2_end = 0 x20000000 + _ICFEDIT_region_RAM_end_- ICFEDIT_region_RAM_start ;中断向量表地址defineexported
22、symbol VECTOR_TABLE = _ICFEDIT_vec_start ;/代码编译进 ROM ,则 0 x00000000 ;RAM,则 ICFEDIT_region_RAM_start_defineexportedsymbolVECTOR RAM =ICFEDIT region RAM start;/前面的 RAM 留给 RAM User Vector Table/如果是 ROM 启动,则 common_startup 函数会把 VECTOR_TABLE 的数据到 _VECTOR_RAM 可以看出栈的生长方向为向下defineexportedsymbol BOOT_STACK_A
23、DDRESS = region_RAM2_end - 8;/0 x20008;启动栈地址,中断向量表的第一个元素就是指向这里这里就是代码的编译地址。加上0 x410,是前面的留给中断向量表/* 决定代码编译的地址 */defineexported symbolcode start=ICFEDITvec start+ 0 x410;/代码编译进 ROM ,则 ICFEDIT_region_ROM_start + 0 x410 ,/RAM,则 _ICFEDIT_region_RAM_start + 0 x410 ,+0 x410 ,是前面的留给 Vector Table设置 ROM 和 RAM 的
24、可用definememorymem with size = 4G;/4G 的虚拟寻址空间内存地址范围defineregionROM region= mem:fromtoICFEDIT region ROM start ICFEDIT_region_ROM_end ; defineregionRAM_region= mem:fromto| mem:from ICFEDIT_region_RAM_start ICFEDIT_region_RAM_end region_RAM2_starttoregion_RAM2_end ; 11 启动的中断向量表地址是不一样的火define block CSTA
25、CKwilignment =8, size=_ICFEDIT_size_cstack ; /堆,8 字节对齐define block HEAPwilignment =8, size=_ICFEDIT_size_heap_; /栈,8 字节对齐/手动初始化,在 common_startup 函数 里完成设置堆栈的大小initialize initializemanually manuallyreadwrite ; section .data;/未初始化数据 .bss已初始化数据initializemanuallysection .textrw;/ ramfunc的子函数取消自动初始化,改为由co
26、mmon_startup 函数来初始化do not initialize section .noinit ;/复位中断向量服务函数define block CodeRelocate section .textrw_init ; define block CodeRelocateRam section .textrw ;设置中断向量表位置放在/CodeRelocateRam 把代码到 RAM 中(对 flash 操作的函数必须这样)_ICFEDIT_vec_start_地址上place at addressmem: ICFEDIT_vec_start readonly section .vec;
27、中设置 #pragma location = .vec ,告诉编译器,这个 中断向量表,编译进去 ./vectors.cvec设置 .noinit 段放在代码开头,即复位中断服务函数,把复位函数编译在代码开头placeat addressmem: code_start readonly section .noinit ;/在 crt0.s 中设置了复位中断函数为 SECTION .noinit : CODE ,即把代码编译进去 .noinitRAM把只读数据、代码都编译进去 RAMplacein RAM_regionreadonly, block CodeRelocate ;/把代码编译进去
28、RAM (调试用,掉电丢失) ,非调试,则设为 ROM_regionplacein RAM_regionreadwrite, block CodeRelocateRam, block CSTACK, block HEAP ;上电复位后,把 0 x00000000 内容给SP,把 0 x00000004 内容给PC。跳转到 RAM 执行代码。以后发生中断,用 RAM 的中断向量表Linker 根据 icf 配置文件来进行分配内存地址:0 x0000-00000 x0000-0000ROM Bootloader 中断向量表Flash 配置寄存器中断向量表Flash512KB0 x0000-0400
29、0 x0000-0410代码区0 x1-00000 x0007-FRAM Bootloader 中断向量表数据区RAM 配置寄存器堆Code0 x1-0000SRAM栈128k堆0 x2001-0000栈0 x2000-8命令行参数配置0 x2001-0000 12 火如果是ROM 启动(flash 启动):中断向量表地址。Flash 和 SRAM启动的中断向量表地址是不一样的1.2./*#ICF# Section handled by ICF editor, dont touch! */*-Editor annoion file-*/3./* IcfEditorFi$TOOLKIT_DIR$
30、 configideIcfEditorcortex_0.xml */4./*-Spels-*/5.definembol ICFEDIT_vec_start = 0 x00000000;设置 P-flash 和 D-flash6./*-Memory Regions-*/的分区大小 7.8.9.10.define definesymbol symbol ICFEDIT_region_ROM_start_ ICFEDIT_region_ROM_end /0 x00040000:P-flashk ICFEDIT_region_RAM_start_= 0 x0;= 0 x00040000;256k D-
31、flash= 0 x10000; 256k0 x00080000:P-flashk 512kdefinesymbol/前面0 x410 RAM 留给 RAM User Vector Table 。= 0 x20000000;11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.definesymbolICFEDIT region RAM end/*-Sizes-*/define symbol define symbol ICFEDIT_size_cstack_ = 0 x2000; ICFEDIT_size_heap = 0 x2000;设
32、置堆栈大小/* End of ICF editor section. #ICF#*/* 上边是由 ICF 编辑,下面是由手动配置 */definesymbol region_RAM2_start = 0 x20000000;/SRAM 是分成两块的,RAM2 即 SRAM_U,RAM 为 SRAM_L 0 x20000000 + ICFEDIT_region_RAM_end - ICFEDIT_region_RAM_start ;definesymbol region_RAM2_end =defineexportedsymbol VECTOR_TABLE = _ICFEDIT_/代码编译进 R
33、OM ,则 0 x000000vec_start ;;RAM,则 ICFEDIT_region_RAM_start 29.30.defineexportedsymbol VECTOR_RAM = ICFEDIT_region_RAM_start_;前面的 RAM 留给 RAM User Vector Table,即这里的设置。所以减 0 x41031.mon_startup 函数就是把 VECTOR_TABLE 的数据到 VECTOR_RAM32.33.34.defineexportedsymbol BOOT_STACK_ADDRESS = region_RAM2_end - 8;/0 x20
34、008; 启动栈地址35.36.37./* 决定代码编译的地址 */defineexportedsymbol code_start_=_ICFEDIT_vec_start + 0 x410;38.39.40.41.42.43.44.45.46.47.48.49.50./+0 x410 ,是前面的留给 Vector Table/4G 的虚拟寻址空间definememory mem withsize = 4G;defineregion ROM_region=mem:from _ICFEDIT_region_ROM_start to ICFEDIT_region_ROM_end ;definereg
35、ion RAM_region=mem:from| mem:from_ICFEDIT_region_RAM_start + 0 x410 to ICFEDIT_region_RAM_end _region_RAM2_start to _region_RAM2_end ;defineblock CSTACKwilignment =8, size=_ICFEDIT_size_cstack ;/堆51.defineblock HEAPwilignment =8, size=_ICFEDIT_size_heap_;/栈52.53.54.55./手动初始化,在 common_startup 函数 里完成
36、initialize manually readwrite ; initialize manually section .data;堆栈大小/ 未初始化数据 .bss/ 已初始化数据 56. initialize manually section .textrw ;/ ramfunc的子函数57.58.59.60.61.do not initialize section .noinit ;/ 复位中断向量服务函数define block CodeRelocate section .textrw init ; define block CodeRelocateRam section .textr
37、w ; 62./ 把 CodeRelocate 代码到 RAM 中的 CodeRelocateRam (对 flash 操作的函数必须这样)63.64.place at address mem: ICFEDIT_vec_start readonly section .vec ;65./vectors.c 中设置#pragma location = .vec,告诉编译器,这个是中断向量表,编译进去 .vec66.67.place at address mem: code_start readonly section .noinit ; 13 火/在 crt0.s 中设置了 Reset_Handl
38、er 为 SECTION .noinit : CODE/即把 Reset_Handler 编译进 code_start 68.69.70.71.72.73.74.placein ROM_regionreadonly, block CodeRelocate ;/把代码编译进去 ROM (调试用),非调试,则设为 ROM_regionROM 启动,就要把只读数据和代码编译进 ROMplacein RAM regionreadwrite, block CodeRelocateRam,75.block CSTACK, block HEAP ;Linker 根据 icf 配置文件来进行分配内存地址:co
39、mmon_startup 函数 把中断向量表、已到 RAM,以_ramfunc初始化数据的子函数,以加快速度。以后发生中断就会用 RAM 的中断向量表0 x0000-00000 x0000-0000ROM Bootloader 中断向量表Flash512KB中断向量表0 x0000-04000 x0000-0410Flash 配置寄存器代码区Code0 x0007-F数据区 .rodata数据区0 x1-0000RAM Bootloader 中断向量表堆0 x1-0410RAM 配置寄存器Code RAM0 x1-0000SRAM数据区栈.bss和 .data128k堆0 x2001-0000
40、栈命令行参数0 x2000-8配置0 x2001-0000前面的内容,不知道大家是否都看懂呢?熟悉单片机的内存分配,是每一个电子工程师所必备的。如果对单片机的内存分配都不了解,那就算会写单片机的驱动程序,也难以保证程序的质量。那在 IAR 里,怎么知道编译生成的文件的内存图?在工程选项里,设置生成 map file 就行: 14 火设置好,编译后,在 fire_Kinetisbuild_demo模式List 文件夹下就会有 .map 文件。这里的内容,就是 ICF 配置文件底部的宏替换内容中断向量表复位中断服务函数程序代码 15 火ICF 编辑器呢?那呵呵,在工程名里右键OptionsLink
41、er这里就是设置 Linker 配置文件的 ICF 编辑器,可以在里面设置相应的数据中断向量表地址 16 火ROM、RAN 地址堆栈大小 17 火IAR 的使用安装 IAR野火的是直接在野火提供的 K60 库模版上添加自己的代码,而不是自己重建工程,但学会自己建立工程是必须的,这里给大家详解建立 IAR 工程的步骤。一、安装的 IAR for ARM 为 v6.30,支持的 Kinetics 系列目前,因此大家更新,避免因为版本太低而出现不兼容,甚至出现异常错误的情况。地址:/folder/fautzfbt 里的 CD-EWARM-6301-3142.7z安装 IAR 详细过程后解压文件,打开
42、目录,运行安装文件:二、1. 18 火2. 选择安装 IAR Embedded Workbench 19 火3.next4.选择同意,然后点击next 20 火5.需要填入 key6.打开目录,找到机文件,并运行它。按下任意键,会自动打开 license.txt 文件,并提示:搜索EWARM ,找到所在行的 key。 21 火key 上一行的 Installserial 即为这里所需要的:7. Next 后,填入 key 所在行的 License Key: 22 火包括#号哦!8.Next 后,根据自己情况选择安装路径9.设置开始菜单文件夹,还是继续 Next 23 火经过漫长的等待10. 噔
43、噔噔噔华丽丽地按个 finish 结束安装了 24 火11. 运行 IAR,语言选择,按 OK 结束12. IAR 的编程界面: 25 火相对于 Keil For ARM、CodeWarrior 而言,IARfor ARM 的编程界面是最简单的,编译效率高,在系统的调试方面提供了可供调试的插件: 26 火三、安装仿真器驱动1.又换会原来的安装导航界面:选择 Install drivers2.野火 Kinetics 开发板,选择了用 jlink 作为仿真调试器,因此这里选择 jlink。运行安装文件 27 火运行后,会自动安装驱动,不会有其他提示。可以选择用 segger 公司的 j-link:
44、另外,为了可以使用擦除等功能, 28 火地址:Setup JLinkARM V436k.zip安装时,一路狂 Next 就行安装后,在开始菜单里找到 J-Flash ARM,运行它即可 29 火建立 IAR 工程创建工程文件一、准备材料在建立 IAR 工程前,需要写好的库。地址:KINETIS512 SC.zip的 Kinetis 例程,提取里面的配置文件和解压后,打开目录,会看到两个文件夹二、建立 IAR 工程过程以 GPIO 为例子,点亮 LED,一步步操作,讲解建立工程的详细过在这里,程。1. 建立工作空间FileNewWorkspace 30 火2. 建立工程里选择 ProjectCr
45、eate New Project在 31 火接着在弹出来的框里选择空的工程,点击确定 32 火接着弹出选择保存工程的框。由于还没建保存工程的文件夹,就直框里新建:右键新建文件夹重命名为:fire_Kinetis接在打开新建的 fire_Kinetis 文件夹,再建一个build 文件夹,build 文件里再建一个gpio_demo 文件夹,把工程文件保存在gpio_demo 文件夹里面,工程文件名为 :fire_gpio_demo ,文件结构如下图: 33 火保存后,进入 IAR 界面,别忘了工作区还没有保存哦。在菜单栏里找到图标点击保存全部文件,把 工作区文件保存在 fire_Kinetis
46、 文件夹下,名字为 fire_Kinetis,: 34 火这样,一个空的 IAR 工程骨架就建立完毕需要往里面添加自己的模块。3. 往工程添加 Kinetis自带函数库例程文件夹下的文件夹 src 到 fire_Kinetis 文件夹下 :例程文件夹 KINETIS512_SCbuildiar 下的文件 iar.h到 fire_Kinetisbuild 文件夹下。另外,还需要把件夹 config files和 文呵呵,怎么会多了个 settings 呢?这个是保存工作区后 IAR 自动创建的设置文件,不需要管他。4. 添加分组,方便管理代码返回 IAR 界面,在工程里创建分组: 35 火框里填
47、入 “app” ,这样就添加了一个 app 分组:在弹出来的如此继续添加其他分组:common、cpu、drivers这些组用呢?现在就往里面添加源代码文件,添加后,你就开始明白的。5. 把代码文件放进分组把 fire_Kinetissrccommon 文件夹 下的 *.c 文件全部添加到 common 分组里: 36 火选中所有的 *.c 文件。如果你想把头文件也放在工程里,也可以把 *.h 文件选中。 37 火添加后:common 里的都是提供的通用库。再把 fire_Kinetissru 文件夹 下的 *.c和 crt0.s 文件添加到 cpu 分组里:别漏了还有 crt0.s 哦。cr
48、t0.s 是启动文件,单片机上电复位后,就会执行里面的汇编代码。再把 fire_Kinetissrcdrivers 文件夹下的 lptmr、 mcg、uar*.c 文件添加进工程了:og 子文件 里 38 火添加后:再在 fire_Kinetis srcprojects 下创建 fire_gpio_demo 文件夹,在fire_gpio_demo 文件下继续创建main.c 、isr.c 和 isr.h 文件,往app 分组添加main.c 、isr.c 39 火然后在main.c 里写个空的 main 函数:在 isr.h 文件里添加一下代码:22. /* (C) COPYRIGHT 201
49、1 * 23. * 文件名:isr.h* 描述*:重新宏定义中断号,重中断向量表里的中断函数地址,24.25.使其指向所定义的中断服务函数。中断服务函数警告:只能在vectors.c被包含,而且必须在vectors.h包含的后面!26.27.*:野火 kinetis 开发板 28. * 实验库版本 嵌入系统:29.30.31.*32.33.*作者 淘宝店:34.*技术支持:htt/_list.jsp?_id=100835.36.37.38.39.*/#ifndef ISR_H #define ISR_H 1/*重新定义中断向量表 40. * 先取消默认的中断向量元素宏定义#undef VECT
50、OR_ 41. * 在重新定义到自己编写的中断函数#define VECTOR_IRQHandler 40 18. void main()19. 20.21. 火* 例如:42.43.*#undef VECTOR_003先取消到中断向量表里的中断函数地址宏定义重新定义硬件中断服务函数44.45.46.* #define VECTOR_003*/HardFault_Handler47.48.49.#endif/_ISR_HVECTOR_003在vectors.h 里已经定义了:default_isr#define VECTOR_003/* isr.h 结尾 */默认中断向量表里大部分中断地址都是
51、指向 default_isr ,所以要重新到自己的中断服务函数。这个头文件是用来重中断向量表里的中断函数地址,使其指向所定义的中断服务函数。注意:这个头文件只能在vectors.c中被包含,而且必须在vectors.h包含的后面被包含!即在vectors.c里,头文件的包含顺序为:关于中断函数的编程和 isr.h 的作用,可以看:中断函数的编写方法最后,在 fire_Kinetissrcplatforms命名为 k60_fire.h :一份 k60_tower.h文件夹下,文件出来,在 fire_Kinetissrccommoncommon.h 里找到下面的代码: 52. /* 41 50.
52、#include vectors.h /两者顺序不能换,如果换了,就不能重到指定的中断函数地址 51. #include isr.h火#include k60_fire.h ,即注释掉,并另外,DEBUG_PR在 fire_Kinetissrccommoncommon.h 和fire_Kinetissrcplatforms k60_fire.h 里都 有定义,应该注释掉 k60_fire.h 里的定义在 fire_Kinetissrccommoncommon.h 添加数据类型的 typedef : 42 1. /*设置数据类型*/2. typedefunsignedcharu8;/无符号型ty
53、pedefunsignedshorttypedefunsignedlongu16; u32;5.6. typedefchars8;/有符号型typedefshorttypedeflongs16; s32;78. /* Global defines to use for all boards */79. /#define DEBUG_PR64.65. /*66. * Include the platform specific header file67. */#if (defined(TWR_K40X256)#include k40 tower.h#elif (defined(TWR K60N5
54、12)#elif (defined(TWR_K53N512)#include k53_tower.h#else#error No valid platform defined#endif/ #include k60_tower.h#include k60_fire.h53. * Include the platform specific header file54. */#if (defined(TWR_K40X256)#include k40_tower.h#elif (defined(TWR_K60N512)#elif (defined(TWR_K53N512)#include k53_t
55、ower.h#else#error No valid platform defined#endif#include k60_tower.h火添加 GPIO 驱动和点亮 LEDKinetis 的编程步骤:开启时钟、复用管脚、设置频率、设置功能在 fire_Kinetissrcdrivers 文件夹下 建立 gpio 文件夹,再在gpio 文件夹建立gpio.c 和 gpio.h把 gpio.c 添加进工程分组的drivers 里,在 gpio.c 里添加如下gpio 的驱动代码:1.2.3.4.5.6.7.8.9.10./* (C) COPYRIGHT 2011*文件名描述:gpio.c:gpi
56、o 驱动函数实验库版本嵌入系统:野火 kinetis 开发板:作者淘宝店:11.*技术支持:htt/list.jsp?id=100812. */ 13.#include common.h#include gpio.hvolatile struct GPIO_MemMap *GPIOx5=PTA_BASE_PTR,PTB_BASE_PTR,PTC_BASE_PTR,PTD_BASE_PTR,PTE_BASE_PTR; /定义五个指针数组保存 GPIOx 的地址volatile struct PORT_MemMap *PORTX5=PORTA_BASE_PTR,PORTB_BASE_PTR,POR
57、 TC_BASE_PTR,PORTD_BASE_PTR,PORTE_BASE_PTR;21./*22.23.24.25.26.27.28.29.*函数名称:gpio_init功能说明:初始化 gpio参数说明:PORTxn IOdata端(PORTA,PORTB,PORTC,PORTD,PORTE)端口引脚引脚方向,0=输入,1=输出 输出初始状态,0=低电平,1=(对输入无效)函数返回:无修改时间:2012-1-1530.31.32.33.34.35.36.*已测试*备注:*/void gpio_init (PORTx portx, u8 n,IO cfg,u8 data)ASSERT( (
58、n 32u)& (data 2u) );/使用断言检查输入、电平 是否为 1bit 43 火37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58./选择功能脚 PORTx_PCRx ,每个端口都有个寄存器 PORTx_PCRx PORT_PCR_REG(PORTXportx,n)=(0|PORT_PCR_MUX(1);/端口方向控制输入还是输出if(cfg = GPO)/outputGPIO_PDDR_REG(GPIOxportx) |= (1n);if(data = 1)/output/端口方向为输出GPIO PD
59、OR REG(GPIOxportx) |= (1n); /对端口输出控制,输出为 1elseGPIO PDOR REG(GPIOxportx) &= (1n);/对端口输出控制,输出为 0elseGPIO PDDR REG(GPIOxportx) &= (1n);/端口方向为输入/*59.*60.61.62.*函数名称:gpio_set 功能说明:设置引脚状态63.64.65.*参数说明:PORTxn data端(PORTA,PORTB,PORTC,PORTD,PORTE)端口引脚输出初始状态,0=低电平,1=66.67.68.69.70.71.72.73.74.*函数返回:无修改时间:201
60、2-1-16已测试*备注:*/void gpio_set (PORTx portx, u8 n, u8 data)ASSERT( (n 32u)& (data 2u) );/使用断言检查输入、电平 是否为 1bitif(data = 1)75.GPIO PDOR REG(GPIOxportx) |= (1n);/输出76.77.78.elseGPIO PDOR REG(GPIOxportx) &= (1func(char)c);/在 prf 里定义 func 为 out_char/即类似执行:out_char(char)c); 6.7. 火断言,其实就是一个宏定义:/* 注:野火修改过这里的代
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 深度解析(2026)《GBT 33531-2017就业援助服务规范》(2026年)深度解析
- 任务5.3 商品评价和反馈
- 医疗数据安全治理:区块链未来趋势
- 10 雨点儿【从基到通】一年级上册语文统编版
- 医疗数据安全攻防的区块链隐私计算
- 医疗数据安全成熟度评估:区块链技术的未来趋势
- 胸痛院前急救
- 医疗数据安全审计工具选型与功能要求
- 医疗数据安全培训中的区块链技术协同应用
- 胫腓骨骨折分型课件
- 人教版八年级数学上册期末复习:必刷基础60题(14种必考题型)
- 细胞外基质影响生物电导率-洞察分析
- DB11 527-2008 变配电室安全管理规范
- 出纳劳务合同模板
- 创新创业创造:职场竞争力密钥智慧树知到期末考试答案章节答案2024年上海对外经贸大学
- JTG-3830-2018公路工程建设项目概算预算编制办法
- 检测进度计划及保障措施
- 马眼看世界之品牌与品质的关系课件
- 香港验血测性别报告单
- 旋挖桩钻进记录-自动计算-含公式
- 高效能人士提高办事效率七个习惯学员
评论
0/150
提交评论