7. 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(目前下载的最新的)


中断这个部分需要参考中文手册和权威指南。


这里我还是提一下NVIC这个东西,全称是Nested vectored interrupt controller,即嵌套向量中断控制器。这个器件是用来管理stm32所有中断的(在现实生活中,可以类比于电信运营商,运营商不给你电话的权限,那你的电话是打不出去的),NVIC不允许这个中断能触发中断,那么不管这个中断如何设置,或者怎样触发,都不会引起cpu的反应(中断响应)。


所以,我们的程序中必然要设置NVIC的部分,之后要设置的所有的中断,都应该注意这个NVIC的设置部分,NVIC设置比较简单,只有中断优先级和中断使能就可以。到底哪个中断先响应或者抢占其他中断这个也是NVIC的管理范畴。

Stm32f4中断的优先级比较特殊,它总共只能设置16级中断,数字越小,优先级越高。(arm芯片在设计的时候,是可以支持更多的优先级(128级或256级)的,但是更多的优先级意味着更复杂的中断优先级管理电路,更复杂的逻辑,更大的功耗,stm32在设计的时候做了取舍,而且基本上来讲,16个优先级中断还是能满足大部分的应用了)。


16级中断只需要4个位就可以满足,4个(二进制)位就能表示16个数,在设置优先级的部分就只需要设置中断优先级寄存器的高4位就可以了,低4位无效(为什么选高4位,可以参考权威指南手册,是st公司考虑程序兼容的问题)。


Stm32f4系列还可以把这个优先级分为抢占优先级和响应优先级,他们两个的总和还是16.


我的程序在HAL_init初始化了中断优先级的分配


这里有详细的说明,我们的程序设置的是16级抢占优先级。


NVIC_PRIORITYGROUP_0: 0 bits for preemption priority 没有抢占优先级


                      4 bits for subpriority       16级响应中断


NVIC_PRIORITYGROUP_1: 1 bits for preemption priority 2级抢占中断


                     3 bits for subpriority        8级响应中断


NVIC_PRIORITYGROUP_2: 2 bits for preemption priority 4级抢占中断


                      2 bits for subpriority       4级响应中断   


NVIC_PRIORITYGROUP_3: 3 bits for preemption priority 8级抢占中断


                     1 bits for subpriority        2级响应中断


NVIC_PRIORITYGROUP_4: 4 bits for preemption priority  16级抢占优先级


                     0 bits for subpriority        没有响应优先级


最后,就是中断处理函数


中断处理函数的原则:


在满足功能的情况下,应该越快越好,不得阻塞,不得调用获取信号量或者锁之类的引起阻塞的函数。

没有返回值,没有参数(这基本是所有中断函数的特点)。

尽量不使用printf函数,这个也是会引起阻塞的

要清除中断标志

 

我们的中断处理比较简单:


翻转led,因为按键是机械形变,所有会造成机械抖动,在电信号的部分产生抖动信号,所以实际按键的时候,并不是按一下,翻转一下led,有可能等保持不变,或者变化很多次。这都是电路抖动引起的,具体的话可以参考一下消抖部分(大部分都是延时处理,因为我觉得中断应尽量的快,就不使用别人的延时了,我也就不演示了哈,后期可以使用定时器去定时扫描按键的部分,讲到定时器的时候,我们说一下这个部分)。

github的工程源码:


https://github.com/zhaozhi0810/stm32f407_hal_keil5

关键字:Stm32f407  key  外部中断 引用地址:7. Stm32f407 key外部中断

上一篇:No ULINK2/ME Device found stm32f103 程序无法下载
下一篇:6. Stm32f407 key中断方式示例

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

STM32F103 GPIO的外部中断的使用例子
STM32的GPIO可以作为中断输入使用,这样增强了实时检测性,可以用于外部按键或是触控等使用。如果使用,其实不难,这里使用标准的固件库,加入外部中断的库文件: 在stm32f10x_conf.h 中,打开 #include stm32f10x_exti.h 这里通过外部触控的方式,点亮或是关闭一个LED灯的例子,熟悉一下STM32F103 系列外部中断的使用。 我这里使用的GPIO为:PC11,头文件的GPIO宏定义为: /**** EXTI Control ****/ void EXTI_GPIO_Init(void); #define RCC_TOUCHOUT RCC_APB2
[单片机]
基于NRF9E5射频无线遥控系统的设计
   摘 要 介绍了一种基于8051内核的无线射频传输芯片nRF9E5,采用该芯片制作了扑翼微型飞行器的遥控系统,对遥控系统的收发装置进行了硬件设计,并对设计出的硬件系统进行了软件编程和系统的调试,实验表明,该系统具有成本少、功耗低、尺寸小的特点,能以较高质量在100~150米范围内进行信号的无线传输。    关键词 扑翼微型飞行器 遥控系统 射频 nRF9E5    1 引 言   现在和未来的飞行机器人 设计方向是期望机器人是小巧的、手提的、随身携带,可以像昆虫一样超低空飞行,能够灵活地完成侦察和搜索任务。多年来以军事用途为背景的无人飞行器(UAV—Unmanned Aerial Vehicle)研究一直十分活跃
[模拟电子]
51单片机(AT89C52)外部中断程序
#include reg52.h #define uchar unsigned char #define uint unsigned int #define DELAY 1000 void delay(uint z) //1ms { uint x,y; for(x=z;x 0;x--) for(y=111;y 0;y--); } void main() { uchar i,dt; EA=1; //开总中断 EX1=1; //开外部中断1 // IT1=0; //设置外部中断1为低电平触发 IT1=1; //设置外部中断1为下降沿触发 while(1)
[单片机]
51单片机(AT89C52)<font color='red'>外部中断</font>程序
stm32f407之基本定时器TIM6&TIM7(操作寄存器)
基本定时器TIM6和TIM7包括一个由可编程分频器驱动的16位自动重载计数器。它可以用作普通的定时器,也可以用来驱动DAC。这两个定时器是完全独立的,不共享任何资源。更多时候是与DAC平配合使用。 作为定时器的配置步骤: 1.设置中断优先级分组(如果之前没有设置),这个最好一个程序里只在开头设置一次。 2.使能相关时钟。 3.设置分频。 4.清空计数器的值。 5.设置自动重装寄存器的值。 6.是否允许中断。 7.如果允许中断,设置中断优先级,使能中断。 8.使能计数器。 程序: /************************************ 标题:定时器TIM7
[单片机]
GPIOLED配置、key、中断NVIC配置
1 #include stm32f10x.h 2 #include stm32f10x_gpio.h 3 4 //内核,(NVIC) 5 #include misc.h 6 7 //点亮红色灯 PB5 8 //step1:使能 9 Rcc_APB2PeriPhClockCmd( 10 Rcc_APB2PeriPh_GPIOB,ENABLE); 11 //step2:定义GPIO初始化结构体变量 12 GPIO_InitTypeDef a; 13 a.GPIO_Speed = GPIO_Speed_50MHz; 14 a.GPIO_Pin = GPIO_Pin_5; 15 //推挽输出 16 a.GPIO_Mode
[单片机]
STM32F407开发板红外线解码功能应用案例
【1】NEC红外线协议介绍 NEC红外线协议是一种常用的红外线通信协议,广泛应用于消费电子产品中,如电视、DVD播放器、空调遥控器等。该协议定义了红外线通信的物理层和数据链路层规范,以实现可靠的红外线数据传输。 下面是NEC红外线协议的详细介绍: (1)载波频率:NEC红外线协议使用的载波频率为38kHz。发送方通过以38kHz频率调制红外线光信号,接收方则通过解调来接收数据。 (2)数据编码:NEC红外线协议使用脉冲宽度编码(Pulse Width Encoding)来表示二进制数据。每个数据位由一系列的脉冲组成,逻辑0和逻辑1分别由不同的脉冲宽度表示。 逻辑0:发送方发射一个530μs的载波后,延迟时间为530μs。
[单片机]
<font color='red'>STM32F407</font>开发板红外线解码功能应用案例
补充:51单片机学习之外部中断
前天,学到中断,也中断了。昨天也没学。今天,开始试中断查询方式,竟然不对,从网上找资料,还是不对,和定时器中断一样,感觉不应该有啥问题,就是不对。 不知突然看到,我的while(1)后写个分号,编译竟然能通过。我后头可是大括号,还有东西呢啊!果然,分号一去,OK了。坑姐啊! void Main() { EA=1; //全局中断开 EX0=1; //外部中断0开 IT0=1; //1是边沿触发,0为低电平触发 while(1) { if(IE0) { Speak1=~Speak1; IE0=0; } } } 中断
[单片机]
51单片机按键程序中while(!key)的作用是什么
我相信大家也是常常遇到过这一句代码while(!key);,那么大家知道这句代码是有什么用吗?在这我就和大家分享一下,还是用代码来说话吧: #include reg52.h typedef unsigned int uint; typedef unsigned char uchar; sbit key=P1^0; void delay(uint x) { uchar i; while(x--)for(i=0;i 120;i++); } void scan_key(void) { uchar j; if(key==0)//判断按键是否被按下 delay(10);//按键消抖 if(key==0)
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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