从零入手Kinetis系统开发(1-11).doc_第1页
从零入手Kinetis系统开发(1-11).doc_第2页
从零入手Kinetis系统开发(1-11).doc_第3页
从零入手Kinetis系统开发(1-11).doc_第4页
从零入手Kinetis系统开发(1-11).doc_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

整理内容转自/jihceng0622,向jihceng0622表示感谢!【原创】从零入手Kinetis系统开发(一)研究飞思卡尔的Kinetis有段时间了,由于一直在跟飞思卡尔的片子打交道, 所以从Kinetis一出来就引起了我很大的兴趣,从去年9月份发布以来,估计大家就都在翘首以盼FSL能尽快出开发套件和相关资料,呵呵。提到这,就不得不对飞思卡尔抢占的市场先机赞一个,毕竟M4的核还是飞思卡尔领先发布了,虽然紧接着NXP和意法都推出了相关产品,不过在当今这个激烈的市场机制下,尤其是电子产品,谁先抢占先机谁就占据了优势,这个我们从如今智能手机领域竞争的激烈程度上就可略窥一斑,虽然不灰常了解FSL为什么ColdFire,PowerPC做的好好的,转向ARM(估计是在如今ARM家族正如日中天的大环境下,显然飞思卡尔也不想落下它,偏的太远,呵呵),不过飞思卡尔片子的可靠性还是公认比较好的了,就是小小的期望一下,FSL以后客户定向能稍稍微偏向下我们小群体(片子太贵了啊,汗),尤其是我们这些个穷学生,呵呵。 以上纯是自己一点个人观点,有点偏主观色彩,大家心急的可以直接略过,不心急的咱以后再探讨,呵呵,那下面咱直接进入主题。既然标题是从零入手,就得像垒积木那样一步步的来,因为我也是从零开始的,也希望同大家一块儿交流自己学习期间的一点心得和经验,给过去、现在或者将来徘徊在Kinetis大门外犹豫的广大电子爱好者一点启发,起码别像我当初那样愁眉苦脸四处碰壁找不到入门的途径,毕竟Kinetis太新了以至于现在资料都很少(咳咳,主要都是英文的,看着太累了,哎),大多数人都在边摸索边前进着,当然肯定有大牛已经远远走在前列了,这个只能仰视了,呵呵,我们还是一步步慢点来踏实些。下面我以我自己的开发经历给大家敲响Kinetis的大门(有点大了,咳咳)。 第一系列就首先带大家准备一下开发系统的搭建,巧妇难为无米之炊,那我们就从硬件和软件两个方面准备一下: 硬件方面,因为我手里有块K60的最小系统板(要玩就玩数大的是吧,60够大的了,呵呵,开玩笑的,这个根据自己实际情况来,其实大部分操作还是一样的),以后的开发不出意外的话就先以它为例,下面给大家看下俺的板子, 片子用的还是工程测试的片子(PK60,哎,期待看到MK60呢一直,呵呵),不过不影响使用,还是比较稳定的。上图: 还有就是调试工具了,我看了飞思卡尔的官方的tower系统,上面是自带JM60的JTAG的了,还是挺好的,不过我最后还是选择了J-Link,广大ARM爱好者的最爱了,功能强大而且又便宜,我觉得还是挺适合我们一些低消费群体的了,现在已经出到V8版本的了,而且还支持在线固件升级,还是很靠谱的,虽然现在J-Link被我们广大国内厂家抄的较为泛滥,PCB我就发现过好几个版本的,拆过几个发现都不一样来,汗,呵呵,不过用着还是挺好的,而且估计也正是因为这点才造成价格真是低啊,真好,嘿嘿。至于最后为什么选择了J-Link,下面软件马上揭晓。 软件方面,目前有三种支持的开发环境,即CodeWarrior,IAR FOR ARM和Keil For ARM,CW10.1版本和IAR 6.1版本以上开始支持Cortex-M4内核,至于Keil我没测试,在这里就不敢乱说了,毕竟群众的眼睛太雪亮了,呵呵。至于下载问题,可以直接到官方网站上去下载,CW10.1下special版的,IAR下Evaluation版的,毕竟免费,不用白不用,遇到各种代码限制的话,大家都懂的,知道怎么做了吧,呵呵。由于以前一直在用CW开发环境,觉着真的很强大,尤其是在线仿真跟踪功能,真的很好用,文本编辑也很人性化,总之很好,不过我最后还是选择了IAR,一是想换种口味,找找新鲜,对比下两者区别,毕竟IAR的编译效率还是有良好的口碑的,还有一个原因是正好我在玩430,所以索性趁此机会熟悉下,现在发现还是不错的。还有就是上面提到的问题,为什么最后选择了J-Link,一个是性价比高,还有一个主要原因是我发现Tower自带的JTAG在IAR环境下竟然不支持在线跟踪,自动刷新,每次查看内存读寄存器还要点暂停,这个对于我们这些懒惯的人来说有点无法容忍了,呵呵,哎,最后只能挣扎着用J-Link了,目前运行正常,没发现大问题。 现在”米“,”锅“都有了,生米不能吃,等到咱能吃了,估计也该大圆满了,呵呵,以后希望跟大家一块儿烹饪咱们这锅饭,它叫”Kinetis“,呵呵,这是第一篇,话多有点罗嗦,以后争取言简意赅,咳咳。未完待续【原创】从零入手Kinetis系统开发(二) 经过了上一篇的一阵啰嗦的准备,呵呵,该有的硬件和软件开发环境已经选择好了,下面该是我们大展身手的时候了。废话不多说了,首先想先以自己的理解分析介绍下飞思卡尔官方提供的k60最小系统的硬件电路和IAR例程的编程结构,这个很重要,先学学人家的在创新自己的(汗,不知不觉走上了中国制造思想的这条路,先模仿再超越,至于能不能超越?未知,呵呵)。 说的这里我还想提一下,我在这里想分享的不仅仅是自己的开发过程和以后可能的一些代码(当然这部分很重要,想得到一些高手们的一些意见和交流),而是更重要的想分享给徘徊在初学者阶段的人学习一款新片子的完整流程也就是学习方法,授人以“渔”才是王道,呵呵,虽然这个流程我时至今日还在摸索完善,但是期望能给他们一些启发,因为身为一个搞电子的学生,都是从那一步走过来的,我深知其中的艰辛和渴望有人指点的迫切。至于这个流程,呵呵,随着本系列的深入,我相信会体会出来的 言归正传,首先介绍下FSL塔式结构的K60最小系统板子上的资源,上图: 从图上我们可以看到,它几乎把K60的资源全部引出来了,原理图在附件: 1、电源部分,USB供电,经过LDO转成3.3v,这里重点提一下,其实可以不用LDO而是采用K60自带的USB电压调节器,5v输入电压调节器输入端(VREGIN),输出(VOUT33)3.3v以供芯片工作,我上篇的板子就是这样用的,飞思卡尔显然也考虑到了,所以加了跳线选择; 2、时钟部分,50MHz有源晶振,32768Hz实时时钟(RTC)。其中主时钟输入如果用到以太网模块的话需要引出,因为以太网的PHY和K60需要同相,很重要;至于RTC,供电VBAT则可以使用外部电源3.3v也可接纽扣电池,掉电保存; 3、加速度传感器MMA7660,官方有个DEMO例程有个小应用用到它,还是挺好玩的,可以做些姿态感知; 4、ADC,外接一个电位器,貌似这都快成为一个最小系统的(括弧:测试用的)的标配了,呵呵,用来测试AD模块的,官方例程有介绍; 5、TSI,个人觉着FSL很好的一个资源,集成了电容触摸功能,在当下电容触摸红红火火的时候,这个飞思卡尔没有落下,挺好,呵呵; 6、LED灯,这个也是标配了(想起了跑马灯,流水灯,呵呵,真怀念,哈哈),测试GPIO用; 7、SD卡驱动,人家是正经的SD模式驱动,可不像俺以前搞的SPI模式(速度不是很快,还不稳,哎); 8、infrared port,红外调制模块。 9 。(待加) 下面以飞思卡尔官方提供的在IAR环境下的GPIO例程为例,分析下编程结构,注意是分析飞思卡尔的编程结构,而不是逐行讲程序,因为我觉着熟悉一个开发环境工具,首先就要熟悉它的工程构架和风格,然后编辑编译连接代码,功能设置,下载调试等等,最后这才敢说叫掌握一种开发环境,这才敢以后毕业写在简历上呢,呵呵。再上图: 如上图,官方的例程一般都是K60和K40平台的两种,这里我们通过选择左侧工程窗口的选项卡选择K60平台,然后选择FLASH_512K_PFLASH配置模式,这是随便选择的,呵呵,其实这个配置模式还是很重要的,这个会在下次重点介绍下,下面分别介绍下每个工作组。1、common工作组 这个工作组的文件比较杂,这里挑几个重要的以后会用到的说一下。首先startup两个文件,可以直接就猜到,这个启动代码有关的文件,其实这个文件只包括了RAM区的初始化即把向量表和一些数据放到RAM区,所以是不全的,以后我会单独写一篇有关启动代码部分的,而且最后把启动部分都归到一个文件里;然后就是printf.c文件,用在终端交互上;最后就是common.h文件了,也是最重要的头文件了,你会发现几乎每个模块都加载了这个头文件,而且你也会发现你翻遍了这几个工作组文件都没找的K60的头文件,应为它们都在这个文件里加载了,这个需要引起足够的重视。至于其他的文件以后用到再分析。2、cpu文件组 这个文件组涉及到了M4核文件arm_cm4,启动文件crt0.s、start.c、sysinit.c和向量表文件vectors.c。这几个文件都很重要,其中M4核文件包括了一些有关NVIC即中断模块的应用函数,例如使能和禁止IRQ中断,设置中断优先级等,至于启动部分都会统一在后面系列介绍,至于vectors文件则是缺省的向量表文件,这个以后用到中断设置的时候会用到,很重要。3、drivers文件组 这是驱动部分文件组,这个例程只写了三个部分的驱动,即多时钟产生器(MCG),异步串行通信(UART),看门狗(wdog)。这个文件组主要就是放置K60资源的驱动代码,这里只有三个,因为例程里只用到了这三个模块,可以直接调用其内部子函数。4、IAR文件组 这个文件组为IAR环境的配置模式文件组,每个icf文件代表一种配置模式,其内部对K60内存映射做了相应的的分配,从每个文件名就可以看出其含义,具体区别和分析,将在下系列做详细的介绍。5、platforms文件组 这个是平台文件组,内部包括了跟相应平台相关的硬件配置定义。像这个例程,就包括了UART通信端口和波特率的定义和系统全局时钟的定义。6、project文件组 这个才是我们最喜欢的真正“main”文件组了,呵呵,把gpio_k60.c当成main.c就是了。我们在工程开发相关的文件可以放到这个文件组里,这个例程是实现K60的GPIO功能,所以添加了gpio_k60.c文件。另外isr.h文件则是编写中断服务程序需要用到的头文件了,里面定义了所需中断的中断向量和中断服务程序的声明。7、output文件组 这个文件组包括了整个工程编译链接后生成的文件,其中.map文件描述了K60最后的内存分配情况,在里面可以查看工程耗费的ROM容量和RAM容量还有一些变量函数等等的地址,还是挺有用的;out文件则是最后生成的文件,调试下载所需的文件。 这篇主要对K60 Tower系统官方的的硬件和软件进行了简单的介绍,有了这个基础才能建立自己风格的硬件和软件环境。人家的毕竟是人家的,用着不舒服,只有自己消化吸收了用自己容易理解的风格建立一套有自己特色的开发系统才是正道,呵呵,拭目以待,下回分解 附件为tower硬件原理图和较新的官方IAR关于K60的例程。【原创】从零入手Kinetis系统开发(三)之建立自己风格的IAR编程结构本来按计划在这篇博客第三系列,我是想跟大家一块儿分析和整理下K60的启动代码部分的。可是后来想来想去,觉着既然上一篇写了飞思卡尔的官方例程的编程结构,那么这次就一鼓作气索性先把自己的工程风格建立起来,而且这样建立好了工程之后再分析其启动代码也不显得突兀,容易接受和理解,呵呵(咳咳,有点当老师的赶脚了)。所以这篇如果具体来说,应该叫做“从零建立属于自己风格的基于IAR的K60工程”。 既然说是自己风格,可能就有些偏主观色彩了,呵呵,希望高手大侠们不要拍砖,主要是拿出来希望可以给入门级的同志们一点借鉴和经验,当然也希望跟高手们交流下,有错误的地方期待得到你们的批评指正(这点很重要的)。由于这篇内容可能会有点多甚至有点乱,所以下面就不再废话了,直接上图了哈(都快口头禅了,晕) 呵呵,上图就是我自己的一种风格,其中Library文件组为自己做的库,包括了CPU文件组(K60的内核部分),Drivers文件组(K60功能模块驱动),Headers文件组(部分系统头文件)和StartUp文件组(K60的启动代码文件);Link文件组为K60的配置模式文件组,icf文件可以到网上搜一搜它的作用,Project文件组为一个新项目工程的文件组,在该文件组新建功能C文件,Output文件组为链接输出文件组,,out文件用于下载调试。 每个人可能都有一种编程风格,只不过如果可以给大家一点启发或者借鉴则足已。整体的工程架构我已经晒出来了(呵呵,我也潮一把,用一用“晒”这个字),也就是本篇的任务和最终的目标,下面将分几个步骤层层剥解,如果把它看成牛,那希望我们能像庖丁一样游刃有余,开始吧:(可能有的步骤较粗略,没办法,篇幅所限,注重领会精神,呵呵) (1)目前大多数开发环境都是基于项目工程(project)来管理的,但是每个project又必须建立在工作区内,且一个工作区允许多个项目的建立,如果第一次建立一个project则必须要先建立工作区。好了,概念介绍完了,图来了(前提软件已经打开了,呵呵):图1.1 新建工作区图1.2 新建工程图1.3 新建空工程图1.4 已经建立好的空工程 (2)建立相应的工作组,如前面整体风格所示,主要建立Library文件组(自己做的库),Link文件组(该工程的配置文件组),Project文件组(项目文件组)和out文件组(输出文件组)。图2.1 在工作区右键选择添加工作组图2.2 建立好的文件组架构(空的) (3)给文件组添加相应的C文件,这部分涉及到移植官方例程的文件到该工程。图3.1 所建工程的根目录结构,就是把所需的c和h文件拷贝到上图和下图所示相应的文件夹下图3.2 config files下文件结构,为icf文件,配置K60调试方式内存分配等图3.3 Library下文件结构图3.4 启动代码文件目录(下篇会仔细分析)图3.5 K60内核部分文件目录图3.6 drivers下的文件目录,目前只添加了这几个功能模块的文件,C文件和相应的头文件在相应文件夹里面,这里面篇幅所限,不再细贴图了,呵呵 图3.7 系统所需头文件的目录文件,看看,基本上所需的重要的头文件都放在该文件夹里除了具体功能的头文件,像arm_cm4.h,vectors.h等等图3.8 该目录下放置实际工程文件,这里只新建了test.c文件,以后随着工程的深入,会不断放置新的文件图3.9 具体添加相应文件到相应的文件组的操作,注意了,文件组只是起到了组织文件的作用,跟刚看到的同样文件名的文件夹不是一个概念,也就是说,这文件组名可以不与相应的文件夹同名,但是可以把相应文件夹下的c文件添加到相应的文件组下,ok?呵呵 (4)相应的文件添加完毕后,下面就涉及到工程的设置问题了,这部分是重中之重,注意了。图4.1 右键工程名,选择Options,进入工程设置选项卡,也可以菜单选项Project-Options进入在General Options里选好内核,其他部分默认即可,然后进入C/C+Complier选项卡这个很重要,如果要自己建立或者移植官方的例程到自己的工程文件夹下,这个头文件包含目录一定要添加,其中$PROJ_DIR$表示路径在当前工程文件夹中也就是工程文件.ewp文件所在的目录,“.”表示返回上一级文件夹,“文件夹名”表示进入这个文件夹。这是一种相对路径的用法,方便以后移植,这个灰常重要,这个细说要很多东西,所以建议到网上搜一搜该用法。这个是Output converter选项卡,选中输出motorola文件,这个是可选的,其实也可不选这个是下载调试选项,这里需要注意一下,呵呵,如果用飞思卡尔官方的tower系统,这里驱动器需选择PE micro以便使用板上自带的OSJTAG,不过我因为用的是J-Link,所以。咳咳,是吧,懂的,呵呵,然后Run to可以不点,这样的话调试初始运行会首先进入到启动代码,便于我们分步调试,这个以后会详细介绍。由于我上个步骤选择了J-Link调试工具,所以这步进入该选项卡设置,其实默认即可,呵呵。 (5)设置配置模式可以看到系统默认的两种配置模式,这里不需要它们了,逐个点Remove,然后分别新建Flash_512K和RAM_128K,然后确认,然后就可以看到配置模式里多出了两个选项即Flash_512K和RAM_128K,这里我选择RAM128K当然仅仅这样不算完,我们还需要给其配置相应的icf文件,这下想到上面提到的那个config files文件夹了吧也即是上图所示Link文件组里的文件,呵呵,所以接下来我们选中工程然后右键进入Options选项卡的Linker选项在这里选中Override default,然后选择好icf所在的文件路径,其他选项卡默认即可,接下来同样设置好Flash_512k的icf文件路径,这样就有了两中配置模式,这里我默认选择RAM_128K模式。 这样属于自己风格的IAR工程就建立好了,图有些多而且有点乱,见谅。因为篇幅所限,可能有些部分一带而过,这些以后用到了可能会再详细介绍,呵呵,未完待续【原创】从零入手Kinetis系统开发(四)之启动代码分析在对K60开发应用程序或编写硬件模块的驱动程序之前,我们需要对其启动流程有所了解。也许对一些简单的8位或者16位单片机进行系统开发时,我们往往不用去关心其启动代码部分,一般都是直接使用开发环境默认给出的启动代码,没必要去改。但是对于像ARM这类的复杂的32位片上系统来说,在启动代码部分,需要通过软件对一些硬件资源进行配置和设置一定的工作状态,这样我们就不得不去认真的了解它了。下面就以飞思卡尔tower系统上的片子MK60N512VMD100为例分析官方提供的Demo程序的启动流程。 简单的概括下K60的启动流程,主要分为四个部分(咳咳,我自作主张的分的,大家不要拍砖啊,呵呵): (1)初始化K60的通用寄存器(R0R12),使能全局中断,跳转到start函数; (2)关闭看门狗,在调试阶段一般关闭它,毕竟老是频繁的喂狗也是挺麻烦的; (3)复制中断向量表、初始化的数据和以_ramfunc声明的子函数到RAM区(一定程度上提高了代码执行速度),并清零零初始化数据区; (4)初始化系统时钟; 在逐步分解介绍之前,必须要首先了解下*.icf文件,我默认采用128KB_Pflash配置模式,所以这里打开128KB_Pflash.icf文件,由于这个代码较多,所以就挑重要的说了: /*用到的,捡重要的说,可能不是挨着的语句* define symbol _ICFEDIT_intvec_start_ = 0x00000000;/这个是声明,中断向量表的默认存放地址 define symbol _code_start_ = 0x00000410;/声明程序代码开始地址 define exported symbol _VECTOR_TABLE = 0x00000000;/默认的中断向量表存放地址=楼上,呵呵 define exported symbol _VECTOR_RAM = 0x1fff8000;/需要复制到RAM去的中断向量表的地址 place at address mem:_ICFEDIT_intvec_start_ readonly section .intvec ;/把.intvec代码段中的只读部分放在存储空间mem中的_ICFEDIT_intvec_start_ 地址上 place at address mem:_code_start_ readonly section .noinit ;/把 .noinit段中的只读部分放到地址空间_code_start_开始的地址上 */.intvec 这个段可以在vectors.c文件中找得到,上图了又:这里可以看到,系统默认是把中断向量表放到了.intvec段里,由上面可以看到也就是默认放到了0x00000000地址。(1)下面逐步分解,其中第一步可以在crt0.s文件里找到,如下: ;AREA Crt0, CODE, READONLY ; name this block of code SECTION .noinit : CODE ; 下面这部分汇编代码放到.noinit段里地址为0x00000410(从上面分析可以看到) EXPORT _startup_startup ; _startup标号,其实这个是复位向量,在中断向量表里可以查到为vector001 MOV r0,#0 ; 清零所有通用寄存器 MOV r1,#0 MOV r2,#0 MOV r3,#0 MOV r4,#0 MOV r5,#0 MOV r6,#0 MOV r7,#0 MOV r8,#0 MOV r9,#0 MOV r10,#0 MOV r11,#0 MOV r12,#0 CPSIE i ; 打开全局中断 import start BL start ; 跳转到start的C函数_done B _done END可能有些人会迷惑为什么CPU会复位之后从_startup标号开始执行,这里我以CPU的角度走一遍这个流程,CPU上电复位或者其他方式复位之后,它会首先从0x00000000地址读取堆栈指针到SP,然后再从0x00000004地址(注意地址总线为32位,所以每次跳4个字节才能读取下个地址)读取程序指针到PC,最后CPU就跳到PC指针所指向的地址开始执行程序了,至于从0x00000004读取的PC指针指向的地址是哪呢,那就是上面所说的_startup标号指向的程序地址了,这个我们可以在vector.h文件里找到,如下:(2)接下来跳到了start.c文件的start函数,首先执行关闭看门狗功能,也就是第二步了:/* Disable the watchdog timer */wdog_disable();/关闭看门狗功能,打开wdog.c文件,找到wdog_disable函数,可以找到/*void wdog_disable(void) /* First unlock the watchdog so that we can write to registers */ wdog_unlock(); /* Clear the WDOGEN bit to disable the watchdog */ WDOG_STCTRLH &= WDOG_STCTRLH_WDOGEN_MASK;void wdog_unlock(void) DisableInterrupts; /* Write 0xC520 to the unlock register */ WDOG_UNLOCK = 0xC520; /* Followed by 0xD928 to complete the unlock */ WDOG_UNLOCK = 0xD928; /* Re-enable interrupts now that we are done */ EnableInterrupts; */其完整的流程就是先解锁看门狗(注意向解锁寄存器里连续写入0xC520和0xD928,两次写入的时间必须小于20个时钟周期,期间不允许中断),然后禁止看门狗使能就OK了。(3)关闭看门狗之后,进入第三步,复制向量表:/* Copy any vector or data sections that need to be in RAM */common_startup();/复制向量表、初始化的数据和以_ramfunc声明的子函数到RAM区,打开startup.c文件找到该函数/*void common_startup(void) /* Declare a counter well use in all of the copy loops */ uint32 n; /* 这两个全局变量在上面.icf文件里可以找到,里面定义了它们的地址*/ extern uint32 _VECTOR_TABLE; extern uint32 _VECTOR_RAM; /* Copy the vector table to RAM */ /*如果它们地址不一样(我用的是128KB_Pflash所以是不一样的),则复制flash内的向量表到RAM区得向量表*/ if (_VECTOR_RAM != _VECTOR_TABLE) for (n = 0; n 24)+ 1); /得到外设时钟/*下面两句是初始化总线频率和内核频率到相应的IO上通过设置pin muxing options,用来验证系统频率是否设置正确,挺有用的*/ trace_clk_init(); fb_clk_init();/.此处.省略N个语句,不重要就不提了.*/呼呼,到此处,K60的系统启动部分就完工,然后调用main()进入到应用程序主函数,之后就是咱们正常的开发流程了,呵呵,还是挺简单的哈,具体地方还需自己琢磨摸索一下,觉着.icf文件很重要,可以仔细看看研究一下。 从上面可以看到飞思卡尔官方的启动代码真够麻烦的,各个文件之间跳,估计耐心差的都扛不住啊,呵呵。所以我重新整理简化了一下它的启动代码,以前传到了该网站的飞思卡尔的创意嘉年华的小组讨论区,虽然只是部分,不过有兴趣的可以看看。未完待续【原创】从零入手Kinetis系统开发(五)之GPIO模块 好久没有写从零入手这个系列了,发现有点生疏了,看来以后不能老搁置下来啊,呵呵假期临近,貌似最近好多人都得了假前松散症了,我就是这个样子了,天天在等着放假回家,无心科研了,哈哈,但是该做的还得做。闲话说完了,下面进入正题。 可以说,前面几个系列只是个准备阶段,从该篇之后就打算进入到应用阶段了,会以K60为例逐篇介绍Kinetis的各个功能模块,并给以相应的实例工程作为参考,总之希望初手们能尽早入门(加油啊,不然我可白费这么大劲了,呵呵),高手们给点意见,哈哈。本篇就开个好头,说个简单的却是最最常用的模块GPIO模块。 要想了解一个模块,有些重要的图表必不可少,下面我们看下GPIO模块框图(refer to kinetis datasheet) 然后下面列出Kinetis的GPIO模块的一些特点作为参考(这点对一款芯片的选型很重要的,不得不说kinetis的GPIO功能还是挺强大的):(1)I/O口兼容5v外部设备(所以不需要像244or245之类的电平转换接口),同时可以支持开漏输出(这点的好处,百度谷歌之,这里不赘述了哈,呵呵)。(2)5组I/O(PORTA,PORTB,PORTC,PORTD,PORTE)都支持I/O中断和DMA中断(边沿或者电平触发),这点我们可以粗算一下,假设不考虑片子的管脚限制,即每组I/O有32pins,也就是支持32*5个中断,够吓人的吧,不过需要注意的是每组I/O用的是一个中断向量号,具体组内哪个IO中断则需要根据中断标志来判断了,所以如果需要设置优先级的场合还是采用不同组的IO中断吧,这点相信用到的都懂的。(3)带数字干扰(毛刺or抖动)滤波器(digital glitch filter),可配置滤波宽度和时钟源。这种功能可以用于消除一定脉冲宽度的毛刺减少对有用信号的影响,例如用在按键消抖上,是不是很好,呼呼。另外还有可设置的无源低通滤波器(passive filter),这个需要注意下,如果输入信号频率在2M以上的话,这个无源滤波器要禁止的,不然的话可是会被滤掉了啊,哈哈。(4)对输入功能,有可选的上拉或者下拉电阻功能。(5)对输出功能,有可配置的斜率控制和输出驱动能力控制。 还是老套路,硬件特点介绍完了,下面就说说软件的配置了,这里简单列出一下常用到的GPIO通用的寄存器:(1)PORTx_PCRn管脚配置寄存器,用于配置复用、中断使能、驱动能力等等;(2)GPIOx_PDDR数据方向寄存器,0-input,1-output;(3)GPIOx_PDOR数据输出寄存器,0-driven 0,1-driven 1;(4)GPIOx_PSOR数据输出置位寄存器,0-invalid,1-driven 1;(5)GPIOx_PCOR数据输出清零寄存器,0-invalid,1-driven 0;(6)GPIOx_PDIR数据输入寄存器,映射外部IO状态;(7)GPIOx_PTOR数据切换寄存器,0-no effect,1-reverse the exiting logic level。准备工作做好了,下面就给个例程理解一下(附件为完整GPIO初始化文件),呵呵,大家都喜欢看这个的,懂的上面只是简单的IO操作例程,以一定延时时间(8000000)反转PORTA0口的电平状态,像GPIO_Init和GPIO_Toggle两个功能子函数程序里有部分注释,另外如果想看完整的可以在附件里找到相关的GPIO文件,该文件部分参考了王宜怀老师的新书例程,对此表示感谢。 还有就是一个好消息,为了更好开源分享Kinetis的资料(咳咳,主要是拉动一下大家开源的精神,我只能抛砖引玉了,呵呵),我最近在整理写了一段时间的K60底层驱动,目前已经写了startcode、mcg、wdog、GPIO、ADC、uart、FlexBus等部分,争取在放假前整理好传到“飞思卡尔创意嘉年华讨论组”的小组话题区里,有兴趣的可以关注一下(得声明一下,可不是为了拉票的,就是希望关于Kinetis的资料能更多些,汗,以前碰壁留下阴影了,所以现在开源的思想老在脑子里转,呼呼),希望能得到高手的意见,当然初手们也可以交流一下,哈哈。未完待续 附件为GPIO.c和GPIO.h文件(英文注释,这个很必要,希望初手能多加锻炼这方面能力)。【原创】从零入手Kinetis系统开发(六)之MCG模块这个假期在家待的好长啊,呵呵,所以也是好久没敲博客了,真是手指、大脑各种生疏啊,幸亏积极性还在,所以在摩拳擦掌的准备了几天后,又忍不住继续未完的事业了,哈哈(咳咳,又有点吹大了)。 前几天看了garfield发的新闻,飞思卡尔又亏损了,哎,拔凉拔凉的,凄凄惨惨戚戚啊,想起赵大叔的小品里一句“海燕,你长点心吧”,我只想说声“飞思卡尔,你也长点心吧”,貌似自从我知道飞思卡尔这个名字起,你就一直在亏损啊,呜呜,让俺们这些一直在坚定不移地用你的片子的飞丝们(咳咳,自己起的,哈哈)情何以堪啊。是真心希望你能在2012龙年来个龙抬头,呵呵 新年刚回来话有点多,见谅见谅了,不过貌似都习惯了,只有啰嗦一阵后才能文思上涌,所以时间宝贵的网友们可以直接跳到下面实质内容,哈哈其实在家这些天,自己也没闲着,而是在整理和规划从零入手这个系列的思路,希望能更好的展现自己的学习成果和大家交流探讨,而且很欣慰的是看到了一些网友通过该系列也收获了一些成果和开源分享的精神,特别是fzjz网友还分享了他的GPIO成果。既然开了好头,那就让我们继续下去,年轻人,最宝贵的不就是这一股子冲劲吗,哈哈 言归正传,本篇主要介绍了Kinetis的MCG模块(多功能时钟产生器模块),期间可能涉及几个SIM模块(系统集成模块)的寄存器,但因为不是本篇重点介绍的内容就不特别介绍,之后会有专门介绍SIM模块的一篇,敬请期待,呵呵。掌握MCG模块,离不开下面几张图表,这几个图表是非常重要的,根据图表再结合官方例程或者本篇附件里我整理的MCG例程一步一步就可以轻松掌握MCG模块,下面揭开MCG神秘面纱: (1)概述:MCG模块,即多功能时钟产生器,在设计之初就是为了满足提供给MCU多种可选择的时钟源的需要,其包含了一个FLL(锁频环),一个PLL(锁相环)和两个内部参考时钟源和外部,另外MCG还控制一个外部振荡器(XOSC),可以把晶体振荡器作为外部参考时钟。MCG模块可以选择FLL或者PLL作为系统时钟也可以选择内部或外部参考时钟作为系统时钟,提供多种运行模式,满足不同性能不同功耗的要求,非常方便。 (2)图表:如下图为MCG模块三个重要的图表,分别介绍如下, 下图为系统时钟的分配图,系统时钟即Core clock,Bus clock,FlexBus clock,Flash clock分频自MCGOUTCLOCK,而MCGOUTCLOCK则包含四种种时钟源(具体时钟源的分配则有SIM模块控制)即IRC(内部参考时钟),外部参考时钟,FLL(锁频环)和PLL(锁相环),其中FLL又取自IRC和外部参考时钟,PLL则只能取自外部参考时钟。图表1 时钟分配图 下图为MCG的内部剖析图,比较详细,涉及到相关寄存器的控制,具体在下面的程序讲解里会介绍。图表2 MCG内部结构图 下图为MCG几种运行模式之间的转换图表,注意系统复位默认为FEI模式,但是要转换到某种模式必须遵守下图表的顺序一步一步的来,否则可能会遇到不可预料的错误。例如从FEI到PEE,我们可以从中选取一条路线来走(通过程序)FEI-FBE-PBE-PEE。(可能会觉着比较麻烦,不过也是没办法,安全第一,咳咳)图表3 MCG运行模式转换图 (3)部分代码剖析(本篇附件包含完整代码):由于程序里注释已经详细的解释清楚了,这里就不赘述了只列举了主要函数和形参列表,有问题可以下面留言,呵呵。上图的为主要的MCG初始化函数SystemClockInit()和形参want_clock和crystal_val的可选项 (4)不同模式功耗对比(根据不同需要选择不同的模式): 好长时间没写这么多东西了还是有点生疏,大家见谅,如果有些地方不明白可以下面留言,随时解答,呵呵。未完待续 附件为MCG模块完整驱动代码文件。【原创】从零

温馨提示

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

评论

0/150

提交评论