查看: 6673|回复: 11

[分享] 【FRDM-K64F试用】入门笔记之按键中断

[复制链接]
  • TA的每日心情
    擦汗
    2016-12-4 23:20
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    9

    主题

    573

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1785
    最后登录
    2017-3-3
    发表于 2015-11-18 21:08:11 | 显示全部楼层 |阅读模式
    本帖最后由 风子 于 2015-11-19 09:13 编辑

    距离写好第一个点灯程序已经过去一周多了,工作一直笔记忙,前天晚上才挤点时间出来继续研究一下K64开发板。

    我学习一个东西喜欢先把它用起来,有了直观的感觉,然后再去慢慢深入学习,所以拿到这块开发板也是如此,先用起来,再在实践中去学习原理层次的东西。用起来的最好方法之一就是先用别人做好的东西,跟第一个程序一样,继续参考KSDK_1.2.0\examples\frdmk64f\driver_examples\gpio这个例程,在上一篇帖子https://www.nxpic.org.cn/module/forum/thread-602538-1-1.html的工程基础上修改。在这个帖子中学会了如何配置gpio输出,成功点亮了LED灯,现在涉及到按键,中断,就要把gpio设置为输入,好在这种简单的东西不缺乏例子,于是仿照例子,配置板子上按键接的输入引脚,由于有了库的存在,这个工作变得简单,只需要填充一个数组,调用初始化函数就行了:

    1.     // Define gpio input pin config structure SW.
    2.     gpio_input_pin_user_config_t inputPin[] = {
    3.         {
    4.             .pinName                       = BOARD_SW_GPIO,
    5.             .config.isPullEnable           = true,
    6. #if FSL_FEATURE_PORT_HAS_PULL_SELECTION
    7.             .config.pullSelect             = kPortPullUp,
    8. #endif
    9. #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER
    10.             .config.isPassiveFilterEnabled = false,
    11. #endif
    12. #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER
    13.             .config.isDigitalFilterEnabled = false,
    14. #endif
    15.             .config.interrupt              = kPortIntFallingEdge,
    16.         },
    17.         {
    18.             .pinName                       = kGpioSW3,
    19.             .config.isPullEnable           = true,
    20. #if FSL_FEATURE_PORT_HAS_PULL_SELECTION
    21.             .config.pullSelect             = kPortPullUp,
    22. #endif
    23. #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER
    24.             .config.isPassiveFilterEnabled = false,
    25. #endif
    26. #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER
    27.             .config.isDigitalFilterEnabled = false,
    28. #endif
    29.             .config.interrupt              = kPortIntFallingEdge,
    30.         },
    31.         {
    32.             .pinName = GPIO_PINS_OUT_OF_RANGE,
    33.         }
    34.     };
    复制代码

    写好这个数组后,调用void GPIO_DRV_Init(const gpio_input_pin_user_config_t * inputPins,const gpio_output_pin_user_config_t * outputPins)这个函数就把数组中的引脚配置为中断输入引脚了。按键SW2连接PC6,按键SW3连接PA4.

          接下来要写中断函数,继续看例子,例子中写了按键SW2的中断函数,发现中断函数是void BOARD_SW_IRQ_HANDLER(void),这并不像是真正中断函数的命名,在board.h文件中有这么一个宏定义:#define BOARD_SW_IRQ_HANDLER        PORTC_IRQHandler
    看来真正的中断函数名应该是 PORTC_IRQHandler,那按键SW3连接PA4,猜想中断函数名应该就是PORTA_IRQHandler,,

    当然不能靠瞎猜,查看starup_MK64F12.s文件,可以看到所有中断函数的函数名:

    QQ截图20151118211312.png

    看来我还是没有猜错(这里外部中断的结构和ST不一样,区别挺大的)
    找到了函数名,再写具体代码,还是先看例子: QQ截图20151118211514.png

    代码只有三句,请标志位,改变标志变量的值,开/关LED。这里有一个小小的BUG,就是进入中断函数后没有检查中断源,当然这在K64的开发板上运行不会有任何问题,因为板子上PORTC只接了一个按键,代码中也只配置了一个中断,如果在PORTC的多个引脚都需要使用中断,问题就来了,不管什么中断,都一股脑统一处理了,所以应该先检查中断源,自己写的代码把这里修改了一下:

    1. void PORTA_IRQHandler(void)
    2. {
    3.          if(GPIO_DRV_IsPinIntPending(kGpioSW3))
    4.             {
    5.             // Clear external interrupt flag.
    6.             GPIO_DRV_ClearPinIntFlag(kGpioSW3);
    7.             // Toggle LED1.
    8.             GPIO_DRV_TogglePinOutput(kGpioLED2);
    9.             }
    10.         /*         if(GPIO_DRV_IsPinIntPending(kGpioxxxx)){}*/
    11. }
    复制代码

    进中断先检查中断源,再根据中断源进行处理,如果有多个中断的时候就可以将它们分开了。


    改好代码后就可以编译,下载运行,效果就是上电绿灯亮,按SW2绿灯灭,再按亮;按SW3红灯亮,再按灭。

    QQ截图20151118210032.png QQ截图20151118210100.png QQ截图20151118210122.png QQ截图20151118210140.png

    工程代码: FRDM-K64-KEYINT.rar (2.37 MB, 下载次数: 22)

    评分

    参与人数 1NXP金币 +15 收起 理由
    小七 + 15 打赏!

    查看全部评分

    回复

    使用道具 举报

    该用户从未签到

    4

    主题

    58

    帖子

    0

    注册会员

    Rank: 2

    积分
    135
    最后登录
    2016-3-4
    发表于 2015-11-18 21:38:16 | 显示全部楼层
    这个太好了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    58

    帖子

    0

    注册会员

    Rank: 2

    积分
    135
    最后登录
    2016-3-4
    发表于 2015-11-18 21:38:31 | 显示全部楼层
    这个太好了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2016-12-4 23:20
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    9

    主题

    573

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1785
    最后登录
    2017-3-3
     楼主| 发表于 2015-11-19 09:16:51 | 显示全部楼层
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    8

    主题

    569

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2119
    最后登录
    2018-2-1
    发表于 2015-11-19 09:43:20 | 显示全部楼层
    多谢分享~ FreeLogo.png
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-1-24 09:50
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    654

    主题

    3262

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    13211
    最后登录
    2019-1-27
    发表于 2015-11-19 09:57:33 | 显示全部楼层
    楼主加油!
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2016-12-4 23:20
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    9

    主题

    573

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1785
    最后登录
    2017-3-3
     楼主| 发表于 2015-11-19 10:07:28 | 显示全部楼层

    谢谢小七的赏金
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9

    主题

    642

    帖子

    0

    高级会员

    Rank: 4

    积分
    748
    最后登录
    1970-1-1
    发表于 2015-11-20 09:16:45 | 显示全部楼层
    又有新进步。加油
    104930kli5jsmlssemljli.png
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2016-12-4 23:20
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    9

    主题

    573

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1785
    最后登录
    2017-3-3
     楼主| 发表于 2015-11-20 09:35:43 | 显示全部楼层
    安臣 发表于 2015-11-20 09:16
    又有新进步。加油

    跟你比进度慢很多啊
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9

    主题

    642

    帖子

    0

    高级会员

    Rank: 4

    积分
    748
    最后登录
    1970-1-1
    发表于 2015-11-21 08:52:33 | 显示全部楼层
    风子 发表于 2015-11-20 09:35
    跟你比进度慢很多啊

    错,你都中断了。我还没到这里
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-21 03:13 , Processed in 0.091687 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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