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

[复制链接]
 楼主| deviceplugs 发表于 2016-1-19 20:28 | 显示全部楼层 |阅读模式

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

我学习一个东西喜欢先把它用起来,有了直观的感觉,然后再去慢慢深入学习,所以拿到这块开发板也是如此,先用起来,再在实践中去学习原理层次的东西。用起来的最好方法之一就是先用别人做好的东西,跟第一个程序一样,继续参考KSDK_1.2.0\examples\frdmk64f\driver_examples\gpio这个例程在这个帖子中学会了如何配置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.
 楼主| deviceplugs 发表于 2016-1-19 20:29 | 显示全部楼层
接下来要写中断函数,继续看例子,例子中写了按键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文件,可以看到所有中断函数的函数名:

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

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


 楼主| deviceplugs 发表于 2016-1-19 20:30 | 显示全部楼层
  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红灯亮,再按灭。




E-Kaia 发表于 2016-1-21 20:34 | 显示全部楼层
deviceplugs 发表于 2016-1-19 20:30
进中断先检查中断源,再根据中断源进行处理,如果有多个中断的时候就可以将它们分开了。
改好代码后就可以 ...

中断里面也是只实现了led灯的翻转,很简单
64xiaodian 发表于 2016-1-22 22:53 | 显示全部楼层
正在学习,KL02系列,没头脑啊
fly928sky 发表于 2016-1-27 09:52 | 显示全部楼层
@wind~风 风子,你的笔记被搬过来了。。。。。
wind~风 发表于 2016-1-27 10:19 | 显示全部楼层
fly928sky 发表于 2016-1-27 09:52
@wind~风 风子,你的笔记被搬过来了。。。。。

我插,,这都有人搬,无语了
64xiaodian 发表于 2016-1-27 11:20 | 显示全部楼层
deviceplugs 发表于 2016-1-19 20:29
接下来要写中断函数,继续看例子,例子中写了按键SW2的中断函数,发现中断函数是void BOARD_SW_IRQ_HANDLE ...

这里的中断函数名都有库函数提供了,自己直接操作寄存器怎么写,楼主可否有研究?
fly928sky 发表于 2016-1-27 11:30 | 显示全部楼层
wind~风 发表于 2016-1-27 10:19
我插,,这都有人搬,无语了

我发现21上面很多帖子都是从nxpic上面直接搬过来的。。。。。
fly928sky 发表于 2016-1-27 11:31 | 显示全部楼层
wind~风 发表于 2016-1-27 10:19
我插,,这都有人搬,无语了

恭喜风子获奖。。。。
wind~风 发表于 2016-1-27 11:45 | 显示全部楼层
fly928sky 发表于 2016-1-27 11:30
我发现21上面很多帖子都是从nxpic上面直接搬过来的。。。。。

之前st也看到有人搬过
wind~风 发表于 2016-1-27 13:51 | 显示全部楼层
64xiaodian 发表于 2016-1-27 11:20
这里的中断函数名都有库函数提供了,自己直接操作寄存器怎么写,楼主可否有研究? ...

中断函数名是由启动文件提供的,寄存器写也得用这个名字
64xiaodian 发表于 2016-1-27 16:44 | 显示全部楼层
fly928sky 发表于 2016-1-27 11:31
恭喜风子获奖。。。。

互相学习,大家:lol
64xiaodian 发表于 2016-1-27 16:45 | 显示全部楼层
wind~风 发表于 2016-1-27 13:51
中断函数名是由启动文件提供的,寄存器写也得用这个名字

我看K60里的资料,貌似可以自己定义,不是太了解:lol
wind~风 发表于 2016-1-27 16:55 | 显示全部楼层
64xiaodian 发表于 2016-1-27 16:45
我看K60里的资料,貌似可以自己定义,不是太了解

可以自己定义,修改或者自己重写启动文件就行了,就是xx.s那个汇编文件
64xiaodian 发表于 2016-1-27 16:58 | 显示全部楼层
wind~风 发表于 2016-1-27 16:55
可以自己定义,修改或者自己重写启动文件就行了,就是xx.s那个汇编文件

哦。看来对中断的学习只能到这一步了:会配置中断、使能中断和调用中断函数:handshake
eternity1120 发表于 2016-2-4 16:19 | 显示全部楼层
顶一下
daladala 发表于 2016-2-4 17:09 | 显示全部楼层
Lz还在用SDK1.2啊,目前的SDK已经更新到2.0了,SDK 2.0相比于1.2和1.3把库和example代码合并起来了,编译速度大幅提高,lz可以到官网上 下载试试看。
daladala 发表于 2016-2-4 17:16 | 显示全部楼层
64xiaodian 发表于 2016-1-27 11:20
这里的中断函数名都有库函数提供了,自己直接操作寄存器怎么写,楼主可否有研究? ...

中断函数名是指定的,比如定时器PIT0的中断处理函数就是PIT0_IRQHandler。sdk里面有提供各模块的中断处理程序,在fsl_xxx_irq.c中,其中xxx是模块名。可以直接把fsl_xxx_irq.h include进来,也可以直接把中断函数放在主程序里。如果需要改名字,有些模块是提供安装callback的驱动的,可以安装callback函数。不过不知道你为什么需要更改函数名字。
64xiaodian 发表于 2016-2-15 13:25 | 显示全部楼层
daladala 发表于 2016-2-4 17:16
中断函数名是指定的,比如定时器PIT0的中断处理函数就是PIT0_IRQHandler。sdk里面有提供各模块的中断处理 ...

就是自己想搞清楚一点下面怎么写的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

135

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部