OSAL操作系统实验学习笔记05

来源:互联网 发布:adobe dw软件序列号 编辑:程序博客网 时间:2024/05/17 07:14

OSAL操作系统实验的按键实现
按键有两种工作模式:轮询(Poll)和中断(Interrupt)
轮询
按键处理函数是HalKeyPoll (void),这个函数会在HAL的事件处理Hal_ProcessEvent()中的HAL_KEY_EVENT事件处理过程中被调用,轮询周期由#define HAL_KEY_POLLING_VALUE 100这边定义,通过在配置函数中设置软件定时器osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT,HAL_KEY_POLLING_VALUE);来启动定时器,当溢出的时候向HAL发出HAL_KEY_EVENT事件。
在事件处理函数中会检查当前是否使能中断模式,如果使能的话就跳到中断模式操作,否则重新启动定时器,轮询时间按100ms算。
HalKeyPoll()函数中会调用按键回调函数,根据按键状态来处理按键信息。
中断
对应处理函数是 halProcessKeyInterrupt (void)会在对应管脚的中断处理函数中被调用。
根据配置函数的参数interruptEnable的情况来设置中断或者轮询。
中断处理函数如下:
按键中断处理函数:
当检查到有按键按下则会启动一个定时事件,定时长度有HAL_KEY_DEBOUNCE_VALUE定义。最终执行函数还是在HAL的事件处理函数中的HAL_KEY_EVENT中被执行。
清楚了这两个概念我们就来理一理按键实现的步骤:
1.首先是按键的驱动,驱动包括定义和初始化
定义:

#define HAL_KEY_SW_6_PORT   P0#define HAL_KEY_SW_6_BIT    BV(1)#define HAL_KEY_SW_6_SEL    P0SEL#define HAL_KEY_SW_6_DIR    P0DIR/* edge interrupt */#define HAL_KEY_SW_6_EDGEBIT  BV(0)#define HAL_KEY_SW_6_EDGE     HAL_KEY_RISING_EDGE//HAL_KEY_FALLING_EDGE`

初始化(io设置,中断设置和中断使能,中断处理程序):
GPIO设置:

HAL_KEY_SW_6_SEL &= ~(HAL_KEY_SW_6_BIT);    /* Set pin function to GPIO */  HAL_KEY_SW_6_DIR &= ~(HAL_KEY_SW_6_BIT);    /* Set pin direction to Input */

//函数是HalKeyInit()
中断设置和中断使能:
/* Rising/Falling edge configuratinn */
PICTL &= ~(HAL_KEY_SW_6_EDGEBIT); /* Clear the edge bit */
/* For falling edge, the bit must be set. */
#if (HAL_KEY_SW_6_EDGE == HAL_KEY_FALLING_EDGE)
PICTL |= HAL_KEY_SW_6_EDGEBIT;
#endif
/* Interrupt configuration:
* - Enable interrupt generation at the port
* - Enable CPU interrupt
* - Clear any pending interrupt
*/
HAL_KEY_SW_6_ICTL |= HAL_KEY_SW_6_ICTLBIT;
HAL_KEY_SW_6_IEN |= HAL_KEY_SW_6_IENBIT;
HAL_KEY_SW_6_PXIFG = ~(HAL_KEY_SW_6_BIT);

//函数是void HalKeyConfig ()
中断处理程序:
if (HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_BIT) /* Interrupt Flag has been set */
{
HAL_KEY_SW_6_PXIFG = ~(HAL_KEY_SW_6_BIT); /* Clear Interrupt Flag */

//由中断函数HAL_ISR_FUNCTION()进入中断处理函数void halProcessKeyInterrupt ()
备注:定义io和使能中断后,当按键按下的时候触发中断,进入中断处理程序 halProcessKeyInterrupt (),
经过HalKeyPoll ()找到按键按下的消息,执行回调函数SimpleBLETest_ProcessEvent ,回调函数执行我们的APP.
2.应用层按键使用
RegisterForKeys( SimpleBLETest_TaskID );//注册按键,这里一定要注册, 否则底层驱动就不会发送按键事件上来
simpleBLECentral_HandleKeys();//LCD显示按键状态.

0 0
原创粉丝点击