/**************************************************************************** * Copyright: (C)2018 Î人ÁèÔÆÎïÍøÖÇ¿ÆÊµÑéÊÒ www.iot-yun.com * Author: GuoWenxue 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); }