stm32成长记之中断介绍

发布者:cyzcee最新更新时间:2019-05-24 来源: eefocus关键字:stm32  中断介绍 手机看文章 扫描二维码
随时随地手机看文章

嵌套向量中断控制器


特性


●68个可屏蔽中断通道(不包含16个Cortex™-M3的中断线); 


● 16个可编程的优先等级(使用了4位中断优先级);


外部中断/事件控制器框图


外部中断程序设计思路:


中断初始化,主要是完善三个结构体:


①GPIO_InitTypeDef   (功能:IO配置)


②EXTI_InitTypeDef (功能:中断配置)


③NVIC_InitTypeDef (功能:中断优先级配置)


抢占优先级高的可以抢占优先级低的,即发生中断嵌套;响应优先级高的中断先进行,但不会抢占响应优先级低的中断,即不能发生中断嵌套;


void exti_init()  

{

GPIO_InitTypeDef GPIO_InitStructure;

 

EXTI_InitTypeDef EXTI_InitStructure;

 

NVIC_InitTypeDef NVIC_InitStructure;

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //若是,开启复用功能,需要开启复用时钟。

GPIO_InitStructure.GPIO_Pin=k_left;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //按键所接IO口设置为上拉模式

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOE,&GPIO_InitStructure); 

//此处注意,若是没有将中断引脚映射到外部中断线路上,中断将无效

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);//选择GPIO管脚作外部中断线路/*设置外部中断模式 */ 

EXTI_InitStructure.EXTI_Line=EXTI_Line2;//挂载中断线2

EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//设置为中断模式

EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure); /*设置中断优先级*/

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  

NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //打开EXIT2的全局中断

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

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   //响应优先级为0

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //使能

NVIC_Init(&NVIC_InitStructure); 

}

中断处理程序实现:

①通过EXTI_GetITStatus检测中断线是否发生了变化


(EXTI_GetITStatus通过检测中断的挂起寄存器EXTI_PR是否和当前发生变化的中断线相同,是的话,返回SET;否的话,返回RESET。)


②发生中断后,使用EXTI_ClearITPendingBit清除EXTI线路挂起位。


中断处理函数,应该放置与stm32f10x_it.c中,也可将该函数copy到Keil编译路径下


如果放在新建的文件夹中,需要将对应的目录添加到Keil编译目录中



void EXTI2_IRQHandler()    

{

if(EXTI_GetITStatus(EXTI_Line2)==SET)

{

    EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位

delay_ms(10);//消抖

if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET)    //k_left被按下

{

delay_ms(10);//消抖处理

if(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_0)==Bit_RESET)

{

//LED 熄灭

   GPIO_SetBits(GPIOC,GPIO_Pin_0);

}

else

{

   //LED 点亮

GPIO_ResetBits(GPIOC,GPIO_Pin_0);

}

while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0);

}

}

关键字:stm32  中断介绍 引用地址:stm32成长记之中断介绍

上一篇:stm32成长记之LED呼吸灯
下一篇:stm32成长记之滴答时钟

推荐阅读最新更新时间:2024-11-08 11:17

STM32—时钟树(结合系统时钟函数理解)
时钟树的概念: 我们可以把MCU的运行比作人体的运行一样,人最重要的是什么?是心跳! 心脏的周期性收缩将血液泵向身体各处。心脏对于人体好比时钟对于MCU,微控制器(MCU)的运行要靠周期性的时钟脉冲来驱动,而这个脉冲的始源往往是由外部晶体振荡器提供时钟输入,最终转换为多个外部设备的周期性运作。这种时钟“能量”的传递路径犹如大树的养分由主干流向个分支,因此称为时钟树。 STM32时钟: 在STM32中每个外设都有其单独的时钟,在使用某个外设之前必须打开该外设的时钟 ,为什么要这么麻烦来设置每一个外设的时钟而不是将所有外设的时钟统一打开?因为STM32的外设繁多,外设的运作所需要的最佳时钟各不相同,如果所有时钟同时运行会给MCU带
[单片机]
<font color='red'>STM32</font>—时钟树(结合系统时钟函数理解)
应用笔记 | 看似无法唤醒的一种异常现象分析
1. 引言 STM32 G0 系列产品具有丰富的外设和强大的处理性能以及良好的低功耗特性,被广泛用于各类工业产品中,包括一些需要低功耗需求的应用。 2.问题描述 用户使用STM32G0B1 作为汽车多媒体音响控制器的控制芯片,用来作为收音机频道存贮和各种检测控制。在实验室条件下模拟汽车频繁打火的情形进行测试,连续工作72 小时实验中,进入STOP 模式后,会出现无法再继续运行的情况(屏幕没有显示输出,外部中断无反应)。 3. 问题重现 通常调查问题时采取调试监控的方式。但是用户产品是在检测外部掉电时,测外部电压(汽车ACC 电源,轿车12V)下降后,立刻进入低功耗模式,然后通过RTC 和外部中断(PC13 下降沿触发
[单片机]
应用笔记 | 看似无法唤醒的一种异常现象分析
stm32定时器输入捕获pwm
花了两天时间终于把stm32f103的定时器输入捕获弄懂了,这里以TIM3的通道ch1为例,要实现输入捕获需要配置一下寄存器,TIMx_ARR,TIMx_PSC,TIMx_CCMR1,TIMx_CCER,TIMx_DIER,TIMx_CR1,TIMx_CCR1.这里抓取了一些收据手册中寄存器描述的图 下面一一介绍: TIMx_ARR寄存器为自动重装载的值 TIMx_CR1这里了只要用到它的第0位即使能位。 TIMx_CCMR可以配置对应通道映射到那个IC,TI。 这里我们是第一通道故只需配置低8位,cc1s为配置ch1映射到那个TI,IC1PSC为配置是否分频,1c1f为配置是否滤波。 TIMx_psc寄存器 T
[单片机]
STM32 CDC HOST初步调试
1. 芯片平台: STM32F207VE 2. 使用Cube产生USB host CDC的工程 3. USB CDC设备使用基于FDTI FT232R的USB Dongle 将程序download到PCB上,发现USB并未工作。查看hUsbHostFS变量,其gState的状态为HOST_ABORT_STATE,枚举的状态(EnumState)为ENUM_GET_SERIALNUM_STRING_DESC。 USB设备初始化就失败了。 4. 将usbh_conf.h中的USBH_DEBUG_LEVEL设置为1. 使用Semihost输出的方式(PCB上并未将SWO脚引出到调试接口)。IAR的Terminal IO输
[单片机]
STM32+MS5611测气压温度例程详解,测试无误
硬件平台:STM32F10X + MS5611 + JLink 软件平台:Keil 4 一、基础知识 首先,MS5611是什么? MS5611气压传感器是集合SPI和I²C(高达20 MHz)总线接口的高分辨率气压传感器,分辨率可达到10cm。内部有一个高线性度的 压力传感器 和一个超低功耗的24位AD。 MS5611主要用于智能手机、海拔高度测量和导航辅助,做四轴的朋友一般都了解。 其次,对于飞行器的姿态控制,我们使用GY-86 10DOF 的模块,里面带有MS5611 + MPU6050 + HMC5883,通过IIC协议读取数据进行操作。MS5611挂在MPU5060的从I2C接口上。MS5611的I2C地址为0b111
[单片机]
stm32内存分配
(1)栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似 于数据结构中的栈。 (2)堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配 方式类似于数据结构中的链表。 (3)全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态 变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系 统自动释放。 (4)文字常量区:常量字符串就是存放在这里的。 (5)程序代码区:存放函数体的二进制代码。 例如: int a=0;
[单片机]
STM32】通用定时器的输入捕获(实例:输入捕获)
通用定时器输入捕获概述 输入捕获的工作原理 在通用定时器框图中,主要涉及到最顶上的一部分(计数时钟的选择)、中间部分(时基单元)、左下部分(输入捕获)这三个部分。这里主要讲解一下左下部分(输入捕获),其他两个部分可以参考文章:【STM32】通用定时器的基本原理(实例:定时器中断)。 输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32的定时器,除了TIM6、TIM7,其他的定时器都有输入捕获的功能。下面以一个简单的脉冲输入为例,简单地讲述一下输入捕获用于测量脉冲宽度的工作原理: 先设置输入捕获为上升沿检测,记录发生上升沿时TIMx_CNT的值。然后配置捕获信号为下降沿捕获,当下降沿到来的时候发生捕
[单片机]
【<font color='red'>STM32</font>】通用定时器的输入捕获(实例:输入捕获)
STM32自定义printf实现多串口互用
STM32 串口使用频繁的朋友可能知道一个问题,库自带的 USART_SendData 函数一次只能发送 1 Byte 字符 如果我们要输出一个带格式、带参数的串口数据就只能通过 sprintf 打印到一个临时数组,然后再使用一个for循环调用USART_SendData一个字符一个字符的输出,过程非常麻烦! 姜斌是一个非常怕麻烦的人所以这种方法无疑让我发疯!后来在原子(OpenEDV)那里购买了开发板拿到了例程。里面重定向了printf函数作为串口输出函数,有了这个函数之后就能够很轻松的参数输出,但问题就在这里我们串口1 串口2 都要带参数输出怎么办? 本次实验:自定义printf函数 实验数据来源: 配置usart
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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