OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3694|回复: 1

请问void KEY_Timer_Func(pTimer Timer)这种函数是什么意思?应该怎么写和怎么用呢?

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2017-8-19
在线时间
0 小时
发表于 2017-8-19 19:24:12 | 显示全部楼层 |阅读模式
1金钱
程序具体如下:
/*ÅäÖð′¼ügpioòy½ÅÎaía2¿ÖD¶Ï,*/
void EXTILine_Config(GPIO_TypeDef* GPIOx, uint16_t gpio_pin,uint32_t exti_line, uint8_t IRQChannel, uint32_t Level)
{       
        /* Enable GPIOE clock */
        //RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);

        /* Configure PE2/3/4 pin as input floating */
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
        if (Level)
        {
          GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        }
  else
        {
                GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        }               
        GPIO_InitStructure.GPIO_Pin = gpio_pin;
        GPIO_Init(GPIOx, &GPIO_InitStructure);
       
        /* Configure EXTI Line */
        EXTI_InitStructure.EXTI_Line = exti_line;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        if (Level)
        {
                EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  
        }
        else
        {
          EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;  
        }
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);

        /* Enable and set EXTI Line Interrupt*/
        NVIC_InitStructure.NVIC_IRQChannel = IRQChannel;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//ÇàÕ¼ê½óÅÏè¼¶
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;//Ö¸¶¨′óóÅÏè¼¶
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}


extern void blood_pressure_measurement_stop(void);





void KEY_Timer_Func(pTimer Timer)
{
       
        uint8_t res;

        pKeyData Data = (pKeyData)Timer->Data;         

        //é¨Ãè°′¼ü
        res=GPIO_ReadInputDataBit(Data->GPIOx, Data->GpioPin);
        if(res == Data->Level)
        {
                if (KeyStatus[Data->KeyId - 1] & 1)
                {
                        //printf("%s key Down\r\n", str[(Data->KeyId & 0xFF) - 1]);
                        EVENT_QueuePush(EVENT_KEYDOWN, (Data->KeyId & 0xFF), 0);
                        blood_pressure_measurement_stop();
                }
                else
                {
                        //printf("%s key Repeat\r\n", str[(Data->KeyId & 0xFF) - 1]);
                        EVENT_QueuePush(EVENT_KEYREPEAT, (Data->KeyId & 0xFF), 0);
                }
                KeyStatus[Data->KeyId - 1] &= ~1;
        }
        else
        {
                if (!(KeyStatus[Data->KeyId - 1] & 1))
                {
                        //printf("%s key Up\r\n", str[(Data->KeyId & 0xFF) - 1]);
                        EVENT_QueuePush(EVENT_KEYUP, (Data->KeyId & 0xFF), 0);
                        KeyStatus[Data->KeyId - 1] |= 1;
                }
        }
       

        //′ò¿aÖD¶Ï
        if (res != Data->Level)
        {
                //Data->KeyStatus |= 3;
                SYS_TimerSetDelFlag(Timer->ID, SYS_TIMER_REMOVE);
                NVIC_InitStructure.NVIC_IRQChannel = Data->IrqType;
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStructure);
        } else {
                SYS_TimerModify(Timer->ID, 200);
        }
                 
}

void EXTI0_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line0) != RESET)
        {               
                 
       
                        //½ûÖ1ÖD¶Ï
                        NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
                        NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
                        NVIC_Init(&NVIC_InitStructure);

                        //printf("\r\n EXTI2_IRQHandler\r\n");
                        SYS_TimerAdd(15, KEY_Timer_Func, SYS_TIMER_REPEAT, &KeyTimerData[4]);
                        SYS_TimerStart();
               

                /* Clear the EXTI line 2 pending bit */
                EXTI_ClearITPendingBit(EXTI_Line0);
        }
}


void EXTI2_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line2) != RESET)
        {               
                //if (SYS_Timer_Lock == SYS_TIMER_UNLOCK)
                {
                        //½ûÖ1ÖD¶Ï
                        NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
                        NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
                        NVIC_Init(&NVIC_InitStructure);

                        //printf("\r\n EXTI2_IRQHandler\r\n");
                        SYS_TimerAdd(15, KEY_Timer_Func, SYS_TIMER_REPEAT, &KeyTimerData[0]);
                        SYS_TimerStart();
                }

                /* Clear the EXTI line 2 pending bit */
                EXTI_ClearITPendingBit(EXTI_Line2);
        }
}

void EXTI3_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line3) != RESET)
        {
                //½ûÖ1ÖD¶Ï
                NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
                NVIC_Init(&NVIC_InitStructure);
               
                //printf("\r\n EXTI3_IRQHandler\r\n");
                SYS_TimerAdd(15, KEY_Timer_Func, SYS_TIMER_REPEAT, &KeyTimerData[1]);
                SYS_TimerStart();
               
                /* Clear the EXTI line 3 pending bit */
                EXTI_ClearITPendingBit(EXTI_Line3);
        }
}

void EXTI4_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line4) != RESET)
        {
                //½ûÖ1ÖD¶Ï
                NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
                NVIC_Init(&NVIC_InitStructure);;

                //printf("\r\n EXTI4_IRQHandler\r\n");
                SYS_TimerAdd(15, KEY_Timer_Func, SYS_TIMER_REPEAT, &KeyTimerData[2]);
                SYS_TimerStart();
               
                /* Clear the EXTI line 4 pending bit */
                EXTI_ClearITPendingBit(EXTI_Line4);
        }
}

void EXTI9_5_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line6) != RESET)
        {
                //½ûÖ1ÖD¶Ï
                NVIC_InitStructure.NVIC_IRQChannel = EXTI_Line6;
                NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
                NVIC_Init(&NVIC_InitStructure);;

                //printf("\r\n EXTI4_IRQHandler\r\n");
                SYS_TimerAdd(15, KEY_Timer_Func, SYS_TIMER_REPEAT, &KeyTimerData[3]);
                SYS_TimerStart();
               
                /* Clear the EXTI line 4 pending bit */
                EXTI_ClearITPendingBit(EXTI_Line6);
        }
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2017-8-23 01:06:15 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-18 05:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表