本帖最后由 风子 于 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设置为输入,好在这种简单的东西不缺乏例子,于是仿照例子,配置板子上按键接的输入引脚,由于有了库的存在,这个工作变得简单,只需要填充一个数组,调用初始化函数就行了: - // 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. 接下来要写中断函数,继续看例子,例子中写了按键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的多个引脚都需要使用中断,问题就来了,不管什么中断,都一股脑统一处理了,所以应该先检查中断源,自己写的代码把这里修改了一下: - 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红灯亮,再按灭。
工程代码:
FRDM-K64-KEYINT.rar
(2.37 MB, 下载次数: 22)
|