STM32基础实验4(按键中断)

发布者:静默思考最新更新时间:2018-12-03 来源: eefocus关键字:STM32  基础实验  按键中断 手机看文章 扫描二维码
随时随地手机看文章

按键中断实验,实验2是按键查询


一、实验原理


1、按键使用查询和中断模式的 


对于按键使用查询和中断模式,查询模式是自己采用一段代码放在一个循环中,例如main函数中实时查询发现变位就去处理,而中断模式采用硬件方式查询变化状态然后做出相应。两者的区别一个是需要自己编写查询软件代码,一个是初始化时配置好中断模式,然后在中断中直接写你的处理代码即可。 


2、实现步骤 


①初始化 IO 口为输入(key.c中!)


void KEY_Init(void) //IO初始化

    GPIO_InitTypeDef GPIO_InitStructure;


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE时钟


    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4|GPIO_Pin_3;//KEY0-KEY1

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入

    GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE4,3


    //初始化 WK_UP-->GPIOA.0     下拉输入

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉     

    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0


}


②开 启 AFIO 时钟 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 

③设置 IO 口与中断线的映射关系。 

void GPIO_EXTILineConfig(); 

④初始化线上中断,设置触发条件等。 

EXTI_Init(); 

⑤配置中断分组NVIC,并使能中断。 

NVIC_Init(); 

⑥编写中断服务函数。 

EXTIx_IRQHandler(); 

⑦清除中断标志位 

EXTI_ClearITPendingBit();


二、实验代码


**exti.c**

#include "exti.h"

#include "led.h"

#include "key.h"

#include "delay.h"

#include "usart.h"

#include "beep.h"


void EXTIX_Init(void)

{


    EXTI_InitTypeDef EXTI_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;


    KEY_Init();  // 按键端口初始化


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟




   //GPIOE.3      中断线以及中断初始化配置 下降沿触发 //KEY1

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);

    EXTI_InitStructure.EXTI_Line=EXTI_Line3;

    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 

    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

    EXTI_Init(&EXTI_InitStructure);     //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器


   //GPIOE.4      中断线以及中断初始化配置  下降沿触发   //KEY0

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);

    EXTI_InitStructure.EXTI_Line=EXTI_Line4;

    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 

    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

    EXTI_Init(&EXTI_InitStructure);   //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器



   //GPIOA.0      中断线以及中断初始化配置 上升沿触发 PA0  WK_UP

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); 

    EXTI_InitStructure.EXTI_Line=EXTI_Line0;

    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;

    EXTI_Init(&EXTI_InitStructure);     //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器



    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;            //使能按键WK_UP所在的外部中断通道

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;    //抢占优先级2, 

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;                   //子优先级3

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                             //使能外部中断通道

    NVIC_Init(&NVIC_InitStructure); 


    NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;            //使能按键KEY1所在的外部中断通道

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;    //抢占优先级2 

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                   //子优先级1 

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                             //使能外部中断通道

    NVIC_Init(&NVIC_InitStructure);       //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器


    NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;            //使能按键KEY0所在的外部中断通道

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;    //抢占优先级2 

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;                   //子优先级0 

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                             //使能外部中断通道

    NVIC_Init(&NVIC_InitStructure);       //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器


}


//外部中断0服务程序 

void EXTI0_IRQHandler(void)

{

    delay_ms(10);//消抖

    if(WK_UP==1)         //WK_UP按键

    {                

        BEEP=!BEEP; 

    }

    EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位  

}



//外部中断3服务程序

void EXTI3_IRQHandler(void)

{

    delay_ms(10);//消抖

    if(KEY1==0)  //按键KEY1

    {                

        LED1=!LED1;

    }        

    EXTI_ClearITPendingBit(EXTI_Line3);  //清除LINE3上的中断标志位  

}


void EXTI4_IRQHandler(void)

{

    delay_ms(10);//消抖

    if(KEY0==0)  //按键KEY0

    {

        LED0=!LED0;

        LED1=!LED1; 

    }        

    EXTI_ClearITPendingBit(EXTI_Line4);  //清除LINE4上的中断标志位  

}


关键字:STM32  基础实验  按键中断 引用地址:STM32基础实验4(按键中断)

上一篇:STM32串行通讯采用中断方式发送,接收
下一篇:STM32基础实验3(串口通信)

推荐阅读最新更新时间:2024-03-16 16:19

STM32直流风机通过按键PWM调速同时各参数在LCD上显示
依然还记得当时学完STM32之后感觉什么都不会,然后基本上是靠单片机的知识撑过期末的测试的,然后其实一直想把STM32学好,但是感觉学太多也不好吧,总感觉这是样,学得多并不是坏事 ,但是总觉得吧,应该要在你学的技能中有一项是你非常突出的。 // //Design:直流电机调速,通过按键改变占空比以达到调速目的,同时显示各参数 //Author:Touch //Time :2017.6.5 // #include led.h #include delay.h #include sys.h #include usart.h #include lcd.h #include key.h #include pwm.h int main(v
[单片机]
STM32之CAN---配置波特率
1 位时间特性 为了掌握如何设置STM32 CAN的波特率,首先我们得先了解一下位时间特性。 位时间特性逻辑通过采样来监视串行的CAN总线,并且通过跟帧起始位的边沿进行同步,及通过跟后面的边沿进行重新同步,来调整其采样点。 它的操作可以简单解释为,如下所述把名义上的每位的时间分为3段: ● 同步段(SYNC_SEG):通常期望位的变化发生在该时间段内。其值固定为1个时间单元(1 x tCAN)。 ● 时间段1(BS1):定义采样点的位置。它包含CAN标准里的PROP_SEG和PHASE_SEG1。其值可以编程为1到16个时间单元,但也可以被自动延长,以补偿因为网络中不同节点的频率差异所造成的相位的正向漂移。 ● 时间段2(BS2)
[单片机]
<font color='red'>STM32</font>之CAN---配置波特率
基于STM32与机智云的智能蜡疗机
摘要: 随着物理疗法在慢病治疗中的效果获得认可, 传统的石蜡疗法被广泛应用在医院的理疗科。目前, 蜡疗机的制蜡方法虽已趋于成熟, 但仍存在制蜡效率低下、功耗大、不够智能等问题, 因此有必要对蜡疗机的制蜡效率及智能化程度进行研究。以STM32微控制器为核心, 结合G510通信模块, 对蜡疗机的硬件系统进行优化设计;通过机智云物联网开发技术, 对蜡疗机进行控制和通信。 试验结果表明, 与现有产品相比, 该系统减少了制蜡时间、降低了蜡疗机的功耗, 实现了蜡疗机的物联网控制。该研究为进一步完善蜡疗机的功效提供了设备基础, 对蜡疗机的广泛应用具有积极促进作用, 对今后利用石蜡疗法进行理疗大数据的挖掘与应用具有重要意义。 0 引言 经
[单片机]
基于<font color='red'>STM32</font>与机智云的智能蜡疗机
STM32为例,介绍单片机中的BOR/POR/PDR
STM32内部自带了一个可编程电压检测器(PVD),对VDD的电压进行监控可以通过电源控制寄存器PLS 位来设置监控电压的阀值,这样通过与VDD电压比较达到了监控电压的目的。 电源控制状态寄存器(PWR_CSR)中的PVDO用来表明VDD是高于还是低于PVD的电压阀值。当VDD下降到PVD阀值以下或VDD上升到PVD阀值之上时,通过外部中断16线上升或下降边沿触发设置,产生PVD中断。在中断处理函数中做相应的保护措施。 具体由以下图片和表格所示。 图1:阀值与PVD输出关系 表:具体寄存器参数 下面对上面的图片和表格中的数据做一个简要的解释: (1) PVD = Programmable Votage Detec
[单片机]
STM32 USB DFU固件升级必读
升级代码工程须知 建立好工程后,需要做以下几步处理: 1、首先点击编译器的”Target Option” ,然后选择Target选项,设置”Read/Only Memory Areas”域的on-chip下的IROM1,修改下载起始地址及大小。我们这里使用0x0800500地址: 2、接下需要在程序的开始重映射下中断向量表到我们开始的代码出,即在main()函数一开始添加:NVIC_SetVectorTable(0x08005000, 0x0);这句话。 DFU File Maneger使用说明 下面要制作升级文件。点击DFU File Manager软件,就会出现下面的界面: 我们选择第一个:I wan
[单片机]
<font color='red'>STM32</font> USB DFU固件升级必读
stm32专题六:中断 NVIC
stm32的中断分为 1.抢占优先级。 2.子优先级。 1.抢占优先级。抢占优先级高的中断,可以打断抢占优先级低的中断。 2.子优先级。抢占优先级相同的中断,子优先级高的可以优先执行。 其实,子优先级主要给出了一种响应的优先队列。假设中断的抢占优先级都相同。如果有多个相同抢占优先级的中断来了 ,那么他们不会互相打断,但是他们后续的排队会按照子优先级排队。也就是说,在第一个中断没有执行完的期间内,后续的最高级的子优先级是被安排到最高等待位处理的。 NVIC设置流程: 定义NVIC初始化结构体; 配置优先级分组; 往NVIC初始化结构体中填充,如中断源,抢占优先级,子优先级,使能等; 调用NVIC初始化函数; 编写
[单片机]
<font color='red'>stm32</font>专题六:<font color='red'>中断</font> NVIC
stm32使用tim3输出4路pwm(khz级)
tim3_pwm4.h /********************************************************* TIM3输出4路pwm,单独控制占空比 **********************************************************/ #ifndef _PWM_ #define _PWM_ #include stm32f10x.h #define CLOCK 72000 extern u16 arr; //预加载值 extern u16 psc; //分频值 /**************************************
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved