新手入门
- 积分
- 3
- 金钱
- 3
- 注册时间
- 2017-8-19
- 在线时间
- 0 小时
|
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);
}
}
|
|