电子说
01 前 言
在开发指南(一)中我们介绍了示例程序的整体框架,从本章开始将会对使用到的模块进行详细介绍。本章我们主要对按键中断的一种简单用法进行讲解,参考应用手册第6、7章节。
02 按键中断
因为外部中断和按键中断都被复用在GPIO上(KEY0~KEY6对应P00~P06),要优先设置GPIO为输入状态,而GPIO、外部中断和按键中断都属于外设功能,所以第一步还是先打开相应的外设时钟使能,接着初始化GPIO00~06的状态为输入上拉,然后进行按键中断配置初始化,最后打开按键中断使能,如下图1:
图1.按键中断配置初始化
按键中断初始化时,首先要写入正确的向量号,使能对应向量号的中断,然后根据应用需要配置中断优先级和优先级阈值。一般在程序中有多个中断使用时需要考虑中断优先级问题,在本示例程序SD93F115-JBS_TEST.zip中,中断优先级和阈值都设置为最高(因为我们是通过按键中断去选择需要执行的测试项,所以我们认为按键中断的优先级和阈值必须都是最高的),配置完成后便可打开按键中断使能,设置按键KEY0~KEY6作为按键输入。
按键中断基本配置完成后,就需要编写按键中断服务函数了。我们在lib的SD931X_it.c中找到按键中断对应的中断函数入口,编写按键中断服务函数(其他中断可在对应的中断函数中进行编写),如下图2:
图2.按键中断服务函数
进入按键中断服务函数,第一步先清除中断标志位,避免因忘记清除标志位导致系统反复进入中断(无论KEY0~6中的哪个按键触发的中断,都会置起KEYIF标志位);第二步是消抖,防止按键误触发(LCD显示会在后续章节进行说明);第三步便可通过读取GPIO0的输入数据寄存器GPIO0_IDR,去判断哪一个或哪几个按键处于按下状态(因为IO是被上拉的状态,所以在无按键按下时,寄存器结果应为0x7F,有按键按下时对应位为0)。
若寄存器结果与定义的键值Key0-Key6相同(见图3键值定义),则将对应测试项的标志位置1,其他测试项的标志位置0,否则程序直接退出中断。按键中断执行完成后,程序会跳出中断继续执行图4的while循环,而在循环中,我们通过不断监测各测试项的标志位是否置1来验证是否有按键按下,如此便可通过简单的按键操作进入不同测试项。
图3.键值定义
图4.while循环
03 开发问题简析
开发阶段使用按键中断或其他中断遇到最多的问题就是中断不响应,要重点关注外设时钟是否打开、中断使能是否打开、对应模拟功能是否开启以及中断标志位是否判断正确。
04 总 结
本文介绍了一种按键中断的简单用法,对按键中断的初始化和中断服务函数的编写的流程进行简单介绍。
示例程序:
SD93F115-JBS_TEST.zip
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !