6. Stm32f407 key中断方式示例

发布者:温柔心情最新更新时间:2022-07-27 来源: csdn关键字:Stm32f407  key  中断方式 手机看文章 扫描二维码
随时随地手机看文章

硬件平台:  stm32f407ve


软件平台:  win10 (OS Name:                   Microsoft Windows 10 Enterprise


                                  OS Version:                10.0.18363 N/A Build 18363)


             Keil5  5.26.2


             HAL库版本: 2.14.0(目前下载的最新的)


中断:这个概念一般有点难以理解,但是又是一个非常重要的功能,基本所有的单片机(或者说处理器)都有中断。可见中断的重要性。51单片机都有5个中断源,这是我接触到的最简单的中断系统了。


打个比方,还是手机的那个例子,上次我说的是查询方式,这次我们的手机有了铃声了。那你需要接听任何一个电话还需要一直盯着屏幕吗?那很明显,不需要了,只要把手机带在身边,你随时可以被铃声暂停手头的事情(可能你在吃饭,睡觉,打豆豆等待各种日常生活),来接听呼入的电话。暂停手头的事情,接听电话就对应着cpu的中断处理过程(实际过程比这个要复杂一些),暂停当前的程序,跳到中断处理程序处理事件,然后返回继续当前的工作(当然接完电话,你也会回来继续干手中的事情)。还有一个比较小的细节就是,当你接电话的时候,实际你会在大脑中记住你刚刚在干嘛,不然等一下你放下电话就不知道要继续干嘛了。这个细节对应cpu也是同样需要处理的,所以就会有中断跳转之前会有现场保护(主要是寄存器值得保存到栈里),一会中断处理完之后(将之前保存到栈里的值重新返回寄存器,这个部分比较底层,涉及到cpu在执行指令时会用到哪些寄存器及cpu怎么执行指令的理论部分,这个地方不了解的话,确实不太好理解)还能回来接着干活。


但是你要意识到一个问题,程序可以跳转,还能跳转回来,这个需要一些复杂的机制才能处理,绝对不是直接跳来跳去。


回到正题,我们处理这个按键中断,stm32f407支持的中断比较多,外部中断只是其中的中断一个小部分。外部中断是指外部引脚电平的变化引起的中断事件。Stm32f407ve有82个引脚,82个引脚都可以设置中断,但是最多只能设置16个中断。这个因为GPIOA1,GPIOB1....GPIOH1共用了一个外部中断,如果GPIOB1设置了中断,那么其他组的1脚就无法设置为中断方式了。


这个地方可以参考中文参考手册的部分,比较详细。


按键中断有利于改善cpu的效率,cpu不用一直查询按键的状态,等到有按键按下的时候,直接打断cpu的执行,做中断处理。所以cpu在其他时间就可以完成很多任务了。(所有中断有利于改善cpu对于输入事件的处理效率)。


中断优先级(stm32f4的中断一共有81个吧,这么多中断一起的话,不可能都是同一个优先级,某些中断肯定要有些优越感,优先级高,有些中断就会被冷落,不重要就优先级低。这里同样注意一个问题,不一定我们每个中断都要设置优先级,我们只需要设置我们需要使用的中断就可以了。),程序中我们暂不处理这个问题,大家有点印象,就是多个中断同时发生的时候,优先级高的,可以被优先处理,如果优先级相同,就选择最先监测到中断的那个开始执行中断处理。还有一个会涉及到抢占,比如一个优先级的中断正在处理,但是一个比这个优先级更高的中断发生了,那么系统会再次打断正在处理的中断程序,处理更高优先级的事件。当然如果时低优先级的中断发生了,那么是不会被打断的。按键这个地方我们的优先级一般会设置一样,另一个角度来讲,几个按键同时触发中断的可能性极低,其实也不需要把某个按键做更紧急的处理(至少在我的程序中不需要这么处理)。


好,说了这么多,还是写程序,改动会比较大。


1.Keil的组件要增加外部中断的部分。

增加以下代码

设置按键中断模式

设置按键中断处理函数

主函数中修改按键的初始化函数,修改主循环(这里什么都不做,空转)

 

#include

 

void led_init(void)

{

GPIO_InitTypeDef GPIO_Init;

 

//1.时钟使能

__HAL_RCC_GPIOE_CLK_ENABLE();

//2.端口设置

GPIO_Init.Mode = GPIO_MODE_OUTPUT_OD;  //输出开漏模式

GPIO_Init.Pin = GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;

GPIO_Init.Pull = GPIO_PULLUP;

GPIO_Init.Speed = GPIO_SPEED_FREQ_LOW;

// GPIO_Init.Alternate = ;  //GPIO的mode设置位复用功能的时候,才会配置复用功能

HAL_GPIO_Init(GPIOE, &GPIO_Init);

//3.点亮或熄灭灯

}


/*按键初始化*/

void key_init(void)

{

GPIO_InitTypeDef GPIO_Init;

 

//1.时钟使能,按键使用的时GPIOE

__HAL_RCC_GPIOE_CLK_ENABLE();

//2.端口设置

GPIO_Init.Mode = GPIO_MODE_INPUT;  //输入模式

GPIO_Init.Pin = GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12;   //设置的引脚

GPIO_Init.Pull = GPIO_NOPULL;      //上拉电阻可以有也可以没有,电路本身有上拉

// GPIO_Init.Speed = GPIO_SPEED_FREQ_LOW;    //这个是设置输出速度,输入模式可以不管

// GPIO_Init.Alternate = ;  //GPIO的mode设置位复用功能的时候,才会配置复用功能

HAL_GPIO_Init(GPIOE, &GPIO_Init);

}

 

/*按键中断方式初始化*/

void key_int_init(void)

{

GPIO_InitTypeDef GPIO_Init;

 

//1.时钟使能,按键使用的时GPIOE

__HAL_RCC_GPIOE_CLK_ENABLE();

//2.端口设置

GPIO_Init.Mode = GPIO_MODE_IT_FALLING;  //下降沿中断模式

GPIO_Init.Pin = GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12;   //设置的引脚

GPIO_Init.Pull = GPIO_NOPULL;      //上拉电阻可以有也可以没有,电路本身有上拉

 

HAL_GPIO_Init(GPIOE, &GPIO_Init);

 

 

NVIC_SetPriority(EXTI15_10_IRQn,0xA0);  //设置简单的中断优先级

NVIC_EnableIRQ(EXTI15_10_IRQn);  //外部中断,10-15共用一个外部中断

}

 

 

 

/*

按键测试程序,我的例子实现为,(这是最简单的方法)

    第一个按键按下的时候,第一个灯点亮

第二个按键按下的时候,第二个灯点亮

第三个按键按下的时候,第三个灯点亮

*/

 

int main(void)

{

int i;

GPIO_PinState pins;

HAL_Init();  //必须在第一个语句执行

led_init();

key_int_init();

while(1)

{

//什么事都不做,空转

 

}

}

 

 

void EXTI15_10_IRQHandler(void)

{

uint32_t ret;

EXTI_HandleTypeDef hexti;

int i;

uint32_t arr[3] = {EXTI_LINE_10,EXTI_LINE_11,EXTI_LINE_12};

uint32_t ledarr[3] = {GPIO_PIN_13,GPIO_PIN_14,GPIO_PIN_15};

for(i=0;i<3;i++)

{

hexti.Line = arr[i];       //哪一个外部中断线触发中断

ret = HAL_EXTI_GetPending(&hexti, EXTI_TRIGGER_FALLING);

if(ret)   

{

//中断处理比较简单,直接翻转led

HAL_GPIO_TogglePin(GPIOE, ledarr[i]);

//清中断标志

HAL_EXTI_ClearPending(&hexti, EXTI_TRIGGER_FALLING); //下降沿

}

}

}

 

 

void SysTick_Handler(void)

{

HAL_IncTick();

}


github的工程源码:


https://github.com/zhaozhi0810/stm32f407_hal_keil5

关键字:Stm32f407  key  中断方式 引用地址:6. Stm32f407 key中断方式示例

上一篇:7. Stm32f407 key外部中断
下一篇:5. Stm32f407 key查询方式示例

推荐阅读最新更新时间:2024-11-16 22:04

STM32F407 ADC DMA 采样实验
最近公司又做了一款407的样板,正好需要用到407的ADC功能,需要用PC.2来检测RFID芯片的射频电源功率,首先看了下407的数据手册 iframe id="iframe_0.45073829567991197" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22https://home.eeworld.com.cn/data/attachment/album/201410/08/181130bnnyxoy20j8qyame.jpg?_=5758081%22%20style=%22border:none;max-width:1440px%22%
[单片机]
<font color='red'>STM32F407</font> ADC DMA 采样实验
Digi-Key 推出《未来工厂》第 2 季视频系列
Digi-Key 推出《未来工厂》第 2 季视频系列 第 2 季探索工业 4.0 技术,包括 AI、边缘计算、连通性等 全球供应品类丰富、发货快速的现货电子元器件和自动化产品分销商 Digi-Key Electronics, 日前发布了《未来工厂》视频系列第 2 季中的第一集,该视频系列重点关注工厂和制造设施在自动化和控制方面的发展。 Digi Key 与 Siemens、Schneider Electric 及 Phoenix Contact 共同推出了《未来工厂》视频系列第 2 季。 该三集视频系列由 Siemens、Schneider Electric 和 Phoenix Contact 提供赞助,它
[物联网]
Digi-<font color='red'>Key</font> 推出《未来工厂》第 2 季视频系列
CubeMX Stm32F407 生成一定周期的占空比不同的方波 DMA + 定时器
先上图 如图 是我生成的一个波形 这个波形的占空比在连续的四个周期内分别是10%,20%,30%,40%, 并且按照这个顺序循环这里大致介绍一下实现的方式。 使用的软件是Cubemx(库函肯定也可以实现) 第一步是器件选型 这一部分不做介绍 用的是Stm32F407 第二是时钟配置 接下来是定时器配置 第三步就是生成代码了 这里 需要在生成的代码里面加上一行开始的代码。
[单片机]
CubeMX <font color='red'>Stm32F407</font> 生成一定周期的占空比不同的方波 DMA + 定时器
S3C2440-按键
[单片机]
S3C2440-按键
简易数字电压表+ADC0809+中断方式实现一路数据转换
1 实验现象 2 实验原理   ADC0809的工作过程:首先输入3位地址,并使ALE=1,将地址输入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动ADC转换,之后EOC输出信号变低,指示转换正在进行。直到ADC转换完成,EOC变为高电平,指示ADC转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。AD转换常用的软件控制方法有: (1)程序查询方式 首先由微处理器向A/D转换器发出启动信号,然后读入转换结束信号,查询转换是否结束,若结束则读取数据,否则继续查询,直到转换结束。该方法简
[单片机]
简易数字电压表+ADC0809+<font color='red'>中断</font><font color='red'>方式</font>实现一路数据转换
Digi-Key 公司扩展了与 Microsemi 的全球经销合作关系
美国明尼苏达州锡夫里弗福尔斯市 – Digi-Key 公司是一家知名电子元件经销商,被设计师们誉为业内最广泛的电子元件库,提供立即发货服务,近日扩展了与 Microsemi 公司的经销关系,业务合作覆盖可编程逻辑解决方案,具体包括该公司的 SmartFusion® 可定制系统单晶片 (cSoC) 产品、低功率现场可编程门阵列 (FPGA) 器件以及相关评估板系列。 “Digi-Key 很高兴能为我们庞大的全球客户群供应 Microsemi 全面的 cSoC 和 FPGA 解决方案组合,”Digi-Key 公司半导体部门副总裁 Mark Zack 说道,“Microsemi 具有创新的传统,它的可编程逻辑解决方案是最先进的。我们很
[半导体设计/制造]
基于STM32F407单片机开发了一种定心支片顺性测量系统
摘要: 针对传统的扬声器定心支片顺性测量仪线性范围判断不准确以及无法进行动态测量的问题,设计了一种定心支片顺性测量系统。该系统以STM32F407单片机为核心,硬件部分通过运动控制电路和数据采集电路实现了自动测量的功能,并使用低电压纹波的线性直流稳压电源使得采样结果更加准确。软件部分通过滑动均值滤波算法来减小输出误差,并采用了最小二乘法来提高拟合优度,最后通过线性逼近法来获得定心支片的线性范围。实验结果表明,该系统具有较高的分辨率,能准确获得定心支片的顺性曲线和线性范围。 0 引言 定心支片是扬声器的核心部件之一,它用于保证扬声器工作时,音圈在磁隙中处于正确的位置,并且保证音圈在振动过程中仅沿轴向作往复运动 。受到制作材料和设
[单片机]
基于<font color='red'>STM32F407</font>单片机开发了一种定心支片顺性测量系统
STM32F407 ADC时钟设置及采样频率设置
/************************************************* 在system_stm32f4xx.c中有如下定义: /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N / / / #define PLL_M 8 #define PLL_N 336 /* SYSCLK = PLL_VCO / PLL_P // #define PLL_P 2 /* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ /// #define PLL_Q
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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