本帖最后由 FSL_TICS_A 于 2014-10-21 15:38 编辑
KBI键盘中断边沿触发模式注意
飞思卡尔Kinetis KE0x、KEA 系列MCU片上集成有KBI( Keyboard Interrupts )键盘中断模块。大家在使用KBI键盘中断的边沿触发模式时需要注意:在新的边沿触发中断前,所有该模块已使能的KBI引脚电平必须全都为触发前的电平状态。(比如KBI下降沿中断触发模式下,只要有一路引脚电平为低,则该模块已使能的其他KBI引脚发生下降沿将无法触发中断)这一点较KinetisK、L系列MCU的IO中断有很大的区别,所以在使用时需要注意。
问题起因:
这一点从参考手册MKE02Z64M20SF0RM的“33.5.1Edge-only sensitivity”章节也有提到(如图1),只是大家在使用了KinetisK、L系列IO中断之后,没有注意KE0x、KEA系列的KBI模块特点就把该模块当普通中端口使用导致的。
图1
KBI模块简介: 大家可以通过参考手册的”Figure 33-1. KBI blockdiagram”模块框图(如图2)了解KBI ( KeyboardInterrupts )键盘中断模块结构以及各寄存器位作用。
图2
KBI ( Keyboard Interrupts )键盘中断在应用时还会遇到开漏输出的信号(比如之前提到的霍尔传感器就有开漏输出,这就需要用户接上拉电阻后才能输出高电平)。对于这类需求,KBI模块的“33.5.3KBI Pullup Resistor”章节(如图3)有提到可以配置内部上拉电阻。
图3
测试程序: 飞思卡尔官网提供FRDM-KExx 驱动库: KEXX_DRIVERS_V1.2.1_DEVD,其KBI模块程序位于类似路径E:\KEXX_DRIVERS_V1.2.1_DEVD\kexx_drv_lib\build\iar\ke02\KBI_demo 原程序使能了两个KBI模块的引脚中断,但由于之前提到的KBI中断边沿触发模式引脚相互影响仅限于同一个KBI模块,所以注释掉KBI1模块的初始化及回调函数设置; 添加两句对于KBI0_P4引脚的配置,使之与KBI0_P0引脚同样下降沿触发、使能中断: sKBIConfig.sPin[4].bEdge= KBI_FALLING_EDGE_LOW_LEVEL; //Pin2J1 FRDM-KE02Z sKBIConfig.sPin[4].bEn = 1;
为了在IAR编译环境调试时方便观察正确的KBI配置,把主函数开头定义的sKBIConfig初始值全部清零。KBI_ConfigType sKBIConfig={0}; //clear sKBIConfig
测试方法:
为了测试我们需要先查看FRDM-KE02Z开发板原理图 FRDM-KE02Z_SCH,从原理图可知程序使能的KBI0_P0、KBI0_P4引脚分别引到了J2的Pin2、J1的Pin2位置。 首先测试两KBI引脚的中断功能正常:通过引线将KBI0_P0或KBI0_P4与J9 Pin12\14的GND导通,将能够分别触发KBI0中断并回调KBI0_Task函数。(引脚悬空时为高电平,与GND导通产生下降沿信号触发KBI中断)
PS:本帖可从 飞思卡尔MCU论坛 置顶帖 飞思卡尔Kinetis资料大本营 的 飞思卡尔论坛支持小组【经验分享】总汇 链接进入。
|