/****************************************************************************
|
* Copyright: (C)2018 Î人ÁèÔÆÎïÍøÖÇ¿ÆÊµÑéÊÒ www.iot-yun.com
|
* Author: GuoWenxue<guowenxue@gmail.com> QQ: 281143292
|
* Description: ·Ü¶·STM32v5¿ª·¢°å °´¼üÖжϳõʼ»¯ºÍ´¦Àíº¯Êý
|
*
|
* ChangeLog:
|
* °æ±¾ºÅ ÈÕÆÚ ×÷Õß ËµÃ÷
|
* V1.0.0 2018.05.10 GuoWenxue ·¢²¼¸Ã°æ±¾
|
****************************************************************************/
|
|
#include "stm32f10x.h"
|
#include "stm32v5_led.h"
|
|
void init_key1_gpio_interrupt(void);
|
void init_key2_gpio_interrupt(void);
|
void init_key3_gpio_interrupt(void);
|
|
|
|
/* º¯Êý˵Ã÷: ÅäÖð´¼üµÄ GPIO¿Ú¡¢Ê±ÖÓºÍÖжÏ
|
* ²ÎÊý˵Ã÷: ÎÞ
|
* ·µ»ØÖµ: ÎÞ
|
*/
|
void init_keys_interrupt(void)
|
{
|
|
/* ʹÄÜGPIO PC×éµÄʱÖÓ */
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_AFIO, ENABLE);
|
|
init_key1_gpio_interrupt();
|
init_key2_gpio_interrupt();
|
init_key3_gpio_interrupt();
|
}
|
|
/* Ïû³ý°´¼ü¶¶¶¯ÑÓʱº¯Êý */
|
static __inline void key_dejitter_delay(void)
|
{
|
uint32_t times=6000;
|
while( times--) ;
|
}
|
|
/* Key1(PC5)µÄÖжϷþÎñ´¦Àí³ÌÐò, ÖжϲúÉúºó startup_stm32f10x_hd.s ÖеÄÖжÏÏòÁ¿±í»áÖ¸Ïò¸Ãº¯Êý */
|
void EXTI9_5_IRQHandler(void)
|
{
|
static uint8_t led1_status = OFF;
|
|
if(EXTI_GetITStatus(EXTI_Line5) != RESET)
|
{
|
/* ÑÓʱһ¶Îʱ¼ä²é¿´GPIOµÄ״̬£¬Èç¹û»¹ÊÇµÍµçÆ½ËµÃ÷ÊÇÓÐЧ°´¼ü */
|
key_dejitter_delay();
|
if( Bit_RESET == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5) )
|
{
|
led1_status ^= 1;
|
turn_led(LED1, led1_status);
|
}
|
EXTI_ClearITPendingBit(EXTI_Line5);
|
}
|
}
|
|
/* Key2(PC2)µÄÖжϷþÎñ´¦Àí³ÌÐò, ÖжϲúÉúºó startup_stm32f10x_hd.s ÖеÄÖжÏÏòÁ¿±í»áÖ¸Ïò¸Ãº¯Êý */
|
void EXTI2_IRQHandler(void)
|
{
|
static uint8_t led2_status = OFF;
|
|
if(EXTI_GetITStatus(EXTI_Line2) != RESET)
|
{
|
/* ÑÓʱһ¶Îʱ¼ä²é¿´GPIOµÄ״̬£¬Èç¹û»¹ÊÇµÍµçÆ½ËµÃ÷ÊÇÓÐЧ°´¼ü */
|
key_dejitter_delay();
|
if( Bit_RESET == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2) )
|
{
|
led2_status ^= 1;
|
turn_led(LED2, led2_status);
|
}
|
EXTI_ClearITPendingBit(EXTI_Line2);
|
}
|
}
|
|
/* Key3(PC3)µÄÖжϷþÎñ´¦Àí³ÌÐò, ÖжϲúÉúºó startup_stm32f10x_hd.s ÖеÄÖжÏÏòÁ¿±í»áÖ¸Ïò¸Ãº¯Êý */
|
void EXTI3_IRQHandler(void)
|
{
|
static uint8_t led3_status = OFF;
|
|
if(EXTI_GetITStatus(EXTI_Line3) != RESET)
|
{
|
/* ÑÓʱһ¶Îʱ¼ä²é¿´GPIOµÄ״̬£¬Èç¹û»¹ÊÇµÍµçÆ½ËµÃ÷ÊÇÓÐЧ°´¼ü */
|
key_dejitter_delay();
|
if( Bit_RESET == GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3) )
|
{
|
led3_status ^= 1;
|
turn_led(LED3, led3_status);
|
}
|
EXTI_ClearITPendingBit(EXTI_Line3);
|
}
|
}
|
|
|
/* Key1 Á¬ÔÚ PC5ÉÏ, ½«PC5ÉèÖÃΪÖжÏϽµÑØ´¥·¢Ä£Ê½ */
|
void init_key1_gpio_interrupt(void)
|
{
|
GPIO_InitTypeDef GPIO_InitStructure;
|
EXTI_InitTypeDef EXTI_InitStructure;
|
NVIC_InitTypeDef NVIC_InitStructure;
|
|
/* ³õʼ»¯PC5ΪÄÚ²¿ÉÏÀÊäÈëģʽ, ÕâÑù°´¼üûÓа´ÏµÄʱºòΪ¸ßµçƽ, Èç¹û°´¼ü°´ÏÂʱ±à³ÌµÍµçƽ */
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
GPIO_Init(GPIOC, &GPIO_InitStructure);
|
|
/* ³õʼ»¯PC5ΪϽµÑØ´¥·¢ÖÐ¶Ï */
|
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource5);
|
EXTI_InitStructure.EXTI_Line = EXTI_Line5;
|
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
|
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
|
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
|
EXTI_Init(&EXTI_InitStructure);
|
|
/* ³õʼ»¯ÖжϵÄ×ÓÓÅÏȼ¶Îª 1 */
|
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
|
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
|
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
NVIC_Init(&NVIC_InitStructure);
|
}
|
|
/* Key2 Á¬ÔÚ PC2ÉÏ, ½«PC2ÉèÖÃΪÖжÏϽµÑØ´¥·¢Ä£Ê½ */
|
void init_key2_gpio_interrupt(void)
|
{
|
GPIO_InitTypeDef GPIO_InitStructure;
|
EXTI_InitTypeDef EXTI_InitStructure;
|
NVIC_InitTypeDef NVIC_InitStructure;
|
|
/* ³õʼ»¯PC2ΪÄÚ²¿ÉÏÀÊäÈëģʽ, ÕâÑù°´¼üûÓа´ÏµÄʱºòΪ¸ßµçƽ, Èç¹û°´¼ü°´ÏÂʱ±à³ÌµÍµçƽ */
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
GPIO_Init(GPIOC, &GPIO_InitStructure);
|
|
/* ³õʼ»¯PC5ΪϽµÑØ´¥·¢ÖÐ¶Ï */
|
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource2);
|
EXTI_InitStructure.EXTI_Line = EXTI_Line2;
|
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
|
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
|
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
|
EXTI_Init(&EXTI_InitStructure);
|
|
/* ³õʼ»¯ÖжÏÓÅÏȼ¶ */
|
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
|
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
|
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
NVIC_Init(&NVIC_InitStructure);
|
}
|
|
/* Key3 Á¬ÔÚ PC3ÉÏ, ½«PC3ÉèÖÃΪÖжÏϽµÑØ´¥·¢Ä£Ê½ */
|
void init_key3_gpio_interrupt(void)
|
{
|
GPIO_InitTypeDef GPIO_InitStructure;
|
EXTI_InitTypeDef EXTI_InitStructure;
|
NVIC_InitTypeDef NVIC_InitStructure;
|
|
/* ³õʼ»¯PC3ΪÄÚ²¿ÉÏÀÊäÈëģʽ, ÕâÑù°´¼üûÓа´ÏµÄʱºòΪ¸ßµçƽ, Èç¹û°´¼ü°´ÏÂʱ±à³ÌµÍµçƽ */
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
GPIO_Init(GPIOC, &GPIO_InitStructure);
|
|
/* ³õʼ»¯PC3ΪϽµÑØ´¥·¢ÖÐ¶Ï */
|
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource3);
|
EXTI_InitStructure.EXTI_Line = EXTI_Line3;
|
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
|
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
|
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
|
EXTI_Init(&EXTI_InitStructure);
|
|
/* ³õʼ»¯ÖжÏÓÅÏȼ¶ */
|
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
|
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
|
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
NVIC_Init(&NVIC_InitStructure);
|
}
|