打印
[Kinetis]

【Kinetis分享】+个人的飞思卡尔Kinetis的奋斗之路

[复制链接]
楼主: 偏爱番茄酱
手机看帖
扫描二维码
随时随地手机跟帖
41
偏爱番茄酱|  楼主 | 2014-12-13 20:42 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
一周没更新了,今天晚上就聊一下Kinetis K60高性能单片机

使用特权

评论回复
42
偏爱番茄酱|  楼主 | 2014-12-13 20:44 | 只看该作者
Kinetis K系列
Cortex-M4内核MCU 、通用型
概述
飞思卡尔的Kinetis K系列产品组合有超过200个基于ARM® Cortex™-M4架构的低功耗、高性能、可兼容的微控制器。该系列产品的特点是高度集成,它集成了包括分辨率可配置的16位模拟/数字转换器(ADC)、数字/模拟转换器(DAC)和可编程增益放大器在内的模拟信号处理单元、高可靠性的通信接口以及丰富的人机交互接口(HMI)。Kinetis K系列产品共有7个硬件和软件兼容的ARM® Cortex™-M4微控制器家族,具有超低功耗的性能和存储器可扩展特性(包括片上FlexMemory/EEPROM和外设集成)。Kinetis K系列微控制器的主频范围从50MHz覆盖到150MHz,片上Flash容量从32KB覆盖到1MB,并包括模拟信号处理、人机界面、丰富的接口、器件安全等特性。

使用特权

评论回复
43
偏爱番茄酱|  楼主 | 2014-12-13 20:44 | 只看该作者
芯片特性
除了普通的Flash程序存储器和RAM数据存储器,DX系列还支持Flex Memory存储器,容量从32K~256KB不等,Flex Memory存储器可以配置为Flash(1:1)或者EEPROM(8:1),创新的设计让客户能够更加灵活的分配存储器
多达6路UART,支持ISO7816接口UART
MK21系列支持金融支付认证加密功能,满足金融类客户产品加密需求,单芯片的解决方案使客户产品更具集成度与性价比
内置TSI硬件电容触摸按键模块,避免机械按键带来的寿命受限
多达18通道的PWM和77通道的ADC,为多路电机控制应用带来可能
2路12 Bit DAC以及3路模拟比较器,可以很好与外围模拟接口匹配
1.71~3.3V系统供电,并支持5V IO
-40~105摄氏度的工作温度范围

使用特权

评论回复
44
偏爱番茄酱|  楼主 | 2014-12-13 20:45 | 只看该作者
各子系列图

kk.jpg (56.66 KB )

kk.jpg

使用特权

评论回复
45
偏爱番茄酱|  楼主 | 2014-12-13 20:51 | 只看该作者
今天就以飞思卡尔最具代表性的KINETIS K60展开开发介绍

使用特权

评论回复
46
偏爱番茄酱|  楼主 | 2014-12-13 21:12 | 只看该作者
K60 是飞思卡尔公司推出的以ARM-CORTEX-M4 为内核的32 位
MCU。所谓32位指的是微处理器的字长,也就是数据总线和地址总线
的位数,这意味着K60有着相当强大的存储容量和数据吞吐能力。如
果把XS128比作公交车,那么K60就是一款豪华跑车,但是跑车也会
抛锚,巴士未必不能狂奔,最终的关键还是驾驭车辆的人。
开发一款芯片,有几样东西是必备的:IDE(程序编译器)、程序
烧写器、最小系统板、英文原版数据手册和示例程序。关于IDE,目
前主流的编译器是IAR,CW实在是太卡了,也有人用Keil4,推荐使
用大众化产品,有问题方便交流。下载器有JTAG和JLINK两种,二
者各有优劣,JTAG烧写程序比较稳定,但不具有在线的Watch(监视
变量)功能,只能断点调试,烧写flash后必须重新上电才能复位,
而且没有解锁功能(当然如果需要解锁那么你的片子很可能已经玩完
了);JLINK 固件易被冲掉(我用的次数不多从未遇到这种情况),但
具有在线Watch功能,烧写flash后可以通过外部按键复位,可以解
锁芯片(用过,但尝试了N次都没成功,估计是片子焊坏了……)。个
人感觉两种下载器差别不大,推荐使用JLINK用于调试程序JTAG用
于固化程序。最近新出一种BootLoader下载方式,据说使用的是串
口,貌似非常方便,有兴趣的可以尝试一下。关于最小系统板,淘宝
上一搜就有,龙邱、蓝宙、野火、拉普兰德,各种牌子大同小异(质
量差不多,价格都很贵!),笔者不会给任何一家商铺打广告,各位看
官如有需要可以自己去选购。当然,如果资金充足,建议购买大块的
开发板,外围电路比较完备,无需自己搭建,更加方便学习。接下来
是数据手册,这是开发芯片必备神器,一定要**看英文的(除非有
官方发布的完整中文版,很可惜没有!),几乎所有的硬件问题都可
以从手册中找到答案。不要盲目地购买以介绍芯片为内容的技术书
籍,这类书其实就是把厂家的数据手册翻译了一下,质量普遍较差,
我个人不建议购买!最后是示例程序,官方发布的驱动库实在是不敢
恭维,但网上有很多成熟的代码包,比如野火、拉普兰德推出的K60
驱动库,内容很全,代码质量也很高,可以直接拿来用,但编程的灵
活性会受到一定影响。我个人建议是先研究示例程序,寻找关键环节,
最后建立自己的驱动库,这样做有利于设计电路板时灵活配置引脚,
同时硬件操作有很强的时序性,谁先谁后是很有讲究的,使用自己的
驱动库,消除黑箱效应,方便寻找硬件驱动程序的Bug。
所谓的关键环节指的初始化程序中负责控制模块功能开启/关闭
和设置模块重要功能属性的代码。听起来比较拗口,举些例子说明一
下。模块功能的开启/关闭,比如我在程序中设置一个每1ms计时一
次的时钟,初始化完毕后,我首先令其失效(Disable),因为我需要一
个从外部输入的触发信号来作为开始计时的标志,只有当该信号出
现,对应的定时器模块才使能(Enable),与之比较类似的还有中断使
能/关闭和模块时钟使能/关闭的设置。重要功能属性设置,以PWM为
例,我们关心的指标主要有周期、占空比、初始极性、有效极性,以
此为目标寻找对应的代码,这样当程序中需要实时修改PWM属性时,
单独调用对应的语句即可。研究例程序时一定要把手册用起来,关键
语句中涉及的寄存器操作一定要仔细翻看手册,哪一位该怎么设置,
先后顺序,置位还是清零,不能有一点马虎!在这给自己打个广告,
建议大家先研究我写的驱动库,代码量很小,常用功能都有(AD还不
是很完善)。大家在读代码的时候一定要注意看注释,寻找关键环节,
对照手册,这样有的放矢可以缩短学习时间。最后再提示一下,手册
中有两块内容经常被使用,一个是259页的管脚功能表,另一个是264
页的引脚分布图。

使用特权

评论回复
47
偏爱番茄酱|  楼主 | 2014-12-13 21:23 | 只看该作者
GPIO (General purpose input/output):
K60引脚众多,几乎每个引脚都有复用功能。芯片上电复位之后,
大多数引脚处于Disable的状态,必须进行相关配置选择特定功能才
可使用。由于K60中绝大多数寄存器都是32位的,所以直接读写寄
存器很痛苦,道理很简单,要进行设置的往往只有那么几位,其他无
关位的值是绝对不能修改的,这样就很麻烦,既要修改目标值,又要
保持其他值不变。还好厂家早就考虑到了这一点,在飞思卡尔公司发
布的K60头文件—MK60N512VMD100.h中有大量的宏帮助开发人员完成这项繁琐的工作。举个例子说明一下,大家看这样一条语句
PORTC_PCR5=PORT_PCR_MUX(0x1); //PTC5的第1功能
使用鼠标右键的 go to definition 功能,一个一个搜索,首先是
PORTC_PCR5,可以看到:
#define PORTC_PCR5 PORT_PCR_REG(PORTC_BASE_PTR,5)
PORTC_PCR5 是一个宏,再次使用go to definition 功能,查看
PORT_PCR_REG,可以看到:
#define PORT_PCR_REG(base,index) ((base)->PCR[index])
这是一个带参数的宏,将参数替换可知PORTC_PCR5等同于:
PORTC_BASE_PTR->PCR[5],最终指向的是端口C(PORTC)第5引脚的
PCR 寄存器(PCR,PinControlRegister,引脚控制寄存器),这是一个
32 位的寄存器,负责选择引脚的复用功能。再看等号右侧的语句
PORT_PCR_MUX(0x1),这也是一个宏:
#define PORT_PCR_MUX(x)
(((uint32_t)(((uint32_t)(x))<<PORT_PCR_MUX_SHIFT))&PORT_PCR_MUX_MASK)
后面两个也是宏:
#define PORT_PCR_MUX_MASK 0x700u
#define PORT_PCR_MUX_SHIFT 8
将参数替换等效于(((uint32_t)(((uint32_t)(0x1))<<8))&0x700u)
其中0x700u中的u是unsigned的意思,和0x700等效,(uint32_t)
是强制类型转换,这样理顺一下,原先的语句就划归成这样:
PORTC_BASE_PTR->PCR[5]=
(((uint32_t)(((uint32_t)(0x1))<<8))&0x700u);
等号右侧的操作是这样的,先把0x1变成32位数据(因为寄存器是
32位的),左移8位之后再变成32位数据(此处是防止数据溢出的保
险措施), 最后和0x700 进行按位相与(按位与&和按位或|是实现单
独改写某位而不影响其他位的一种方法,至于为什么可以这样做 ,自
己算算吧!)。 这样一系列操作的结果就是把端口C第5引脚的PCR
寄存器的第8、9、10位改写成001,其他配置不变,大家注意看手
册:

K60 1.jpg (35.56 KB )

K60 1.jpg

使用特权

评论回复
48
偏爱番茄酱|  楼主 | 2014-12-13 21:24 | 只看该作者
PCR寄存器的8、9、10位就是负责设定引脚功能的MUX

k60 2.jpg (60.47 KB )

k60 2.jpg

使用特权

评论回复
49
偏爱番茄酱|  楼主 | 2014-12-13 21:26 | 只看该作者
上面的操作实现了引脚第1功能(GPIO)的选择。大家再看芯片的引脚
功能表:

K60 3.jpg (32.66 KB )

K60 3.jpg

使用特权

评论回复
50
偏爱番茄酱|  楼主 | 2014-12-13 21:26 | 只看该作者
从表中可以看到第1功能是PTC5,也就是最基本的输入输出功能。希望大家用心体会上面讲的方法,灵活使用go to definition功能,
戒骄戒躁,一句一句用心研究。读硬件程序是一件枯燥又有趣的事情,个中滋味深入其中才能有所体会。

使用特权

评论回复
51
偏爱番茄酱|  楼主 | 2014-12-13 21:29 | 只看该作者
言归正传,下面的讲解中将不会再对具体的语句进行解释,重点将放在模块关键属性的设置上,希望大家举一反三,自己研读例程序,
分析思考,汲取养分。
GPIO是所有MCU都具备的最基本功能。
关键点主要有:
选择引脚为GPIO功能;设置数据方向(输入或输出);初始状态
设置(对输入来讲是上/下拉电阻的选择,对输出来说是初始输出电
平)
这里要特别提醒初始状态的设置,尤其是当引脚作输入功能时,
悬空不定的状态对系统来说是非常危险的,很可能造成误动作! 另
外K60是3.3V器件,不能和5V器件直连,中间需要串联一个1K电
阻,也可以通过一个三极管实现电平匹配。所有的数字集成芯片都有
自己的电平标准,像74LS系列只支持5V供电,适用的电平范围就比
较小,74HC、74LVC、CD系列供电范围广,不同的供电电压对应不同
的高低电平范围,使用比较灵活,在3.3V供电系统中建议使用74HC
系列的数字芯片进行信号逻辑运算。
Interrupt:

使用特权

评论回复
52
偏爱番茄酱|  楼主 | 2014-12-13 21:29 | 只看该作者
在单片机应用中使用中断是家常便饭,一个优秀的程序员必须要
对中断的机理有非常清晰地认识,比如何时进栈,何时弹栈,保护现
场的内容,中断嵌套,仲裁机制等等问题。
使用中断要注意的关键问题:明确中断源,认清中断触发信号究
竟来自何处,是芯片内部产生(比如PIT)还是外部输入( Input
Capture);中断使能的控制,通常情况下,我们并不希望嵌套中断出
现(因为高优先级打断低优先级发生的时机不确定,正常时序可能会
被打乱),在进入中断服务函数后往往会关闭中断,程序执行完毕后
再打开,这样就保证了该中断服务程序在运行时不会被其他中断源干
扰;千万不能忘记清除中断标志位,否则程序跳出后会马上再次进入,
形成死锁;中断服务函数与中断源要一一对应。
在示例工程中有一个名为vectors.h的头文件,K60的中断向量
表就在里面。大家看这是其中的两个宏:
#define VECTOR_019  default_isr // 0x0000_004C 19 3 DMA DMA Channel 3 transfer complete
#define VECTOR_020  DMA_ISR   // 0x0000_0050  20 4  DMA DMA Channel 4 transfer complete
default_isr是默认的中断服务函数不干任何事,DMA_ISR是自定义
的中断服务函数,注释指明了中断源是DMA通道传输完成中断,中断
向量号是19、20,IRQ编号是3、4(注意中断向量号和IRQ编号不同!
系统内核的不可屏蔽中断没有IRQ编号),通过这个宏就可以建立中
断服务函数与中断源的一一对应关系。提醒一下,在vectors.h中要
声明DMA_ISR是外部函数,否则编译会报错!也就是在中断向量表之
前必须要有这句:
extern void DMA_ISR(void);
最后谈一下中断优先级的设置,K60共有16级可编程中断优先
级,通过寄存器NVICIPmn设置,mn是中断源的IRQ编号,注意不是
中断向量号!!例如:
NVICIP4=0x40; //一定要注意4是IRQ编 号 !!!!!!
NVICIPmn是16位寄存器,高四位设置优先级,低四位固定为0不可
修改,数值越小优先级越高。再联系一下之前的宏:
#define VECTOR_020  DMA_ISR   // 0x0000_0050  20 4  DMA  DMA Channel 4 transfer complete
这样就实现了设置中断源(DMA通道4传输完成中断)的优先级为4的
任务。

使用特权

评论回复
53
偏爱番茄酱|  楼主 | 2014-12-13 21:30 | 只看该作者
System Clock:
现在市面上卖的K60型号大多是MK60N512VMD100,其中VMD100
指的是系统内核最高频率。注意是内核Core不是总线Bus!!有什么
区别呢?我们来看一个例子:
int a=0;  int b=1; int c=2;   c=a+b;
系统运行频率的快慢决定c=a+b的运算速度,如何决定呢?系统执行
c=a+b这条语句总共要经历这样几个过程:从内存中将a和b读入到
CPU内部寄存器,在CPU内部执行加法运算,结果存储到另一个CPU
内部寄存器中,最后将计算结果从CPU内部寄存器写入到内存指定位
置(变量c的存储地址)。整个过程的第一步和最后一步是CPU通过总
线对外围设备的访问,只有第二步是在CPU内部完成的。因此内核频
率和总线频率均会影响系统运行速度,其中总线频率的影响所占的比
重更大,因为变量存储在RAM中,程序代码存储在ROM中,而RAM和
ROM都是挂载在总线上的设备。
对于智能车这种追求速度的系统来说,程序执行速率是极其重要
的,尤其是摄像头组,摄像机采集二维图像,数据量大,传输速度又
快,是典型的高速外设,传统的XS128很难与其直连(除非摄像机降
频使用),必须外接一级高速缓存器FIFO才能保证同步。
经过实际测试VMD100型号支持的最高频率是150M,这个150M
是总线频率所能达到的最高值,内核实际可以超频到200M以上。最
近市面上出现了VMD150型号,支持浮点运算,功能貌似更加强大(只
是猜测,本人没有用过).
最后说一下时钟频率初始化的代码,建议大家不要花时间研究,
太复杂又没多大意思,全都是些固定的流程也不具有什么通用性(不
同种类MCU时钟初始化过程差异比较大),所以大家直接用示例工程
中的时钟初始化代码即可(内核与总线频率均为150M),不要闲着没
事修改sysinit.c中的内容!VMD150会尽快开发,不日将与大家见
面,敬请期待!

使用特权

评论回复
54
偏爱番茄酱|  楼主 | 2014-12-13 21:30 | 只看该作者
PIT:
PIT(Periodic Interrupt Timer周期性中断定时器)实质是一个
每隔固定时间就会产生一次中断请求的定时装置,大多用于程序调度
和计时操作。PIT功能使用起来很简单,但想要用好非常困难。因为
但凡和时序有关的东西都必须十分谨慎,我们所编写的控制程序是严
格按照流程进行的,哪一步在前,哪一步在后,都是非常讲究的!关
于时序的问题涉及到连续控制系统的离散化,比较复杂,在此不一一
展开。关于PIT的使用,需要注意这样一个问题:定时周期到底是多
少?
为什么这么问呢?之前也说过,PIT多用于程序调度,很多人都
把系统的主体程序直接放到PIT中断服务函数内,这样就会产生一个
问题,如果自定义函数的运行耗时超过PIT中断周期怎么办?答案是
程序跳出PIT中断服务函数后又会马上进入(中断早已产生),其他函
数无法得到响应!这可是个严重的问题,不 但周期不准影响控制精度,
而且把其他函数也掐死了!因此不建议上述做法,我的习惯是使用
PIT更改标志位,在主函数main()内用标志位进行程序调度。当然,
把函数都放进PIT里也没有太大问题,但必须进行程序耗时测量,也
就是在PIT中断服务函数首部进行引脚电平的翻转操作,使用示波器
观察对应引脚的电压波形,其周期应该是PIT周期的2倍(高电平加
低电平算作一个完整周期)。

使用特权

评论回复
55
偏爱番茄酱|  楼主 | 2014-12-13 21:31 | 只看该作者
UART:
UART(Universal Asynchronous Receive Transmit 通用异步收
发)说白了就是串口通信,通常用于建立上位机(PC上的windows程
序)和下位机(单片机)之间的连接。串口是调试利器,尤其是对于K60
这类内核结构复杂、在线调试不太方便的高档MCU来说!寻找程序中
的逻辑错误需要对系统中的关键环节进行实时监视,此时就需要通过
串口将重要的变量发至PC端的上位机用于观测。在使用UART时要注
意这样几个问题:
通信波特率 当前市面上出售的串口转USB模块支持的最大波特
率一般是115200,因此不要使用串口进行大量数据的实时传送,比
如说一面跑车一面发图像,在这种情况下串口传输耗时过多,会使小
车的姿态控制发生严重滞后!
通信协议 串口一次只能传送8位有效数据,这8位数据怎么翻译
成信息是个很重要的问题。通信是双向的,上位机和下位机必须遵守
相同的协议。通常,大家使用的串口上位机程序是无法修改的,因为
代码不开源或者开了也看不懂(大神除外)。这种情况就导致我们必须
针对自己使用的上位机特点去编写具有特定功能的下位机通信程序。

使用特权

评论回复
56
偏爱番茄酱|  楼主 | 2014-12-13 21:32 | 只看该作者
举个例子:

k60 4.jpg (90.96 KB )

k60 4.jpg

使用特权

评论回复
57
偏爱番茄酱|  楼主 | 2014-12-13 21:32 | 只看该作者
这是我平时用的串口上位机,箭头所指的是显示格式选择和发送
格式选择,很明显,这款上位机支持文本和数值两种形式。8位二进
制数可以有256种组合,对应无符号整数就是0-255,所谓的文本格
式显示就是把接收到的0-255中的某个数字按照ASCII码表中的排列
关系打印对应的字符。比如我向上位机发送50,如果选择了文本格
式显示那么接收区就会显示字符“2”。数值形式就很简单了,下位机
发50上位机就显示50,但这种形式有很大的局限性,只能表示0-255
范围内的整数,负号、文字、小数点等等都无法使用。我个人的习惯
是把数值拆分成字符的组合然后按照先后顺序逐个发送,数值之间用
空格分隔,具体代码请参见示例工程Debug.c中的函数SendNum。

使用特权

评论回复
58
偏爱番茄酱|  楼主 | 2014-12-13 21:33 | 只看该作者
FTM:
FTM(Flexible Timer Module 灵活定时器模块)是K60所包含的
的定时计数模块的总称,之前介绍的PIT就是FTM的内容之一,其余
的还有FDB、PWM、RTC等等。在此主要介绍两个内容—PWM和正交解
码。
关于PWM实在是没有多少内容可讲,初始化完毕之后,在程序里
就只需要实时更改占空比。K60共有三个FTM单元,每个单元又有多
个通道,同一单元下的不同通道用作PWM输出时,频率相同占空比可
调。如果系统中有多个工作频率不同的器件,K60用起来就比较捉襟
了。

使用特权

评论回复
59
偏爱番茄酱|  楼主 | 2014-12-13 21:33 | 只看该作者
正交解码主要用于速度的鉴向和计数,测量原理在此不进行说
明。( 百度上多的是,自己查吧!)在使用正交解码功能时,一定要确
保两路输入都是正常的,因为解码计数依赖于两路输入具有固定的相
位差,如果某一路输入变成常态(常高或常低),计数寄存器的值会一
直保持不变!因此建议在接入信号前先用示波器观测一下编码器的两
路输出是否正常,确认无误后再进行连接。

使用特权

评论回复
60
偏爱番茄酱|  楼主 | 2014-12-13 21:34 | 只看该作者
DMA:
终于到压轴戏了,现在我们将隆重请出K60最强大的门客—DMA
功能。DMA(Direct Memory Access 直接存储器访问)是现代计算机的
重要特点,它实现了无CPU干预下的大量数据的高速存取。之前我们
分析过c=a+b这条语句的执行过程,现在我们再来分析一下这样几条
语句:
unsigned char input;
input=PORTA;
input是一个8位的无符号整型变量,PORTA是一个8位的IO端
口,数据方向是输入。input=PORTA;这条语句的功能是将A端口8个
引脚的输入信号存储到一个8位无符号整型变量中。先说明一点:变
量在内存(RAM)中开辟,有自己的存储地址,IO 端口也是挂载在总线
上的设备,也有自己的存储地址。上面语句的具体执行过程是这样的:
第一步CPU将IO端口中的内容读入到内部寄存器中,第二步将内部
寄存器中缓存的内容写入到内存的指定位置(变量input 的存储地
址)。可以明显地看到在有CPU介入的情况下,必须要通过其内部寄
存器进行中继才能实现变量读写,CPU 在此承担中转站的任务。DMA
功能省去了“中转”这一环节,利用地址直接定位不同变量,建立连
接。在DMA操作期间,DMA控制器取得总线控制权,直接将端口A的
输入内容写入到变量input中,完成传输后释放总线交由CPU继续控
制。这样一来,变量读写的时间缩短了将近一半(肯定是不到一半,
因为DMA控制过程也有自己的时间开销,当然和读写过程相比非常短
暂),这在需要高速传输大量数据的场合非常有用!一个最为典型的
应用就是采用K60 作为主控器的摄像头小车在读取图像时能够省去
FIFO这一级缓冲,直接从IO口读入。这对提升小车性能有着非常重
要的意义。硬件上,去掉FIFO,极大减轻了设计PCB时布局布线的
压力,中间环节的减少,使硬件结构更加简单,可靠性增强,同时由
于去除FIFO所节省出的板上空间还可以用来设置扩展模块,进一步
提高小车的综合性能。软件上,直接读取图像使帧率得以提高,原先
的XS128+FIFO系统最快只能达到60帧/秒,而K60系统可以稳定实
现100帧/秒!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则