打印
[Kinetis]

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

[复制链接]
2361|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
deviceplugs|  楼主 | 2016-1-19 20:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

我学习一个东西喜欢先把它用起来,有了直观的感觉,然后再去慢慢深入学习,所以拿到这块开发板也是如此,先用起来,再在实践中去学习原理层次的东西。用起来的最好方法之一就是先用别人做好的东西,跟第一个程序一样,继续参考KSDK_1.2.0\examples\frdmk64f\driver_examples\gpio这个例程在这个帖子中学会了如何配置gpio输出,成功点亮了LED灯,现在涉及到按键,中断,就要把gpio设置为输入,好在这种简单的东西不缺乏例子,于是仿照例子,配置板子上按键接的输入引脚,由于有了库的存在,这个工作变得简单,只需要填充一个数组,调用初始化函数就行了:
// Define gpio input pin config structure SW.
    gpio_input_pin_user_config_t inputPin[] = {
        {
            .pinName                       = BOARD_SW_GPIO,
            .config.isPullEnable           = true,
#if FSL_FEATURE_PORT_HAS_PULL_SELECTION
            .config.pullSelect             = kPortPullUp,
#endif
#if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER
            .config.isPassiveFilterEnabled = false,
#endif
#if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER
            .config.isDigitalFilterEnabled = false,
#endif
            .config.interrupt              = kPortIntFallingEdge,
        },
        {
            .pinName                       = kGpioSW3,
            .config.isPullEnable           = true,
#if FSL_FEATURE_PORT_HAS_PULL_SELECTION
            .config.pullSelect             = kPortPullUp,
#endif
#if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER
            .config.isPassiveFilterEnabled = false,
#endif
#if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER
            .config.isDigitalFilterEnabled = false,
#endif
            .config.interrupt              = kPortIntFallingEdge,
        },
        {
            .pinName = GPIO_PINS_OUT_OF_RANGE,
        }
    };
写好这个数组后,调用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 | 只看该作者
void PORTA_IRQHandler(void)
{
         if(GPIO_DRV_IsPinIntPending(kGpioSW3))
            {
            // Clear external interrupt flag.
            GPIO_DRV_ClearPinIntFlag(kGpioSW3);
            // Toggle LED1.
            GPIO_DRV_TogglePinOutput(kGpioLED2);
            }
        /*         if(GPIO_DRV_IsPinIntPending(kGpioxxxx)){}*/
}

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


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




使用特权

评论回复
地板
E-Kaia| | 2016-1-21 20:34 | 只看该作者
deviceplugs 发表于 2016-1-19 20:30
进中断先检查中断源,再根据中断源进行处理,如果有多个中断的时候就可以将它们分开了。
改好代码后就可以 ...

中断里面也是只实现了led灯的翻转,很简单

使用特权

评论回复
5
64xiaodian| | 2016-1-22 22:53 | 只看该作者
正在学习,KL02系列,没头脑啊

使用特权

评论回复
6
fly928sky| | 2016-1-27 09:52 | 只看该作者
@wind~风 风子,你的笔记被搬过来了。。。。。

使用特权

评论回复
7
wind~风| | 2016-1-27 10:19 | 只看该作者
fly928sky 发表于 2016-1-27 09:52
@wind~风 风子,你的笔记被搬过来了。。。。。

我插,,这都有人搬,无语了

使用特权

评论回复
8
64xiaodian| | 2016-1-27 11:20 | 只看该作者
deviceplugs 发表于 2016-1-19 20:29
接下来要写中断函数,继续看例子,例子中写了按键SW2的中断函数,发现中断函数是void BOARD_SW_IRQ_HANDLE ...

这里的中断函数名都有库函数提供了,自己直接操作寄存器怎么写,楼主可否有研究?

使用特权

评论回复
9
fly928sky| | 2016-1-27 11:30 | 只看该作者
wind~风 发表于 2016-1-27 10:19
我插,,这都有人搬,无语了

我发现21上面很多帖子都是从nxpic上面直接搬过来的。。。。。

使用特权

评论回复
10
fly928sky| | 2016-1-27 11:31 | 只看该作者
wind~风 发表于 2016-1-27 10:19
我插,,这都有人搬,无语了

恭喜风子获奖。。。。

使用特权

评论回复
11
wind~风| | 2016-1-27 11:45 | 只看该作者
fly928sky 发表于 2016-1-27 11:30
我发现21上面很多帖子都是从nxpic上面直接搬过来的。。。。。

之前st也看到有人搬过

使用特权

评论回复
12
wind~风| | 2016-1-27 13:51 | 只看该作者
64xiaodian 发表于 2016-1-27 11:20
这里的中断函数名都有库函数提供了,自己直接操作寄存器怎么写,楼主可否有研究? ...

中断函数名是由启动文件提供的,寄存器写也得用这个名字

使用特权

评论回复
13
64xiaodian| | 2016-1-27 16:44 | 只看该作者
fly928sky 发表于 2016-1-27 11:31
恭喜风子获奖。。。。

互相学习,大家:lol

使用特权

评论回复
14
64xiaodian| | 2016-1-27 16:45 | 只看该作者
wind~风 发表于 2016-1-27 13:51
中断函数名是由启动文件提供的,寄存器写也得用这个名字

我看K60里的资料,貌似可以自己定义,不是太了解:lol

使用特权

评论回复
15
wind~风| | 2016-1-27 16:55 | 只看该作者
64xiaodian 发表于 2016-1-27 16:45
我看K60里的资料,貌似可以自己定义,不是太了解

可以自己定义,修改或者自己重写启动文件就行了,就是xx.s那个汇编文件

使用特权

评论回复
16
64xiaodian| | 2016-1-27 16:58 | 只看该作者
wind~风 发表于 2016-1-27 16:55
可以自己定义,修改或者自己重写启动文件就行了,就是xx.s那个汇编文件

哦。看来对中断的学习只能到这一步了:会配置中断、使能中断和调用中断函数:handshake

使用特权

评论回复
17
eternity1120| | 2016-2-4 16:19 | 只看该作者
顶一下

使用特权

评论回复
18
daladala| | 2016-2-4 17:09 | 只看该作者
Lz还在用SDK1.2啊,目前的SDK已经更新到2.0了,SDK 2.0相比于1.2和1.3把库和example代码合并起来了,编译速度大幅提高,lz可以到官网上 下载试试看。

使用特权

评论回复
19
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函数。不过不知道你为什么需要更改函数名字。

使用特权

评论回复
20
64xiaodian| | 2016-2-15 13:25 | 只看该作者
daladala 发表于 2016-2-4 17:16
中断函数名是指定的,比如定时器PIT0的中断处理函数就是PIT0_IRQHandler。sdk里面有提供各模块的中断处理 ...

就是自己想搞清楚一点下面怎么写的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

135

帖子

2

粉丝