- 按KEY1按键后串口打印“KEY1 Start ”,控制LED0翻转;
- 按KEY2按键后串口打印“ KEY2 Start ” 1s后串口打印“KEY2 End”, 同时蜂鸣器鸣响一次;
- 按WK_UP按键后串口打印“WK_UP Start ” LED3每隔1s翻转一次,翻转3次后串口打印“WK_UP End”;
- 按KEY0按键后串口每隔1s打印“KEY0 Start ” “KEY0 End”一次,同时LED4闪烁一次,此现象共执行五次。
- KEY2能够打断其他中断程序
有关抢占优先级的知识点
按键 | 端口 | 按键按下提供的电平 | 端口需要设置的电平 | 触发方式 |
WK_UP | PA0 | 高电平 | 低电平 | 上升沿触发 |
KEY0 | PC8 | 低电平 | 高电平 | 下降沿触发 |
KEY1 | PC9 | 低电平 | 高电平 | 下降沿触发 |
KEY2 | PD2 | 低电平 | 高电平 | 下降沿触发 |
//ÍⲿÖжϳõʼ»¯
void EXTI_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOA_CLK_ENABLE(); //¿ªÆôGPIOAʱÖÓ
__HAL_RCC_GPIOC_CLK_ENABLE(); //¿ªÆôGPIOCʱÖÓ
GPIO_Initure.Pin=GPIO_PIN_0; //PA0
GPIO_Initure.Mode=GPIO_MODE_IT_RISING; //ÉÏÉýÑØ´¥·¢
GPIO_Initure.Pull=GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_8|GPIO_PIN_9; //PC8¡¢PC9
GPIO_Initure.Mode=GPIO_MODE_IT_FALLING; //ϽµÑØ´¥·¢
GPIO_Initure.Pull=GPIO_PULLUP;
HAL_GPIO_Init(GPIOC,&GPIO_Initure);
GPIO_Initure.Pin=GPIO_PIN_2; //PD2
HAL_GPIO_Init(GPIOD,&GPIO_Initure);
//ÖжÏÏß0-PA0
HAL_NVIC_SetPriority(EXTI0_IRQn,2,2); //ÇÀÕ¼ÓÅÏȼ¶Îª2£¬×ÓÓÅÏȼ¶Îª2
HAL_NVIC_EnableIRQ(EXTI0_IRQn); //ʹÄÜÖжÏÏß0
//ÖжÏÏß8¡¢9-PC8¡¢9
HAL_NVIC_SetPriority(EXTI9_5_IRQn,2,1); //ÇÀÕ¼ÓÅÏȼ¶Îª2£¬×ÓÓÅÏȼ¶Îª1
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
//ÖжÏÏß2-PD2£¬key2
HAL_NVIC_SetPriority(EXTI2_IRQn,1,0); //ÇÀÕ¼ÓÅÏȼ¶Îª1£¬×ÓÓÅÏȼ¶Îª0
HAL_NVIC_EnableIRQ(EXTI2_IRQn); //ʹÄÜÖжÏÏß2,2Äܹ»´ò¶Ï±ðµÄ³ÌÐò£¬ÇÀÕ¼ÓÅÏȼ¶µ÷¸ß
}
//ÖжϷþÎñº¯Êý
void EXTI0_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); //µ÷ÓÃÖжϴ¦Àí¹«Óú¯Êý
}
void EXTI9_5_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8); //µ÷ÓÃÖжϴ¦Àí¹«Óú¯Êý
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_9); //µ÷ÓÃÖжϴ¦Àí¹«Óú¯Êý
}
void EXTI2_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2); //µ÷ÓÃÖжϴ¦Àí¹«Óú¯Êý
}
//ÖжϷþÎñ³ÌÐòÖÐÐèÒª×öµÄÊÂÇé
//ÔÚHAL¿âÖÐËùÓеÄÍⲿÖжϷþÎñº¯Êý¶¼»áµ÷Óô˺¯Êý
//GPIO_Pin:ÖжÏÒý½ÅºÅ
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
delay_ms(10); //Ïû¶¶
switch(GPIO_Pin)
{
case GPIO_PIN_0:
if(WK_UP==1)
{
printf("WK_UP Start\r\n");
for(int i=1;i<4;i++)
{
LED3=!LED3; //LED3·×ª
delay_ms(1000);
}
printf("WK_UP End\r\n");
}
break;
case GPIO_PIN_8:
if(KEY0==0) //¿ØÖÆLED0·×ª
{
for(int i=1;i<6;i++)
{printf("KEY0 Start\r\n");
LED4=!LED4;
delay_ms(1000);
LED4=!LED4;
delay_ms(1000);
printf("KEY0 End\r\n");
}
}
break;
case GPIO_PIN_9:
if(KEY1==0)
{
printf("KEY 1 Start\r\n");
LED0=!LED0; //¿ØÖÆLED0·×ª
}
break;
case GPIO_PIN_2:
if(KEY2==0)
{
printf("KEY2 Start\r\n");
delay_ms(1000);
BEEP=!BEEP; //¿ØÖÆBEEP
delay_ms(500);
BEEP=!BEEP;
printf(" End\r\n");
}
}
}
在exit 中完成相应程序的编写,并含有相关的初始化程序