STM32F407ZGT6|实现中断操作
功能:按下KEY键灯亮,再按KEY键灯灭(外部中断)
本实验步骤:
1、一些初始化
2、使能IO口时钟/LED灯外设时钟/使能SYSCFG时钟(中断必打开)
3、GPIO与中断线的重映射
4、初始化LED及KEY寄存器
5、初始化线上中断EXTI_Init()
6、配置中断分组NVIC
7、编写中断服务函数
基本概念
中断数量、抢占优先级与响应优先级、中断步骤
中断数量:
共有92个中断,10个内核中断,82个可屏蔽中断(常用);
16级可编程的中断优先级
抢占优先级与响应优先级:
抢占优先级越高,中断程序优先级越高;
若:中断1抢占优先级为2,中断2抢占优先级为1
响应优先级
若:两中断抢占优先级相同时,中断1响应优先级是3,中断2响应优先级为2(先响应中断2再响应中断1)
中断重要步骤:
1、使能IO口时钟
2、使能SYSCFG时钟(中断必打开)
3、GPIO与中断线的重映射
4、初始化线上中断EXTI_Init()
5、配置中断分组NVIC
6、编写中断服务函数:判断中断是否发生;清除某中断线的中断标志位
1、一些初始化
GPIO_InitTypeDef GPIO_InitStructure; //KEYGPIO_InitTypeDef GPIO_InitStructure1;//LEDEXTI_InitTypeDef EXIT_InitStructure;//EXTINVIC_InitTypeDef NVIC_InitStructure;//NVIC
2、使能IO口时钟/LED灯外设时钟/使能SYSCFG时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);//ʹĜGPIOCʱ֓ 外设时钟使能RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//ʹĜGPIOAʱ֓ 外设时钟使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//SYSCFG时钟
3、GPIO与中断线的重映射
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource15);// PA15连接线15
4、初始化LED及KEY寄存器
//GPIOPC13 LEDGPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;//LED0º͌ED1¶ԓ¦IO¿ڍ 引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//ƕͨʤ³öģʽ 输出模式寄存器GPIO_Init(GPIOC, &GPIO_InitStructure);//³õʼ»¯GPIO //引脚,GPIO结构体地址//1 GPIOPA15 KEYGPIO_InitStructure1.GPIO_Pin = GPIO_Pin_15;//LED0º͌ED1¶ԓ¦IO¿ڍ 引脚GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_IN;//ƕͨʤ³öģʽ 输入模式寄存器GPIO_InitStructure1.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOA, &GPIO_InitStructure1);//³õʼ»¯GPIO //引脚,GPIO结构体地址
注意:
输出模式寄存器-不需要设置上拉/下拉寄存器
输入模式寄存器-使用按键时需要将上拉/下拉寄存器设置为上拉状态
5、初始化线上中断EXTI_Init()
EXIT_InitStructure.EXTI_Line = EXTI_Line15;EXIT_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXIT_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发EXIT_InitStructure.EXTI_LineCmd = ENABLE;//使能EXTI_Init(&EXIT_InitStructure);
注意:
KEY引脚 为PA15 中断线为15
6、配置中断分组NVIC
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//定义的初始化中断// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);同下NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//响应优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
//LED默认为点亮状态,此处将该处电平置高设置为不亮状态
GPIO_SetBits(GPIOC, GPIO_Pin_13);//初始化灯不亮
7、编写中断服务函数
//判断中断是否发生
//清除某中断线的中断标志位
void EXTI15_10_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line15)!=RESET){if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)==1)//灯不亮{GPIO_ResetBits(GPIOC, GPIO_Pin_13);//灯亮}else{GPIO_SetBits(GPIOC, GPIO_Pin_13);//灯不亮}}EXTI_ClearITPendingBit(EXTI_Line15);
#include "stm32f4xx.h"
#include "delay.h"
int main(void)
{//实现功能:按下KEY键灯亮,再按KEY键灯灭//1、使能IO口时钟/LED灯外设时钟//2、使能SYSCFG时钟(中断必打开)//3、GPIO与中断线的重映射//4、初始化线上中断EXTI_Init()//5、配置中断分组NVIC//6、编写中断服务函数//判断中断是否发生//清除某中断线的中断标志位GPIO_InitTypeDef GPIO_InitStructure; //KEYGPIO_InitTypeDef GPIO_InitStructure1;//LEDEXTI_InitTypeDef EXIT_InitStructure;//EXTINVIC_InitTypeDef NVIC_InitStructure;//NVIC//1、使能IO口时钟/LED灯外设时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);//ʹĜGPIOCʱ֓ 外设时钟使能RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//ʹĜGPIOAʱ֓ 外设时钟使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//SYSCFG时钟//GPIOPC13 LEDGPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;//LED0º͌ED1¶ԓ¦IO¿ڍ 引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//ƕͨʤ³öģʽ 输出模式寄存器GPIO_Init(GPIOC, &GPIO_InitStructure);//³õʼ»¯GPIO //引脚,GPIO结构体地址//EXTIX_Init()//1 GPIOPA15 KEYGPIO_InitStructure1.GPIO_Pin = GPIO_Pin_15;//LED0º͌ED1¶ԓ¦IO¿ڍ 引脚GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_IN;//ƕͨʤ³öģʽ 输入模式寄存器
// GPIO_InitStructure1.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOA, &GPIO_InitStructure1);//³õʼ»¯GPIO //引脚,GPIO结构体地址//2 重映射SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource15);// PA15连接线15//3 初始化线上中断EXTI_Init()EXIT_InitStructure.EXTI_Line = EXTI_Line15;EXIT_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXIT_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发EXIT_InitStructure.EXTI_LineCmd = ENABLE;//使能EXTI_Init(&EXIT_InitStructure);//4 配置中断分组NVICNVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//定义的初始化中断// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//响应优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);GPIO_SetBits(GPIOC, GPIO_Pin_13);//初始化灯不亮while(1);
}//6、编写中断服务函数//判断中断是否发生//清除某中断线的中断标志位
void EXTI15_10_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line15)!=RESET){if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)==1)//灯不亮{GPIO_ResetBits(GPIOC, GPIO_Pin_13);//灯亮}else{GPIO_SetBits(GPIOC, GPIO_Pin_13);//灯不亮}}EXTI_ClearITPendingBit(EXTI_Line15);
}
碎碎念:
中断服务函数作用:
发生了中断就执行该函数内的操作
出错的原因:
中断服务函数逻辑存在问题,应该判断灯亮或不亮,按键处的状态本身就有中断发生的状态判断不需要重复进行判断。由于该处是逻辑问题,之前查找了很久问题才发现
STM32F407ZGT6|实现中断操作相关推荐
- STM32F407ZGT6|定时器中断
功能:LED每500ms闪烁一次 步骤: 1.结构体的定义 2.使能LED(GPIOC外设)/定时器/中断/定时器中断 3.初始化LED/定时器 4.配置中断分组NVIC 5.编写中断服务函数(重:溢 ...
- 外挂 制作之0D使用---主要是中断操作
文章整理发布:黑客风云 文章来源:www.05112.com 1.我的os是winXP,无法使用trw2000,而softice装了多次均未成功,还蓝屏死机多次.郁闷. 2.友好的gui界面,不像so ...
- 循环的中断操作(C#基础回顾03)
循环的中断有以下3个命令 break 立即终止循环 continue 立即终止当前的循环(继续执行下一次循环) return 跳出循环及包含该循环的方法(函数) List<st ...
- CC2530的中断操作----按键控制led灯亮灭
中断使能主要有四个步骤: (1)使.EA 位为 1,开中断. (2)设置寄存器 IEN0.IEN1和IEN2中相应中断使能位为1. (3)如果需要,则设置P0.P1.P2各引脚对应的各中断使能位为1. ...
- 单片机学习(2)------中断操作
1.按钮S0接在51单片机的 P3.3(INT1)引脚上,P1口接了8个发光二极管,编程实现:初始状态时,LED0灯亮,其它灯灭,利用S0按钮控制P1口的灯(中断方式),要求每按一下就点亮一盏灯( 前 ...
- android 按钮中断,android – 如何“中断”在AccessibilityService中执行的操作?
我想做什么/我做了什么:我正在尝试为视障用户制作一个非常基本的TalkBack版本.我做了一个简单的辅助功能服务,读取用户点击的按钮的contentDescription并大声读出. @Overrid ...
- LPC2124单片机的基础操作——GPIO、外部中断、定时器和串口
LPC2124单片机的基础操作--GPIO.外部中断.定时器和串口 LPC2124的简介 LPC2124之GPIO GPIO简介 编程习惯 代码编写 LPC2124之EINT(外部中断) EINT简介 ...
- 【STM32】定时器中断原理及操作
目录 时钟的选择及分频 定时器中断有关的寄存器 定时器中断有关的库函数 1.时钟使能函数:RCC_APB1PeriphClockCmd 2.定时器初始化函数:TIM_TimeBaseInit 3.定时 ...
- FreeRTOS 临界段和开关中断
以下转载自安富莱电子: http://forum.armfly.com/forum.php 临界段 代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码 的执行不被 ...
最新文章
- 怎样从0一步一步搭建用户激励体系
- TCP 和 UDP 绑定同一端口通信的解释
- 21、python基础学习-new_three_menu
- Taro+react开发(92):taro中的事件处理
- golang操作mysql数据库(Go-SQL-Driver/MySQL)
- android改变下拉框字体颜色,AutoCompleteTextView下拉字体颜色
- 美CFTC任命Jason Somensatto担任金融技术研究部门代理总监
- 单片机控制三相异步电动机正反转c语言程序,用FX PLC控制三相异步电动机的启动与正反转...
- 归并排序 java_Java实现归并排序
- 一张照片让你的安卓手机崩溃
- vue2.0模板的三种写法
- 适合的才是最好的:记一次内网安装feather经历
- pytorch载入部分预训练权重
- 华为matex搭载鸿蒙系统,华为 MateX 推迟至 9 月上市,或预装鸿蒙系统
- OSPF的DR和BDR
- 【附源码】计算机毕业设计java疫情期间优化旅游平台设计与实现
- python图像检索
- 【docker】配置深度学习环境
- 太阳能导电浆料 国产新势力崛起
- 【机器学习速成宝典】模型篇02线性回归【LR】(Python版)