实例介绍
非常好的学习Freescale的嵌入式的书籍《三天入门Cortex-M4----Kinetis系列.pdf》,是初学者的福音啊,呵呵
三天入门 Cortex-M4 Kinetis系列野火嵌入式开发工作室 我们喊出这样的口号并不是吹的,已经有两位大三参加智能车的朋友(同一个队) 在使用我们的教程与k60库三天时间内就能把ⅹs128上的摄像头0V7725驱动程序和 舵机控制程序移植到 Kinetis上跑起来;一位大二的师弟,不到一天的时间就从入门 到搞定摄像头σ7725和液晶LCD的移植……你会是下一位吗? 只要我们敢拼,一切皆有可能!!! Nothing is impossib/e!!! 由于个人能力及时间所限,出错之处,在所难免,欢迎各位指出错误及提出建议: minimcu@foxmail.com 内部交流测试版本,有误请及时提醒3月8日 野火嵌入式开发工作室 联系我们 Technical support 野火嵌入式开发工作室 三天入门 Cortex-M4 Kinetis系列野火嵌入式开发工作室 火 目录 野火nei开发板教程mm 前言 自鲁着自鲁着自D目着自着自着自鲁着自着自D自着自自着自D自着霍■如自着自自着自自自着自看D鲁着老自在自自D自自自自自着看自自自霍着自老看自自看自自看自目自日着 目录 自曲自自量自自血a面自自着面自自自自面自面自自日面自 自面自血曲如自自拍( Kinetis的启动分析(初学者大概浏览一下即可) 初步入门:初始化函数启动执行顺序 逐步提高:ROM、RAM启动工作原理、CF文件讲解 IAR的使用 17 安装IAR 1道1 建立IAR工程 29 创建工程文件 111道 29 添加GPIO驱动和点亮LED 42 IAR工程选项设置 45 快速建IAR工程 64 IAR使用教程 66 工具栏功能介绍 67 通过jink下载并调试 aaaawa 69 使用软件仿真调试 73 IAR界面风格设计… 76 野火 Kinetis核心板实验例程列表 老自自着老自自自着老自自。自自霍自自自D右自自D自霍和自如自着自霍自自自和 78 野火K60库的使用. 刖言 79 快速开发指南 快速入门:了解野火 Kinetis工程…. 80 中断函数的编写方法 86 重要变量、函数、宏定义一览表 839 安全检查 92 GPO模块… ……96 快速入门:GPIO库使用方法 GPIO测试例程 .105 LED模块∴...... 110 快速入门:LED库使用方法 110 LED综合测试例程 113 EXTI外部GPIO中断例程 ……15 野火嵌入式开发工作室 天入门 Cortex-M4 Kinetis系列野火嵌入式开发工作室 快速入门:EXTI库使用方法 火 EXTI综合测试例程 116 UART模块 快速入门:UART库使用方法 119 UART综合测试例程 124 ADC模块… 130 快速入门:ADC库使用方法 130 ADC综合测试例程… 134 FTM PWM模块… …136 快速入门:PWM库使用方法 41:国: 136 PWM综合测试例程 139 FTM输入捕捉模块… ,141 快速入门:FTM输入捕捉库使用方法 141 FTM输入捕捉中断测试… 143 PT定时中淅模块 145 快速入门:PIT定时中断库使用方法 145 PIT定时中断测试例程 ……147 PwM、输入捕捉、PT中断综合测试… 149 I2C模块 152 快速入门:I2C通信库使用方法… 152 I2C通信实验测试… 153 Iptmr低功耗定时器(延时)模块 MCG模块超频..1 157 快速入门:MCG库使用方法 首1里1普 157 快速入门:配置频率 重国11 162 1C/0S 11111166 野火嵌入式开发工作室 天入门 Cortex-M4 Kinetis系列野火嵌入式开发工作室 火 KInetis的启动分析(初学者大概浏览一下即可) 初步入门:初始化函数启动执行顺序 上电复位 中断向量表 Reset Handler start 中断向量表在 vectors, c里定 上电复位后第一个运行的函数,在satc文性里定义,精简后的 义,在 vectors, h文件里/前两crt0.s里用汇编实现。 代码: 个元素分别映射到 SECTICN noinit CODE void start(void) EXPORT Reset. hand e BOOT STACK /ADDRESS和 Reset andler;初始化寄有器 wdog disable();/关闭看门狗 Reset handler(官方自带例程 MOV r0,#0 ommon startu p 为_ startup),第一个为起始 345578911 MOV //复制数据段、中断向量表到ram MOV r2,#0 sysint();//时钟初始化 sP栈指针、第二个为复位中断 3,#0 /* x man函数*/ MOV 服务函数。 r4,#0 whi1e(1);//避免停止运行 r6,t0 上电复位,系统会查询中断向 MOV r8,#0 量表,把第一个元素的值赋给 MOV sP寄存器,把第二个值赋给PC r_0,#0 就是初始化系统:关闭看门狗 15 MOV r-1,#0 寄存器,即上电后马上运行 复制数据到內存、配置时钟,然 MOV r-2,#0 Reset Handler函数。 17 CPSTE i;关中断 后进入main函数 18 import start start 1222 20.;调用C语言编写的 start函数 done common startup」 sysinit maIn 复制中断向量表、初始化数据初始化时钟和初始化串口,精简版代码 这里就是我们的执行 段、以 ramune声明的子函数 oid 函数,我们在这里编 到RAM区(对fash操作的函数 写自己的应用文件 必须这样 core cik mhz-pll init (MCG CLK MHZ); 跟踪吋钟,用于调试 fb clk in二t() //F1 exBus时钟初始化 uart init(rIRE POl=, FIRE BAUD //初始化 f函数所用到的串口 l init pll_init这个函数是用于锁相环超频的,在mog.c里定义。MCG模块一共有9中工作模式,按功 耗高低顺序:PEE、FEE、FEI、PBE、FBE、FBⅠ、BLPE、BLP、stop 高频率意味着高功率,为了获取更高的频率,我们这里 pll_init就是把模式进入PE 野火嵌入式开发工作室 天入门 Cortex-M4 Kinetis系列野火嵌入式开发工作室 火 简单初初始化 初始化 上电 始化 大致思的整体 路 路 dog disable 关闭看门狗 如果ROM启动,则复 制中断向量表 到RAM 启 动 修改中断向量表地址 过 为RAM里的地址 析 清寄存器 复制初始化数据 common_startup 段data到RAM 步 Reset handler 骤 清除RAM中初始化为 start 0的数据段b 把以 ramfunc声明的 子函数 texty复制 到RAM区 初始化锁相环 pll_init nit 初始化 printf函数用 到的串口 uart init 用户任务 注: common_ startup函数并没有复制常量数据 rodata、代码text。如果是 RAM启动,代码会直接编译进去RAM,掉电就会丢失数据。如果是ROM启动,就会 复制中断向量表到RAM,设置中断向量表地址为RAM的地址,以加快中断响应速度。 野火嵌入式开发工作室 三天入门 Cortex-M4 Kinetis系列野火嵌入式开发工作室 火 逐步提高:ROM、RAM启动工作原理、ICF文件讲解 对于初学者而言,对单片机的内存分配往往最让人头疼,很多人学了单片机几年 都不知道单片机内部的内存使用情况是如何分配的。要了解ROM、RAM启动,首先 需要对链接器 Linker如何分配内存有一定的了解。 通常,对于栈生长方向向下的单片机,其内存一般模型是: 最低内存地址 中断向量表 中断向量表段 ntvec 代码区 函数代码段text 未初始化变量段.bss 数据区 常量段. rodata 已初始化全局变量和静态变量段.data 动态分配数据 堆 程序运行中由程序员调用 malloc等函数来申请。 栈 局部变量 在函数内部定义的非静态的变量。 命令行参数 最高地址 1. int a = c //全局初始化区,,data段 2. static int b=20; //全局初始化区,.data段 3. char *pli //全局未初始化区.bss段 4. const int A= 10 //. rodata段 5. volatile const int B 0; /.data段 注意区别!! 6. main() //代码区.text int b //栈 char * p2i //枝 10 static int c=0; //全局(静态)初始化区data段 11 char s[]="123456"; //栈 char*p3-"123456"; /123456\0在常量区,p3在栈上 注意区别!! 13 pl=(char*)mal1oc(10);//分配得来的10和20个字节的区域就在堆区 l∠ p2=(char*) malloc(2.0) strcpy(p1,"123456");//1234560在常量区 //编译器可能会将它与p3所指向的”123456优化成一个地方 17. IAR里可以设置 Linker合并相同的段,即优化成一个 地方。看后面IAR设置工程选项中 Linker的设置教程 注:此表格及代码内容参考网上资料 野火嵌入式开发工作室 三天入门 Cortex-M4 Kinetis系列野火嵌入式开发工作室 火 参考原文出处http://blog.chinaunix.net/uid-15473693-id-388637.htm 那编译到时候,编译器是如何为这些变量数据分配地址的呢? 其实,这就是链接器 Linker在发挥它的作用,它会根据配置文件,来为这些变量 数据分配合适的地址,这样我们就可以不需要考虑这些内存分布就能写出可运行的代 码 编译器对代码进行编译,一般分为四个步骤: 替换和 预编译)展开宏 编译和\编译成汇 删掉注 优化编语言 汇编汇编成机 器码 链接)生成可执 行文件 释 通常情况下,链接器 Linker的配置文件都是由官方提供,一般情况下,我们不需 要更改这些。但出于学习的目的,我们非常有必要去研究一下这些配置文件 在 fire kinetis build config files文件夹下,你可以看到有很多的 linker配置文件: 32KB Ram icf 64KB Plash 64KB Flash icf 64KB Ram icf ICF文件 ICF文件 ICF文件 2 KB 3 KB 2 KB 128KB Flash icf 128KB Flash 128KB Flash icf 128KB Ram icf ICF文件 ICF文件 ICF文件 2 KB 3 KB 2 KB 256KB Flash, icf 256KB Flash 256KB Flash icf 512KB Flash icf 丽 ICF文件 ICF文件 ICF文件 2 KB 3 KB 2 KB fire RAM K60N512 ict fire ROM K60N512, icf ICF文伴 CF文件 4 KB A KB 这里的文件是用来分配数据在内存中的位置,配置ROM、RAM启动, linker根据 这些文件来为 Kinetics分配4G的虚拟寻址空间地址。如果把代码部分编译进去RAM, 那就是RAM启动;如果把代码数据编译进去ROM,那就是ROM启动(fash启动)。 不同的型号,fash内存大小不一样,所以配置 Linker文件也会不一样,以K60 为例: 野火嵌入式开发工作室 天入门 Cortex-M4 Kinetis系列野火嵌入式开发工作室 Device Pr。gram BlockO(P- FlexNvM Block 1 FlexRAM FlexRAM flash(KB) Flash) (KB (FlexNVM/P (KB) address address Flash range range address range MK6ODN256ZV256 0x00o0000 0x00020000 NA LQ10 0x0001 FFFF OxO003 FFFF MK6ODX256ZV256 0x00000000-256 01000000o 0x14000009 LO10 0x0003 FFFF Ox 1003 FFFF 0x14000FFF MK6ODN512ZV 512 Qx00oo9000 Qx0o40000 n/A LQ10 0x0003 FFFF 0x0007 FFFF MK60DN2562V256 0x00000000 0x00020000 N/A MD10 0x00O1 FFFF 0x00O3 FFFF MK60DX256z256 0x00000000-256 ox10000000-4 014000000 MD10 0x0003 FFFF OX1003 FFFF 014000FFF 1K6ODN512ZV512 0x00000000 0x00040000一 N/A MD10 OxO003 FFFF OXODO7 FFFF Device SRAM(KB) MK6ODN256ZVLQ10 64 MKGODX256ZVLQ10 4 MK60DN5 12ZVLQ10 MK6ODN2562VMD10 64 MK6ODX256ZVMD10 64 MK6ODN512ZVMD10 128 野火 Kinetis核心板自带为MK60DN512,512KB的 Program flash大小,128KB 的SRAM大小,没有 FleXNVM和 FleXRAM。 K60的4G虚拟寻址空间就是按照内存空间的映射图来进行配置 Memory map(K60 Address Space 0x0000 0000-0XOFFF FFFF P-Flash 0x 1000_ 0000-0x13FF FFFF FlexNVM(if available) X 1400 0000-0X17FF FFFF FlexRAM Ox1FF0 0000-OX1FFF FFFF SRAM L 0x2000 0000-0X200F FFFF SRAM U, bitband region 0x2200 0000-0x23FF FFFF Aliased to sram bitband 0x4000 0000-0x4007 FFFF Bitband region for peripheral bridge o 0x4008 0000-0X400F FFFF Bitband region for peripheral bridge 1 0x400F F000-0X400F FFFF Bitband region for Port Control Module 0x4200 0000-0X43FF FFFF Aliased to peripheral bridge Port bitband 0x6000 0000-OxDEFF FFFF FlexBus OxE000_0000-0XEOOF_ FFFF Private peripherals(debug module) 野火嵌入式开发工作室 【实例截图】
【核心代码】
标签:
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论