完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
|
|
从零开始玩转FRDM-KL25Z(有演示视频)
|
|
|
|
|
|
代码编译成功后,连接FRDM-KL25Z开发板进行调试,可观察到板子上的RGB LED每隔0.5秒变换颜色,同时会发送“Delay is successful!!”到PC机,可通过串口猎人工具观察到(如图37所示),而且为了让调试结果更加直观,也录制了一段视频供大家参考,并附上修改完成后的helloworld工程。 图37 串口猎人界面 视频链接: http://v.youku.com/v_show/id_XNTcyMzY1NzY0.html |
|
|
|
|
|
⑥ 中断使用方法
(一)预备知识 中断是用以提高计算机工作效率﹑增强计算机功能的一项重要技术。当中断事件发生时,CPU中止当前程序的执行,保存现场,转向执行中断服务程序。中断服务程序执行完毕后回到现场,回到断点处继续执行。 Kinetics的中断机制由嵌套向量中断控制器(NVIC)来管理,其主要的特点包括: (1)可嵌套中断支持,这点就不用细说了,几乎大多数内核都支持中断嵌套,但可能嵌套的级数有些不同; (2)向量中断支持,Cortex-M系列通过查询中断向量表找到相应的ISR(中断服务程序)入口,并跳转执行; (3)动态优先级调整,即支持软件运行时改变中断优先级,飞思卡尔的HCS12也支持这个功能; (4)中断延迟大大缩短,引入了一些新特性,例如咬尾中断,晚到中断; (5)中断可屏蔽,支持条件性屏蔽即只屏蔽优先级低于某个阈值的中断,当然也可以屏蔽全部中断了; Cortex-M核的NVIC最多支持200多个中断(包括系统异常16个和外部中断240个),只不过各大半导体厂商根据自家芯片的资源做了定制。其中前16个中断为系统中断,使用者主要关心的是IRQ中断(即外部中断,含外设资源),本文主要介绍飞思卡尔的Kinetis系列MCU,其中断特点介绍如下 (1)低中断延迟,从中断发生到进入中断服务程序最多12时钟周期; (2)最多120个中断,包含16个核中断和剩余的外部IRQ中断; (3)最多16个可编程优先级; (4)动态改变优先级; (5)可重定位向量表,通过写SCB_VTOR寄存器。 如果童鞋们想要对Kinetisc系列MCU的NVIC加深理解的话,可通过以下链接http://www.freescaleic.org/bbs/article_1280_551272.html阅读《飞思卡尔Kinetis芯片中NVIC模块的中断寄存器的介绍及其应用举例》博文。 |
|
|
|
|
|
(二)自己动手,丰衣足食
上篇我已经给童鞋们介绍了如何利用LPTMR模块实现闪烁灯工程,这次我将讲解如何利用LPTMR中断来实现同样的功能。 工程代码修改过程如下: i 添加组件: 由于本篇也是使用LPTMR模块,所以此步骤可参考上一篇。 ii配置组件: 在添加完组件后,就需要对所选组件配置相应的参数。由于这次是要使用LPTMR模块中断,所以参数配置要在上一篇的基础上增加中断设置如图38所示,在Interrupts参数列中,选择Interrupt request的值为Enabled,Interrupt priority的值为0(即优先级最高,当然童鞋们也可以根据自己的需要变更优先级),ISR name的值为Lptmr_isr(中断函数名称可以根据童鞋们的个人喜好设置哦),Timer interrupt的值为Enabled。 图38 LPTMR中断配置 iii 生成并编写代码: 在组件参数配置完成后,首先要生成已配置完成的组件代码,可在Components对话框中选中LPTMR组件,单击 便可生成代码(如上篇图36所示),但童鞋们一定要记住,PE生成的代码选择组件的模块功能参数和模块初始化等,所以要实现软件代码的具体功能还是需要我们自己去调用或者自己重新编写的。在本篇中,PE就不会生成相应的中断函数(Lptmr_isr),需要自己手动编写添加的。打开Processor Expert.c,在代码窗口中可以看到代码的内容,在其中做如下修改: |
|
|
|
|
|
① while(1)循环
注释掉原while(1)循环中所有的代码。 ② Lptmr_isr中断函数相关编写 (包括Lptmr_isr()和LPTMR_isr_inti()) void Lptmr_isr() { static int i=0; LPTMR_isr_inti(); switch(i) { case 0: Blue_LED_SetVal(Blue_LED_DeviceData); Green_LED_ClrVal(Green_LED_DeviceData); Red_LED_SetVal(Red_LED_DeviceData);i=1;break; case 1: Blue_LED_SetVal(Blue_LED_DeviceData); Green_LED_SetVal(Green_LED_DeviceData); Red_LED_ClrVal(Red_LED_DeviceData);i=2;break; case 2: Blue_LED_ClrVal(Blue_LED_DeviceData); Green_LED_SetVal(Green_LED_DeviceData); Red_LED_SetVal(Red_LED_DeviceData);i=0;break; default: break; } printf("nInterrupt is successful!!n"); } 其中LPTMR_isr_inti()函数代码为: void LPTMR_isr_inti(void) { LPTMR0_CSR = (uint32_t)(LPTMR0_CSR &= ~LPTMR_CSR_TEN_MASK); LPTMR0_CMR = LPTMR_CMR_COMPARE(1000); LPTMR0_CSR |= LPTMR_CSR_TEN_MASK; return; } ③ 代码修改完成后,别忘了重新编译工程。 代码编译成功后,就可连接FRDM-KL25Z开发板进行调试,可观察到板子上的RGB LED每隔1秒变换颜色,同时会发送“Interrupt is successful!!”到PC机,可通过串口猎人工具观察到(如图39所示),并附上修改完成后的Text工程。 图39 串口猎人界面 下一篇我打算向大伙演示如何应用PIT模块中断实现上述结果,童鞋们可以自己先尝试操作一下,碰到自己不熟悉的问题可以在论坛中提出,这样有利于大家相互交流和讨论,同时也利于童鞋们的快速入门哦,所以不要犹豫,赶快加入吧!! |
|
|
|
|
|
|
|
|
|
|
|
⑥ PIT使用浅谈
(一)预备知识 PIT是周期中断定时器(Periodic Interrupt Timer)的简称,由多个可以产生中断并能出发DMA通道的定时器组成。PIT定时器模块基本工作原理:开始工作时,首先从加载寄存器(PIT_LDVALn)中将初始值加载到PIT计数器(PIT_CVALn),当PIT计数器的值由初始值减少到0时,PIT的中断标志位TIF会置位。如果中断使能位TIE置位,则MCU响应PIT中断。如果想要改变计数初值并取消当前的定时周期、以新的定时值开始一个定时器周期,则必须首先停止PIT定时器。完成一个周期的计数后,PIT计数器会再次加载各自的起始值,进而循环下去。(叙述方式很官方啊,强烈建议大家去阅读英文版的参考手册,童鞋们不用担心自己的英文水平不够而看不懂,这玩意看着看着就习惯啊,相信我,坚持一段时间后,你就会发现自己阅读英文手册变得游刃有余,好的,闲话不说啊,咱们马上开始吧)。 (二)PIT工程建立介绍 i 添加组件:在开发环境界面的Components Library对话框选择Alphabetical选项卡,找到名为Inti_PIT的组件双击(如图40所示),即可将Inti_PIT组件添加到工程中,同时在Components对话框中也会出现Init_PIT组件。 图40 添加PIT组件 |
|
|
|
|
|
ii 配置组件:在添加完组件后,在Components对话框中单击PIT组件,会在开发环境的Component Inspector窗口打开其配置界面 ,在配置界面的Clock gate中,选择Enabled,至于Clock settings则不需要配置,PE已帮我们选择好啊,这时,童鞋们可以对比前面介绍过的LPTMR组件,会发现LPTMR组件在Clock settings选项中,有四个时钟源供我们选择,为什么两种Timer配置会有差异呢?建议大家可以自己查看先KL25Z的参考手册找找原因(算是卖个关子吧)。在本例程中只需用到一个PIT定时器,所以在Channels中,只针对Channel 0进行配置,参数配置如下:在Timer 0中,选择Enabled,由于希望每隔0.5s产生一个中断,所以KL25Timer 0 load value配置成1.2x107,同时要将Interrupt request和Timer Interrupt都设置成Enabled,中断函数名ISR Name设为 PIT_isr,设置完成后会发现PIT组件配置界面还是会有错误提示(如图41所示)。这是怎么回事呢?根据错误提示“Properties initializing the same (bits) must be set identically(如图42所示)”, 会发现问题出现在NVIC模块寄存器设置上(这个模块前面没有介绍过,而且参考手册对它的介绍也比较简单,但是童鞋们不用担心,我推荐童鞋们可以通过以下链接http://www.freescaleic.org/bbs/article_1280_551272.html,阅读论坛中一篇由飞思卡尔FAE发的专门介绍NVIC模块寄存器配置的帖子,要回帖感谢哦,哈哈),在KL25中,PIT0与PIT1的中断向量是一样的,这就要求在配置PIT中断应用时,需要将Channel 0和Channel 1的Interrupt request都设置为Enabled,这样组件配置就Ok啊。
[size=0.83em]Capture2.JPG (31.76 KB, 下载次数: 0) 下载附件 [color=rgb(153, 153, 153) !important]2013-8-8 13:53 上传 图41 配置LPTMR组件 图42 错误提示 |
|
|
|
|
|
iii 生成并编写代码
在组件参数配置完成后,首先要生成已配置完成的组件代码,可在Components对话框中选中PIT组件,单击 便可生成代码(可参考图36),接下来介绍如何在helloworld工程的基础上修改程序代码。 ① 在ProcessorExpert.c中添加PIT_isr函数。 PIT中断函数— void PIT_isr(void) void PIT0_isr(void) { unsigned int i; PIT_TFLG0 |= PIT_TFLG_TIF_MASK; if(i==0x01) { Blue_LED_SetVal(Blue_LED_DeviceData); Green_LED_SetVal(Green_LED_DeviceData); Red_LED_ClrVal(Red_LED_DeviceData); printf("Red Led is lighting!!!nn"); i=0; } else { Blue_LED_ClrVal(Blue_LED_DeviceData); Green_LED_SetVal(Green_LED_DeviceData); Red_LED_SetVal(Red_LED_DeviceData); printf("Blue Led is lighting!!!nn"); i=0x01; } } 函数功能:中断触发时,进入PIT_isr中断函数,在函数中判断i值为0或1,相应的点亮红色或蓝色的LED灯,同时会分别发送两组字符串到PC机。 |
|
|
|
|
|
② While(1)循环
将while(1)循环中的所有的代码注释掉 ③ 编码修改完成后,亲们,可别忘了重新编译一下哦。 iv 实验结果 代码编译成功后,就可以连接FRDM-KL25Z开发板进行调试啊,童鞋们会观察到板子上的RGB LED每隔0.5秒变换颜色,并且会分别发送 “Red Led is lighting!!!”或者“Blue Led is lighting!!!”到PC机,可通过串口猎人工具观察到(如图43所示)。 图43 串口猎人界面 PIT工程下载: PIT_test.rar (753.99 KB, 下载次数: 46) |
|
|
|
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
1906个成员聚集在这个小组
加入小组我的项目我做主,使用GN+Ninja来完成构建系统(VSCode开发RT106X)
36358 浏览 0 评论
NXP IMX8应用处理器快速入门必备:技巧、使用、设计指南
4395 浏览 0 评论
6050 浏览 1 评论
6763 浏览 0 评论
NXP i.MX6UL开发板(linux系统烧录+规格+硬件+模块移植)使用手册
4212 浏览 0 评论
619浏览 2评论
求助,S32G上Core M启动后如何让Core A在Flash指定位置加载uboot?
614浏览 2评论
ESP32-WROVER-IE + LAN8720以太网,GPIO0电压只有1.6v,无法正常进入spi flash boot模式如何解决?
605浏览 2评论
求分享适用于PN7160 Android的NFC工厂测试应用程序
694浏览 2评论
796浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 01:26 , Processed in 1.214411 second(s), Total 83, Slave 74 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号