外部中断实验

  1. 按KEY1按键后串口打印“KEY1  Start ”,控制LED0翻转;
  2. 按KEY2按键后串口打印“ KEY2  Start ” 1s后串口打印“KEY2  End”, 同时蜂鸣器鸣响一次;
  3. 按WK_UP按键后串口打印“WK_UP  Start ” LED3每隔1s翻转一次,翻转3次后串口打印“WK_UP  End”;
  4. 按KEY0按键后串口每隔1s打印“KEY0  Start ” “KEY0  End”一次,同时LED4闪烁一次,此现象共执行五次。
  5. 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 中完成相应程序的编写,并含有相关的初始化程序

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值