K60硬件入门

所需积分/C币:11 2013-12-06 16:52:22 603KB PDF
6
收藏 收藏
举报

K60入门 硬件是我见过最好的 供大家参考的Kinetis M4内核系列 感谢网站这个平台
下。模块功能的开启/关闭,比如我在程序中设置一个每1ms计时 次的时钟,初始化完毕后,我首先令其火效( Disable),因为我需要 个从外部输入的触发信号来作为开始计时的标志,只有当该信号出 现,对应的定时器模块才使能( Enable),与之比较类似的还有中断使 能/关闭和模块时钟使能/关闭的设置。重要功能属性设置,以PWM为 例,我们关心的指标主要有周期、占空比、初始板性、有效板性,以 此为目标寻找对应的代码,这样当程序中需要实时修改PWM属性时, 单独调冂对应的语句即可。研究例程序时一定要把于册用起来,关键 珸句中涉及的寄器操作一定要仔细翻看手册,哪一位该怎么设置, 先后顺序,置位还是清零,不能有一点马虎!在这给自己打个广告, 建议大家先研究我写的驱动库,代码量很小,常用功能都有(AD还不 是很完善)。大家在读代码的时候一定要注意看注释,寻找关键环节, 对照亍册,这样有的放矢可以缩短学习时间。最后冉提示一下,于册 中有两块内容经常被使用,个是259页的管脚功能表,另一个是264 页的引脚分布图。 GPIO (General purpose inputoutput K60引脚众多,几乎每个引脚都有复用功能。芯片上电复位之后, 大多数引脚处于 Disable的状态,必须进行相关配置选择特定功能才 可使用。由于K60中绝大多数寄存器都是32位的,所以直接读写寄 存器很痛苦,道理很简单,要进行设置的往往只有那么几位,其他无 关位的值是绝对不能修改的,这样就很麻烦,既要修改目标值,又要 保持其他值不变。还好丿家早就考虑到∫这一点,在飞思卡尔公司发 布的K60头文件—MK60N512WMDl00.h中有大量的宏帮助开发人员完 成这项繁琐的工作。举个例子说明一下,大家看这样一条语句 PORTC PCR5= PORT PCR MUX(0x1);//PTC5的第1功能 使用鼠标右键的 go to definition功能,一个一个搜索,首先是 PORTC PCR5,可以看到: #define PORTC PCR5 PORT PCR REG (PORTC BASE PTR, 5) PORTO_PCR5是一个宏,再次使用 go to definition功能,查看 PORT PCR REG,可以看到 #define port PCR REG (base, index) ((base)->PCR[index]) 这是一个带参数的宏,将参数替换可知 PORTC PCR5等同于 PORTO_ BASE PTR->PCR[5],最终指向的是端凵C( PORTCy第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) 后面两个也是宏: tdefine port Pcr muX mask 0x700u +define port PCR muX shift 8 将参数替换等效于(((uint32t)((uint32t)(0x1)<<8)&0x700u) 其中0x700u中的u是 unsigned的意思,和0x700等效,(uint32t) 是强制类型转换,这样理顺一下,原先的语句就划归成这样 PORTC BASE PTR->PCRL5 ((uint32t)((uint32t)(0x1))<8))&0x700u) 等号右侧的操作是这样的,先把0x1变成32位数据(因为寄存器是 32位的),左移8位之后再变成32位数据(此处是防止数据溢出的保 险措施),最后和0x700进行按位相与(按位与&和按位或是实现单 独改写某位而不影响其他位的一种方法,至于为什么可以这样做,自 口算算吧!)。这样一系列操作的结果就是把端凵C第5引脚的PCR 寄存器的第8、9、10位改写成001,其他配置不变,大家注意看手 册 Addresses:4004_9000h base+Oh offset+(4d), where n=Od to 31d Bt31s029282726252423222120:918716151191211109765432 H 0 0 0 IROC MUX Rese0000000000050000000000000000000 PORTX PCRn field descriptions PCR寄存器的8、9、10位就是负责设定引脚功能的MX 108 Pin mux control MUX The corresponding pin is configured as follows 000 Pin Disabled(Analog) 001 Alternative 1(GPIO 010 Alternative 2(chip specific) 011 Alternative 3(chip specific) 100 Alternative 4(chip specific 101 Alternative 5(chip specific 110 Alternative 6(chip specific) 111 Alternative 7(chip specific /JTAG/NMI) 上面的操作实现了引脚第1功能(GPI0)的选择。大家再看芯片的引脚 功能表: Pinout ALTO 屺T1 ALT2 ALT3 ALTA ALT ALT ALT :09 A9 DISABLED 110 D8 DISABLED PTO ALTE B ADIC CIPO OU 从表中可以看到第1功能是PTC5,也就是最基木的输入输出功能 希望人家用心体会上面讲的方法,灵活使用 go to definition功能, 戒骄戒躁,一句一句用心研究。读硬件程序是一件枯燥又有趣的事情, 个中滋味深入其中才能有所体会。 言归正传,下面的讲解屮将不会再对具体的语勹进行解释,重点 将放在模块关键属性的设置上,希望大家举一反三,自己研读例程序, 分析思考,汝取养分 GPO是所有MCU都具备的最基本功能。关键点主要有: 选择引脚为GPI0功能;设置数据方向(输入或输岀);初始状态 设置(对输入来讲是上/下拉电阻的选择,对输出来说是初始输出电 这里要特别提醒初始状态的设置,尤其是当引脚作输入功能时, 悬空不定的状态对系统来说是非常危险的,很可能造成误动作!另 外K60是3.3V器件,不能和5V器件直连,中间需要串联一个1K电 阻,也可以通过一个三极管实现电平匹配。所有的数字集成芯片都有 自己的电平标准,像74LS系列以支持5V供电,适用的电平范围就比 较小,74HC、74VC、C系列供电沱围广,不同的供电电压对应不同 的高低电平范闱,使用比较灵活,在3.3V供电系统中建议使用74HC 系列的数字芯片进行信号逻辑运算 Interrupt 在单片机应用中使用中断是家常便饭,一个优秀的程序员必须要 对中断的机理有非常清晰地认识,比如何时进栈,何时弹栈,保护现 场的内容,中断嵌套,仲裁机制等等问题 使用中断要注意的关键问题:明确中断源,认清中断触发信号究 竟来自何处,是芯片内部产生(比如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,RQ编号是3、4(注意中向量号和IRQ编号不同! 系统内核的不可屏蔽中断没有IRQ编号),通过这个宏就可以建立中 断服务函数与屮断源的一一对应关系。提醒一下,在 vectors.h屮要 声明 DMA ISR是外部函数,否则编译会报错!也就是在中断向量表之 前必须要有这句 extern void DMA ISR(void) 最后谈一下中断优先级的设置,K60共有16级可编程中断优先 级,通过寄存器 NVICIPm设置,mn是中断源的IRQ编号,注意不是 中断向量号!!例如: NVICIP4=0x10;//一定要注意4是IRQ编号!!!! NVICIPmn是16位寄存器,高四位设置优先级,低四位固定为0不可 修改,数值越小优先级越髙。再联系一下之前的宏 #define VECTOR 020 DMA ISR //0x0000 0050 20 4 DMA DMA Channel 4 transfer complete 这样就实现了设置屮断源(DMA通道4传输完成中断)的优先级为4的 任务。 System clock 现在市面上卖的K60型号大多是MK60N512VMD100,其中VⅧ)100 指的是系统内核最高频率。注意是内核Core不是总线Bus!!有什么 区别呢?我们来看一个例子 int a=o: int b=1 int c=2: c-a 系统运行频率的快慢决定c-a+b的运算速度,如何决定呢?系统执行 C=a+b这条语句总共要经历这样几个过程:从内存中将a和b读入到 CPU内部寄存器,在CPU内部执行加法运算,结果存储到另一个CPU 内部寄存器中,最后将计算结果从CPU内部寄存器写入到内存指定位 置(变量c的存储地址)。整个过程的第一步和最后一步是CPU通过总 线对外围设备的访问,只有第二步是在CP内部完成的。因此内核频 率和总线频率均会影响系统运行速度,其中总线频率的影响所占的比 重更大,因为变量存储在RMM屮,程序代码存储在ROM屮,而RAM和 ROM都是挂载在总线上的设备。 对于智能车这种追求速度的系统来说,程序执行速率是极其重要 的,尤其是摄像头组,摄像机采集二维图像,数据量大,传输速度又 快,是典型的高速外设,传统的XS128很难与其直连(除非摄像机降 频使用),必须外接一级高速缓存器FIFO才能保证同步 经过实际测试wMD100型号支持的最高频率是150M,这个150M 是总线频率所能达到的最高值,内核实际可以超频到200M以上。最 近市面上出现∫VⅧ150型号,支持浮点运算,功能貌似吏加强大(以 是猜测,本人没有用过),志在国一的同志不防购入一款试试。 最后说一下时钟频率初始化的代码,建议大家不要花时间研究, 太复杂又没多大意思,全都是些固定的流程也不具有什么通用性(不 同种类MU时钟初始化过程差异比较大),所以大家直接用示例工程 中的时钟初始化代吗即可(内核与总线频率均为1501),不要闲着没 事修改 sysinit.c中的内容!WMWD150会尽快开发,不日将与大家见 面,敬请期待 PIT PIT( Periodic interrupt timer周期性中断定时器)实质是一个 每隔固定时间就会产生一次中断请求的定时装置,大多用于程序调度 和计时操作。PIT功能使用起来很简单,但想要用好非常困难。因为 但凡和时序冇关的东西都必须十分谨慎,我们所编写的控制程序是严 格按照流程进行的,哪一步在前,哪一步在后,都是非常讲究的!关 于时序的问题涉及到连续控制系统的离散化,比较复杂,在此不 展开。关于PIT的使用,需要注意这样一个问题:定时周期到底是多 少? 为什么这么问呢?之前也说过,PIT多用于程序调度,很多人都 把系统的主体程序直接放到PIT中断服务函数内,这样就会产生一个 问题,如果自定义函数的运行耗时超过PIT中断周期怎么办?答案是 程序跳出PIT屮断服务函数后又会马上进入(中断早已产生),其他函 数无法得到响应!这可是个严重的问题,不但周期不准影响控制精度, 而且把其他函数也掐死了!因此不建议上述做法,我的习惯是使用 PIT更改标志位,在主函数 main o内用标志位进行程序调度。当然, 把函数都放进PIT里也没有太大问题,但必须进行程序耗时测量,也 就是在PIT中断服务函数首部进行引脚电平的翻转操作,使用示波器 观察对应引脚的电压波形,其周期应该是PTT周期的2倍(高电平加 低电平算作一个完整周期) DART UART( Universal asynchronous Receive Transmit通用异步收 发)说白了就是串口通信,通常用于建立上位机(PC上的 windows程 序)和下位机(单片机)之间的连接。串口是调试利器,尤其是对于K60 这类内核结构复杂、在线调试不太方便的高档MCU来说!寻找程序中 的逻辑错误需要对系统中的关键环节进行实时监视,此时就需要通过 串口将重要的变量发至PC端的上位机用于观测。在使用UART时要注 意这样几个问题 通信波特率当前市面上出售的串口转USB模块支持的最大波特

...展开详情
试读 15P K60硬件入门
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
  • 分享小兵

    成功上传3个资源即可获取
关注 私信 TA的资源
上传资源赚积分or赚钱
    最新推荐
    K60硬件入门 11积分/C币 立即下载
    1/15
    K60硬件入门第1页
    K60硬件入门第2页
    K60硬件入门第3页

    试读结束, 可继续读2页

    11积分/C币 立即下载 >