查看: 8288|回复: 20

[分享] 【YL-KL26Z试用】-音乐播放器

[复制链接]

该用户从未签到

24

主题

252

帖子

0

高级会员

Rank: 4

积分
504
最后登录
1970-1-1
发表于 2015-3-13 20:04:46 | 显示全部楼层 |阅读模式
本帖最后由 blacklili 于 2015-3-31 20:27 编辑

第1节 :板子到了
收到板子了,先研究大致电路,然后烧写第一个程序。

图1 收到啦

图1 收到啦

图1  俊俏的板子

第2节:GPIO调试---按键中断控制LED
1)准备
本实验是在例程Demo_KEY_GPIO的基础上进行调试。
编译器使用:Keil_V5
但该例程根本不是使用按键中断来控制LED,而是使用在for循环中不断查询按键状态。
为了使用按键中断,必须将按键对应的引脚(如图2)的中断开启,并且设置成为下降沿中断(由图2可知)。

图2 按键GPIO电路

图2 按键GPIO电路

图2 两个按键的GPIO对应

为了控制三个LED,需要熟悉LED控制电路,如图3所示,可见三个LED D5、D6、D7分别由GPIOB18、GPIOB19、GPIOD1控制,且当GPIO输出低电平时LED点亮,GPIO输出高电平时LED熄灭。

图3 LED电路

图3 LED电路

图3 三个LED控制电路

2)GPIO初始化配置
在进行GPIO初始化配置时,要注意在资料中的MKL_gpio.h文件里有几句宏定义处多了一个括号,导致使用时编译出错。如图4。但我比较好奇的是,为什么在这里的宏定义加了分号也没有报错呢?(我使用的是keil_v5),是这个编译器比较傻?求指导!!

图4 资料中的一处错误

图4 资料中的一处错误

图4 GPIO初始化配置宏定义有错误

修改好错误后,调用GPIO初始化函数,对两个按键的GPIO引脚进行初始化,代码如图5所示

图5 初始化配置代码

图5 初始化配置代码

图5 初始化代码

3)按键中断服务函数
写好GPIO配置了,那么会想到,我按一下按键,CPU怎么进行中断呢?中断向量表在哪里呢?中断服务函数在哪里呢?
看了一下例程中的文件,发现中断向量表在名为”starup_MKL25Z4.s"文件中,双击打开该文件,找到GPIO对应的中断位置,如图6所示。

图6 中断向量表

图6 中断向量表

图6 中断向量表

由此可知GPIOA和GPIOD的中断服务函数是什么了。但是函数在哪里执行呢?写在哪里合适呢?
为了便于管理,当然是写在GPIO的头文件和源文件中了。
所以,在MKL_gpio.h文件中对GPIOA、GPIOD的中断服务函数进行声明,如图7所示。

图7 GPIO口中断函数声明

图7 GPIO口中断函数声明

图7 GPIO中断函数声明
完成了声明,就轮到函数的定义了,在MKL_gpio.c文件中对两个中断服务函数进行定义,如图8所示:

图8 中断服务函数定义

图8 中断服务函数定义

图8 中断服务函数定义

4)主函数
    在main函数中的死循环中对LED D7进行不断翻转,如图9所示:

图9 main中死循环

图9 main中死循环

图9 主函数中死循环代码

5)调试
    将程序编译,没有错误,下载到开发板中,按一下复位按钮进行程序运行,上位机串口调试工具成功接收到了第一句"YL-KL25Z128 KEY Test start",LED D7也确实是在不断闪亮。
    但是!!!按动按键K3和K4,LED D5和D6根本没有反应。

6)问题出在哪里呢??
    分析代码,觉得不可能是程序写错了,那就很可能是MCU根本就”不知道“我按了按钮,在Debug模式下设置断点,发现程序根本就进不了中断服务函数中。由此确定了是中断根本没有产生。那么问题在哪里呢?
   想来想去,还是不知道。
   于是,我想到了UART模块肯定也使用了中断,既然UART可以正常工作,那我可以去看看它的中断是怎么写的,于是打开了MKL_uart.c文件,查看其中的代码。
  终于!!在uart0Init函数的最后两行发现了,原来中断需要使能和设置优先级,如图10:

图10 中断使能

图10 中断使能

图10 uart的中断使能和优先级设置

7) 修成正果
于是,在mian函数的GPIO初始化设置后面,加上了GPIOA口和GPIOD口中断的使能和优先级设置,如图11:

图11 中断使能和优先级设置

图11 中断使能和优先级设置

图11 按键的中断使能和优先级设置

8)调试结果
编译工程,下载到开发板进行运行,按动按键,发现LED终于受到按键的控制了,在上位机串口工具也受到了中断服务函数中的打印内容,如图12:

图12 串口工具

图12 串口工具

图12 串口调试工具接收到的内容

美中不足的是:按键没有消抖动.
9)按键消抖
为什么一次按键会促发多次中断?我想大家都知道,因为按键抖动。可能很多人都没有去观察按键输出的实际波形吧,这里我贴出来看看。跟大家想的也是一样的,如图13所示。可以看到按键GPIO输入波形确实发生了抖动,虽然抖动并不大,但是很显然KL26Z还是将其捕捉到了。

图13 按键输出波形

图13 按键输出波形

图13 按键GPIO波形

于是需要想办法消除抖动,就是说要求KL26Z在后面的下降沿不要产生中断。因为KL26Z是支持中断嵌套的,我们没法在硬件上消除抖动就只能在软件上想办法了。我的想法是:在第一个下降沿中断服务函数中将该按键的中断禁止掉,直到抖动消失后再开启。

所以对按键的中断服务函数进行了修改,如图14所示,进入中断服务函数先对中断进行禁止,然后清中断标志位、延迟6ms、判断GPIO是否为低(按键是否按下),如果成立则串口打印输出、翻转LED,最后再使能中断。

图14 中断服务函数修改后

图14 中断服务函数修改后

图14 对按键中断服务函数进行修改后

经过下载编译运行,发现每次按键真的没有多次中断问题了,如图15所示。

图15 按键消抖后输出

图15 按键消抖后输出

图15 进行按键软件消抖后串口输出

10)消抖分析?!
可能机智的小伙伴会问:延迟6ms???那会不会错过了中断?检测的时候GPIO电平已经变成高了怎么办?
我想说的是,一般的按键是不会的,除非是特别牛X的按键,机械反应很快的那种。为了证明我的说法,我将按键按下的波形进行了观察,图16为我进行快速按键得到的GPIO电平信号。由图16可知,快速按键动作产生的低电平状态居然超过了100ms。如果你不相信,可以试一试。个人认为这已经不是人的手部动作的快慢了,而是按键的物理因素。所以,我们在中断服务函数中延迟6ms,肯定不会错过按键动作的。

图16 按键波形

图16 按键波形

图16 按键波形

更机智的小伙伴可能会考虑另外一个问题:中断服务函数越快执行完越好,6ms太长了,我无法接受。It's ok,我将延迟改到了0.6ms,依然可以起到消抖的效果。

回复

使用道具 举报

该用户从未签到

24

主题

252

帖子

0

高级会员

Rank: 4

积分
504
最后登录
1970-1-1
 楼主| 发表于 2015-3-13 20:05:28 | 显示全部楼层
本帖最后由 blacklili 于 2015-3-13 20:38 编辑

本来打算使用Codewarrior编程,但是好像没有相应的下载方式。选择OPEN SDA无法识别到USB。
回复 支持 反对

使用道具 举报

  • TA的每日心情
    奋斗
    2023-9-17 19:57
  • 签到天数: 2310 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    107

    主题

    4270

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    10481
    最后登录
    2023-9-17
    发表于 2015-3-13 21:00:57 | 显示全部楼层
    opensda,支持MSD(U盘方式),或者直接用CMSIS-DAP仿真下载。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    24

    主题

    252

    帖子

    0

    高级会员

    Rank: 4

    积分
    504
    最后登录
    1970-1-1
     楼主| 发表于 2015-3-13 21:21:43 | 显示全部楼层
    shaoziyang 发表于 2015-3-13 21:00
    opensda,支持MSD(U盘方式),或者直接用CMSIS-DAP仿真下载。

    可以用OPEN SDA吗?我在codewarrior中选择OPEN SDA 时无法识别板子。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-11-9 09:28
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    9

    主题

    351

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1466
    最后登录
    1970-1-1
    发表于 2015-3-13 22:20:49 | 显示全部楼层
    好快,我的板子都还没有到呢
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-9-17 19:57
  • 签到天数: 2310 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    107

    主题

    4270

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    10481
    最后登录
    2023-9-17
    发表于 2015-3-14 10:41:57 | 显示全部楼层
    blacklili 发表于 2015-3-13 21:21
    可以用OPEN SDA吗?我在codewarrior中选择OPEN SDA 时无法识别板子。

    codeworrior好久没有用了,现在不是都用KDS吗?

    我是在keil中,选择CMSIS-DAP,仿真速度比PE快。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2016-11-24 10:19
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    50

    主题

    1028

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2870
    最后登录
    1970-1-1
    发表于 2015-3-14 11:17:55 | 显示全部楼层
    这么快,我的怎么还没到没呢
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    24

    主题

    252

    帖子

    0

    高级会员

    Rank: 4

    积分
    504
    最后登录
    1970-1-1
     楼主| 发表于 2015-3-14 18:31:39 | 显示全部楼层
    shaoziyang 发表于 2015-3-14 10:41
    codeworrior好久没有用了,现在不是都用KDS吗?

    我是在keil中,选择CMSIS-DAP,仿真速度比PE快。 ...

    恩,我也打算用KEIL了。不过以前一直都是用的codewarrior开发飞思卡尔。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    24

    主题

    252

    帖子

    0

    高级会员

    Rank: 4

    积分
    504
    最后登录
    1970-1-1
     楼主| 发表于 2015-3-14 18:31:59 | 显示全部楼层
    cxtarm 发表于 2015-3-14 11:17
    这么快,我的怎么还没到没呢

    随时关注七姐的发货状态。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    24

    主题

    252

    帖子

    0

    高级会员

    Rank: 4

    积分
    504
    最后登录
    1970-1-1
     楼主| 发表于 2015-3-14 18:33:05 | 显示全部楼层
    stary666 发表于 2015-3-14 12:53
    好资料,谢谢分享

    资料都在光盘里,不过论坛里七姐那个活动贴有链接可以下载。。。。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-19 05:16 , Processed in 0.103410 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表