STM32
直播中

赵辉

12年用户 847经验值
私信 关注
[问答]

请问按键中断key如何实现控制led灯?

请问按键中断key如何实现控制led灯?

回帖(1)

李婧

2021-11-17 10:52:11
1.软件及工程环境搭建

  

  2.按键key中断控制led灯

  


  • 了解一下中断处理过程

  中断处理过程:异常(中断)中断源–>允许中断–>申请中断–> CPU 响应–>保护现场(栈)–> 跳转处理–>返回.

  

  


  

  

  


  • 中断意义
    中断,程序事件中占着非常重要位置。如果没有中断,则CPU的工作效率会大打折扣。就像UART模块中,接收电脑发送来的数据,使用了while(){}查询状态的方式。如果电脑没有发送数据,则程序会一直阻塞,使CPU做不了其它事。如果有一种机制,不用CPU循环查询是否有数据到来,而是硬件自动接收数据,当收到数据时候自动通知CPU,这时候CPU再去把数据读出来。这样,在没有接收到数据前,CPU可以去做其他的事,工作效率自然就提高了。在CPU硬件中,通过中断这种机制来实现这个功能,每个片上外设硬件到提供一个中断信号,当模块处理特定工作状态时,会发生中断信号通讯CPU。
  • 添加一下中断的库函数

      

      

  • 看一下开发板原理图
    外部中断触发(中断)事件的方式:1.上升沿触发 2.下降沿触发 3.边沿触发

      

      

    上一天得到对应的按键对应KEY1->PA0,KEY2->PD2,KEY3->PC12,点击KEY1是为高电平,KEY2,KEY3分别是低电平。
    则高电平对于上升沿触发,低电平则下降沿触发
  • 选择外部中断线EXTI

      

      

    STM32F4xx中文参考手册.pdf得出key1的PA0对应EXTI0,key2的PD2对应EXTI2,key3的PC12对应EXTI12
  • 系统配置控制器 (SYSCFG)
    系统配置控制器主要用于管理对可执行代码的存储区域的地址重映射、选择以太网 PHY 接
    口以及管理 GPIO 的外部中断线连接。
    除非特别说明,否则本部分适用于整个 STM32F4xx 系列。
    如果不打开SYSCFG时钟,有关内存空间重映射、与EXTI配置的操作就会无效

先LED初始化,就不写了,第一天的有,不会的可以去看看,那就Exit_Init初始化


/*******************************************************
*函数名:Exit_Init
*功  能:中断初始化
*参  数:无
*返  回:无
*备  注:注意开启PA0,PD2的PC12的映射SYSCFG时钟 ,使能外部中断
********************************************************/
void Exit_Init(void)
{               
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);//开启SYSCFG时钟,简称重映射
                EXTI_InitTypeDef  Exit_Key1,Exit_Key2,Exit_Key3;//定义外部中断结构体变量       
//                //key1
                SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0); //映射到PA0引脚到EXTI
                Exit_Key1.EXTI_Line = EXTI_Line0; //选择EXTI0
                Exit_Key1.EXTI_Mode = EXTI_Mode_Interrupt; // 选择模式(中断)
                Exit_Key1.EXTI_Trigger = EXTI_Trigger_Rising;//选择上升沿触
                Exit_Key1.EXTI_LineCmd = ENABLE;//启用EXTI0
                EXTI_Init(&Exit_Key1);//写入EXTI初始化
                  NVIC_EnableIRQ(EXTI0_IRQn);//使能外部中断0线进行工作
                //key2
                SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD,EXTI_PinSource2); //映射到PD2引脚到EXTI2       
                Exit_Key2.EXTI_Line = EXTI_Line2; //选择EXTI2
                Exit_Key1.EXTI_Mode = EXTI_Mode_Interrupt; // 选择模式(中断)
                Exit_Key2.EXTI_Trigger = EXTI_Trigger_Falling;//选择下升沿触
                Exit_Key2.EXTI_LineCmd = ENABLE;启用EXTI2
                EXTI_Init(&Exit_Key2);//写入EXTI初始化
                  NVIC_EnableIRQ(EXTI2_IRQn);//使能外部中断2线进行工作
                //key3
                SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC,EXTI_PinSource12); //映射到PC12引脚到EXTI3       
                Exit_Key3.EXTI_Line = EXTI_Line12; //选择EXTI12
                Exit_Key3.EXTI_Mode = EXTI_Mode_Interrupt; // 选择模式(中断)
                Exit_Key3.EXTI_Trigger = EXTI_Trigger_Falling;//选择下升沿触
                Exit_Key3.EXTI_LineCmd = ENABLE;//启用EXTI3
                EXTI_Init(&Exit_Key3);//写入EXTI初始化
                  NVIC_EnableIRQ(EXTI15_10_IRQn);//由于没有EXTI12,所以使能外部中断15_10线进行工作               
}


(主要的来了来了,他来了)按键key中断点击控制led灯开和关
/*******************************************************
*函数名:EXTI0_IRQHandler
*功  能:按键一中断
*参  数:无
*返  回:无
*备  注:注意挂起寄存器(清0)
********************************************************/
int EXTI1_flag;


void EXTI0_IRQHandler(void)//由中断自动触发
{
                 
                EXTI_ClearFlag(EXTI_Line0); //挂起寄存器PA0
                EXTI1_flag++;
                if(EXTI1_flag%2)
                GPIO_ResetBits(GPIOC,GPIO_Pin_13);
                else
                GPIO_SetBits(GPIOC,GPIO_Pin_13);
}
/*******************************************************
*函数名:EXTI0_IRQHandler
*功  能:按键二中断
*参  数:无
*返  回:无
*备  注:注意挂起寄存器(清0)
********************************************************/
int EXTI2_flag;
void EXTI2_IRQHandler(void)//由中断自动触发
{
                EXTI_ClearFlag(EXTI_Line2); //挂起寄存器PD2
                EXTI2_flag++;
                if(EXTI2_flag%2)
                GPIO_ResetBits(GPIOC,GPIO_Pin_10);
                else
                GPIO_SetBits(GPIOC,GPIO_Pin_10);
               
}


/*******************************************************
*函数名:EXTI0_IRQHandler
*功  能:按键三中断
*参  数:无
*返  回:无
*备  注:注意挂起寄存器(清0)
********************************************************/
int EXTI3_flag;


void EXTI15_10_IRQHandler(void)
{
                        EXTI3_flag++;
                        if(EXTI3_flag%2)
                        GPIO_ResetBits(GPIOC,GPIO_Pin_11);
                        else
                        GPIO_SetBits(GPIOC,GPIO_Pin_11);
                        EXTI_ClearFlag(EXTI_Line12);  //挂起寄存器PC2
}


主函数调用相关的函数
LEDInit();//LED初始化
Exit_Init();//中断初始化
while(1)
        {
                        //是不是很激动,这里什么都不用写,哈哈
        }


    到此完美实现按键key中断点击控制led灯开和关,最后感谢大家阅读,如果需要其他相关资料请联系我
举报

更多回帖

发帖
×
20
完善资料,
赚取积分