stm32EXTI配置
STM32外部输入中断配置流程图
外部输入中断配置步骤 输入IO 初始化 ●设置外部中断输入的IO 口状态
开启AFIO 时钟 ●开启IO 口复用时钟
中断服务子程序 ●编写中断服务函数
配置NVIC ●配置中断分组(NVIC ),优先级,并使能中断。
配置EXTI 各寄存器 ●触发方式、中断开关等
IO 与EXTI 线连接 ●配置外部中断配置寄存器AFIO_EXTICR
可以设置为上拉/下拉输入,浮空输入;推荐设置上拉/
下拉输入。
STM32的IO 口与中断线的对应关系需要配置外部中断配置寄存器EXTICR
中断屏蔽寄存器(EXTI_IMR) 事件屏蔽寄存器(EXTI_EMR)
上升沿触发选择寄存器(EXTI_RTSR) 下降沿触发选择寄存器(EXTI_FTSR) 软件中断事件寄存器(EXTI_SWIER) 挂起寄存器(EXTI_PR) 寄存器SCB->AIRCR :设置中断分组
寄存器组IPR[15]:设置主优先级,从优先级。
简述exti的使用过程
简述exti的使用过程
EXTI(External Interrupt)是单片机外部中断的缩写,是STM32F4系列微控制器中的外部中断控制器,它可以通过检测外部信号的变化来触发中断。
在使用EXTI前,需要进行以下几个步骤:
1. 使能GPIO时钟:需要使能所用GPIO的时钟,以便使用其引脚作为中断源。
2. 配置GPIO引脚:需要将引脚配置为输入模式,并选择中断触发方式,如下降沿触发、上升沿触发等。
3. 选择EXTI通道:需要选择EXTI通道,即与所选GPIO引脚相对应的中断通道。
4. 配置NVIC:需要配置中断优先级和中断服务函数。
在完成以上几个步骤后,即可使用EXTI进行中断处理。
当所选GPIO引脚发生中断触发事件时,即可触发中断服务函数。
可以在中断服务函数中编写相应的程序来处理中断事件。
需要注意的是,由于外部中断的响应速度较快,因此在中断服务函数中应尽量避免耗时操作,以免影响系统的响应速度。
总之,EXTI是STM32F4系列微控制器中的外部中断控制器,可用于检测外部信号的变化并触发中断服务函数,需要进行一定的配置和设置后才能使用。
STM32的exti中断调试遇到一奇怪问题总结
STM32的exti中断调试遇到一奇怪问题总
结
前两日调试EXTI 中断程序,程序很简单抄了网上
的范例,起初调试正常,可以正常运行,但我在程序中
加入另外的代码后问题出现,表现为中断莫名其妙的开
始响应!检查自己的程序,未发现异常,中断部分的设
置也没有为题。
逐步屏蔽后加入的代码,依据屏蔽的代
码不同,单步运行后从不同的位置跳入中断。
怪哉怪哉....反复调试若干遍,花费时间2天有余...
百思不得其解之际,又检查了自己的板子,看到BOOT1
悬空,心中一动,当初图省事,空了此脚,难不成问题
在此?
找了调帽装上,一切正常,吐血....
.....(心里活动省略200字)
原来
虽然boot0置0了,但是boot1还是不能悬空的呀!
---------------------------------------------------
另外一个小技巧:调试程序后进入中断,未清除中断退
出debug模式,再次debug的时候因为iar 5.20 debug 的复位功能并未自动清除中断,所以此时程序会自行进
入中断,对调试造成困扰,解决方法是在main中第一句就放入中断清除语句。
运行复位运行就正常了,就不用再手动去按板子上的reset了。
奋斗STM32V3版按键中断_EXTI_例程
按键中断(EXTI)例程实验
实验平台:奋斗版STM32开发板V2、V2.1、V3 实验内容:板子加电后,按动板子上K1-K3按键,可控制对应的LED1-LED3的亮 灭,该实验学习了外部中断(EXTI)程序的编制及控制流程。
4.2 硬件电路设计
在开发板上V6、V7、V8分别与MCU的PB5、PD6、PD3相连,如下图所示
淘宝店铺:
11
奋斗版 STM32 开发板例程详解———按键中断实验
键盘部分如下图所示: 例程所用到的列扫描线:PC5,PC2,PC3。 例程所用到的行扫描线(EXTI中断线):PE2。
上升沿触发选择寄存器(EXTI_RTSR) 偏移地址:08H 复位值:0000 0000h
注意: 外部唤醒线是边沿触发的,这些线上不能出现毛刺信号。 在写EXTI_RTSR 寄存器时在外部中断线上的上升沿信号不能被识别,挂起位不会被置 位。在同一中断线上,可以同时设置上升沿和下降沿触发。即任一边沿都可触发中断。
1.2 外部中断配置寄存器2(AFIO_EXTICR2)
地址偏移:0Ch 复位值:0000h
淘宝店铺:
1
奋斗版 STM32 开发板例程详解———按键中断实验
1.3 外部中断配置寄存器3(AFIO_EXTICR3)
地址偏移:10h 复位值:0000h
1.4 外部中断配置寄存器4(AFIO_EXTICR4)
地址偏移:14h 复位值:0000h
淘宝店铺:
2
奋斗版 STM32 开发板例程详解———按键中断实验
2.1 嵌套向量中断控制器(NVIC)
淘宝店铺:
7
stm32差分编码器编程实例
stm32差分编码器编程实例
当使用 STM32 微控制器编程时,可以通过外部差分编码器来实现位置或速度的测量。
下面是一个简单的 STM32 差分编码器编程实例,以帮助您了解如何进行编程:
1. 首先,确保您已经正确连接了差分编码器到 STM32 微控制器的外部引脚。
通常,差分编码器会有两个输出信号通道(通常称为 A 和 B 通道),以及一个用于指示方向的 Z 通道。
2. 在 STM32 的开发环境中,创建一个新的工程,并选择适当的 STM32 型号。
3. 在工程中,将差分编码器的 A 和 B 通道连接到 STM32 的两个外部中断引脚(例如 EXTI0 和 EXTI1)。
4. 在工程中,将差分编码器的 Z 通道连接到 STM32 的另一个外部中断引脚(例如 EXTI2)。
5. 在代码中,启用外部中断功能,并配置外部中断触发方式为上升沿或下降沿触发。
6. 在外部中断的中断处理函数中,编写代码来处理差分编码器的输出信号变化。
根据差分编码器的工作原理,每当 A 或 B 通道的信号变化时,都会触发外部中断。
您可以在中断处理函数中根据A 和 B 通道的状态变化来判断编码器的旋转方向,并相应地更新位置或速度的计数器。
7. 如果需要使用 Z 通道来确定编码器的起始位置,您可以在Z 通道的中断处理函数中重置位置或速度的计数器。
8. 在主程序中,您可以使用位置或速度的计数器值来执行相应的操作,例如控制电机或执行其他任务。
需要注意的是,具体的差分编码器编程实例可能会根据使用的STM32 型号和开发环境有所不同。
因此,您可以参考 STM32 的官方文档和相关的编程手册来获取更详细的信息和示例代码。
stm32外部中断实验报告-STM32实例外部中断实验
stm32外部中断实验报告_STM32实例外部中断实验上⼀篇⽂章我们介绍了 STM32F10x 的中断,这次我们就来学习下外部中断。
本⽂中要实现的功能与按键实验⼀样,即通过按键控制LED,只不过这⾥采⽤外部中断⽅式进⾏控制。
学习时可以参考《STM32F10x 中⽂参考⼿册》-9 中断和事件章节。
外部中断介绍EXTI 简介STM32F10x 外部中断/事件控制器(EXTI)包含多达 20 个⽤于产⽣事件/中断请求的边沿检测器。
EXTI 的每根输⼊线都可单独进⾏配置,以选择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或边沿触发),还可独⽴地被屏蔽。
EXTI 结构框图EXTI 框图包含了 EXTI 最核⼼内容,掌握了此框图,对 EXTI 就有⼀个全局的把握,在编程的时候思路就⾮常清晰。
从图中可以看到,有很多信号线上都有标号 9 样的“20”字样,这个表⽰在控制器内部类似的信号线路有 20 个,这与 STM32F10x 的 EXTI 总共有20 个中断/事件线是吻合的。
因此我们只需要理解其中⼀个的原理,其他的 19个线路原理都是⼀样的。
EXTI 分为两⼤部分功能,⼀个产⽣中断,另⼀个产⽣事件,这两个功能从硬件上就有所差别,这个在框图中也有体现。
从图中标号 3 的位置处就分出了两条线路,⼀条是 3-4-5 ⽤于产⽣中断,另⼀条是 3-6-7-8⽤于产⽣事件。
下⾯我们就来介绍下这两条线路:(1)⾸先看下产⽣中断的这条线路(1-2-3-4-5)1.标号 1 为输⼊线,EXTI 控制器有 20 个中断/事件输⼊线,这些输⼊线可以通过寄存器设置为任意⼀个 GPIO,也可以是⼀些外设的事件,这部分内容我们会在后⾯专门讲解。
输⼊线⼀般是存在电平变化的信号。
2.边沿检测电路,EXTI 可以对触发⽅式进⾏选择,通过上升沿触发选择寄存器和下降沿触发选择寄存器对应位的设置来控制信号触发。
边沿检测电路以输⼊线作为信号输⼊端,如果检测到有边沿跳变就输出有效信号 1 给红⾊框 3 电路,否则输出⽆效信号 0。
野火F1开发板STM32案例-外部中断(按键)使用
野⽕F1开发板STM32案例-外部中断(按键)使⽤野⽕F1开发板STM32案例-外部中断(按键)使⽤硬件平台野⽕STM32F103ZET6 霸道V2开发板正点原⼦F1系列开发板软件平台Keil MDK 5.31串⼝调试助⼿Gitee .中断相关概念中断配置寄存器# 配置中断时,使⽤ISER、 ICER 和 IP 寄存器,## ISER 是中断使能寄存器## ICER 是中断清除寄存器## IP 是中断优先级寄存器中断优先级1. 数值越⼩,优先级越⾼2. STM32F103 中只使⽤4位,⾼4位有效。
3. ⽤于表达优先级的⾼ 4 位⼜被分组成抢占式优先级和响应优先级,称为“亚优先级”或“副优先级”4. 每个中断源都需要被指定这两种优先级。
中断配置步骤1.使能外设中断6. 设置中断优先级分组初始化 NVIC_InitTypeDef 结构体,设置抢占优先级和响应优先级,使能中断请求。
typedef struct{uint8_t NVIC_IRQChannel; //中断源uint8_t NVIC_IRQChannelPreemptionPriority; //抢占优先级uint8_t NVIC_IRQChannelSubPriority; //响应优先级FunctionalState NVIC_IRQChannelCmd; //中断使能或失能} NVIC_InitTypeDef;NVIC_IRQChannel 中断源:中断源的设置,不同的外设中断,中断源不⼀样NVIC_IRQChannelPreemptionPriority //抢占优先级NVIC_IRQChannelSubPriority //响应优先级NVIC_IRQChannelCmd //中断使能或失能:使能配置为 ENABLE,失能配置为 DISABLE。
NVIC_IRQChannel //中断源/****** Cortex-M3 Processor Exceptions Numbers ***************************************************/NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt *//****** STM32 specific Interrupt Numbers *********************************************************/WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */TAMPER_IRQn = 2, /*!< Tamper Interrupt */RTC_IRQn = 3, /*!< RTC global Interrupt */FLASH_IRQn = 4, /*!< FLASH global Interrupt */RCC_IRQn = 5, /*!< RCC global Interrupt */EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */DMA1_Channel1_IRQn = 11, /*!< DMA1 Channel 1 global Interrupt */DMA1_Channel2_IRQn = 12, /*!< DMA1 Channel 2 global Interrupt */DMA1_Channel3_IRQn = 13, /*!< DMA1 Channel 3 global Interrupt */DMA1_Channel4_IRQn = 14, /*!< DMA1 Channel 4 global Interrupt */DMA1_Channel5_IRQn = 15, /*!< DMA1 Channel 5 global Interrupt */DMA1_Channel6_IRQn = 16, /*!< DMA1 Channel 6 global Interrupt */DMA1_Channel7_IRQn = 17, /*!< DMA1 Channel 7 global Interrupt */STM32F103 中断向量表EXTI外部中断1. STM32F10x 外部中断/事件控制器(EXTI)包含多达 20 个⽤于产⽣事件/中断请求的边沿检测器。
STM32-PVD编程及EXTI_Line16中断设置 附图
先看一下这2张截自STM32参考手册的图片:下面这张表截自STM32F103x8/B的数据手册,对上图的参数给出了具体数值:下面对上面2张图和表格中的数据做一个简要的解释:1)PVD = Programmable Votage Detector 可编程电压监测器它的作用是监视供电电压,在供电电压下降到给定的阀值以下时,产生一个中断,通知软件做紧急处理。
在给出表格的上半部分就是可编程的监视阀值数据。
当供电电压又恢复到给定的阀值以上时,也会产生一个中断,通知软件供电恢复。
供电下降的阀值与供电上升的PVD阀值有一个固定的差值,这就是表中的VPVDhyst(PVD迟滞)这个参数,通过列出的PVD阀值数据可以看到这个差别。
引入这个差值的目的是为了防止电压在阀值上下小幅抖动,而频繁地产生中断。
2)POR = Power On Reset 上电复位;PDR = Power Down Reset 掉电复位。
POR的功能是在VDD电压由低向高上升越过规定的阀值之前,保持芯片复位,当越过这个阀值后的一小段时间后(图中的"滞后时间"或表中的"复位迟滞"),结束复位并取复位向量,开始执行指令。
这个阀值就是表中倒数第4行(min=1.8V,typ=1.88V,max=1.96V)。
POR的功能是在VDD电压由高向低下降越过规定的阀值后,将在芯片内部产生复位,这个阀值就是表中倒数第3行(min=1.84V,typ=1.92V,max=2.0V)。
3)可以看到POR比PDR大了0.04V,这就是表中倒数第2行,VPDRhyst(PDR迟滞)=40mV。
4)从上面的第2张图可以看到,当VDD上升越过POR阀值时,内部并不马上结束复位,而是等待一小段时间(Reset temporization),这就是表中的最后一行TRSTTEMPO,它的典型数值是2.5ms。
这个滞后时间是为了等待供电电压能够升高到最低可靠工作电压以上,我们看到POR阀值最小只有1.8V,最大也只有1.96V,都低于数据手册中给出的最低可靠工作电压2.0V,所以这个滞后时间是十分必要的,如果供电电压上升缓慢,尤其是从1.8V升到2.0V以上超过1~2.5ms,则很可能造成上电复位后MCU不能正常工作的情况。
STM32-GPIO及EXTI初始化详解
STM32-GPIO及EXTI初始化详解void EXTI_Configuration(void); //定义IO中断初始化函数EXTI_Configuration();//IO中断初始化函数调用简单应用://中断设置void EXTI_Configuration(void){EXTI_InitTypeDef EXTI_InitStructure; //EXTI初始化结构定义EXTI_ClearITPendingBit(EXTI_LINE_KEY_BUTTON);//清除中断标志GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3);//管脚选择GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//事件选择EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//触发模式EXTI_InitStructure.EXTI_Line = EXTI_Line3 | EXTI_Line4; //线路选择EXTI_InitStructure.EXTI_LineCmd = ENABLE;//启动中断EXTI_Init(&EXTI_InitStructure);//初始化}//RCC初始化函数中开启I/O时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);//GPIO初始化函数中定义输入I/O管脚。
stm32标准库例程
stm32标准库例程一、引言STM32是意法半导体公司推出的一款基于ARM Cortex-M内核的微控制器。
STM32标准库例程是针对STM32系列芯片,提供了一些常用的函数库,方便开发者进行开发。
本文将详细介绍STM32标准库例程。
二、STM32标准库例程概述1. STM32标准库例程包含哪些功能?- GPIO(通用输入输出)- USART(串行通信)- ADC(模拟数字转换)- TIM(定时器)- EXTI(外部中断)- NVIC(嵌套向量中断控制器)2. STM32标准库例程有哪些优点?- 方便使用:提供了常用的函数,不需要自己编写底层驱动程序。
- 易于移植:支持不同型号的芯片。
- 稳定可靠:经过严格测试和验证,保证代码质量。
三、GPIO例程1. GPIO简介GPIO即通用输入输出,是STM32芯片上最常用的外设之一。
它可以通过设置寄存器来控制芯片上的输入输出引脚。
2. GPIO例程代码示例```#include "stm32f10x.h"int main(void){// 使能GPIOC时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 配置PC13为推挽输出GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);while(1){// PC13输出高电平GPIO_SetBits(GPIOC,GPIO_Pin_13);// 延时for(int i=0;i<1000000;i++);// PC13输出低电平GPIO_ResetBits(GPIOC,GPIO_Pin_13);// 延时for(int i=0;i<1000000;i++);}}```四、USART例程1. USART简介USART是一种通用的异步收发传输协议。
STM32外部中断5-9,10-15的应用解析
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE7
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE0
EXTI_Init(&EXTI_InitStructure);//配置
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource9);//PE9连接到中断线9
/*配置EXTI_Line5 */
EXTI_InitStructure.EXTI_Line = EXTI_Line5;//LINE5
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Rising; //上升沿触发
STM32外部中断5-9,10-15的应用解析
STM32有些系列(比如STM32F407)的外部中断5-9是共用一个中断处理函数EXTI9_5_IRQHandler(),外部中断10-15共用中断函数EXTI15_10_IRQHandler(),所以很多人(包括我自己)刚开始时对于这些外部中断线的设置以及判断都不是弄得很清楚,下面就直接贴出中断引脚的配置、中断配置以及进入中断之后的判断处理程序。
stm32中断(NVIC与EXTI)
stm32中断(NVIC与EXTI) D部有4个从优先级(00 01 10 11)。
1.中断输入与悬起当中断输入脚被置为有效后,该中断就被“悬起”。
所谓“悬起”,也就是等待、就绪的意思。
即使后来中断源撤消了中断请求,已经被标记成悬起的中断也被记录下来。
当某中断的服务程序开始执行时,就称此中断进入了“活跃”状态,并且其悬起位会被硬件自动清除。
在一个中断活跃后,直到其服务例程执行完毕,并且返回后,才能对该中断的新请求予以响应。
当NVIC响应一个中断时,会自动完成以下三项工作,以便安全、准确地跳转到相应的中断服务程序:入栈:把8个寄存器的值压入栈。
当响应中断时,如果当前的代码正在使用PSP,则压入PSP(进程堆栈),否则就压入MSP(主堆栈)。
一旦进入了服务例程,就一直使用主堆栈。
在自动入栈的过程中,将寄存器写入堆栈的顺序与时间顺序无关,CM3会保证正确的寄存器被保存到正确的位置。
取向量:当数据总线(系统总线)进行入栈操作时,指令总线(I-Code总线)正在从向量表中找出正确的中断向量与对应的服务程序入口地址。
更新寄存器。
注意:①如果在某个中断得到响应之前,其悬起状态被清除了,则中断被取消。
②新请求在得到响应时,由硬件自动清零其悬起标志位。
③如果中断源咬住请求信号不放,该中断就会在其上次服务例程返回后再次被置为悬起状态。
④如果某个中断在得到响应之前,其请求信号以若干的脉冲的方式呈现,则被视为只有一次中断请求⑤如果在服务例程执行时,中断请求释放了,但是在服务例程返回前又重新被置为有效,则NVIC会记住此动作,重新悬起该中断。
2.中断返回当中断完成,返回主程序时,NVIC自动完成以下两步:①出栈:先前压入栈中的寄存器在这里恢复。
内部的出栈顺序与入栈时的相对应,堆栈指针的值也改回先前的值。
②更新NVIC 寄存器:伴随着中断的返回,它的活动位也被硬件清除。
对于外部中断,倘若中断输入再次被置为有效,则悬起位也将再次置位,新一次的中断响应序列也会再次开始。
stm32 hal 句柄 详细理解
stm32 hal 句柄详细理解STM32是一种嵌入式微控制器系列,HAL(Hardware Abstraction Layer)是指硬件抽象层,在STM32 HAL中,句柄(Handle)是表示一个特定资源或对象的指针。
通过使用句柄,可以方便地访问和管理这些资源或对象。
在本文中,将详细理解STM32 HAL句柄的使用方法和原理。
在STM32 HAL中,句柄主要用于访问和操作外设,例如GPIO、UART、SPI等。
每个外设都有一个对应的句柄结构体,通过对该句柄结构体进行配置和操作,可以实现对外设的控制。
下面将分别介绍几个常见的外设以及它们对应的句柄结构体。
1. GPIO:GPIO是通用输入输出端口,用于控制外部设备的输入和输出。
在STM32 HAL中,GPIO的句柄结构体为GPIO_HandleTypeDef。
通过对该句柄结构体进行配置,可以设置GPIO的引脚模式、引脚速度、引脚状态等。
2. UART:UART是通用异步收发传输器,用于串行通信。
在STM32 HAL中,UART的句柄结构体为UART_HandleTypeDef。
通过对该句柄结构体进行配置,可以设置UART的波特率、数据位数、停止位数等。
3. SPI:SPI是串行外设接口,用于与其他设备进行数据交换。
在STM32 HAL中,SPI的句柄结构体为SPI_HandleTypeDef。
通过对该句柄结构体进行配置,可以设置SPI的工作模式、数据位数、时钟极性等。
4. I2C:I2C是串行通信总线,用于连接多个设备。
在STM32 HAL 中,I2C的句柄结构体为I2C_HandleTypeDef。
通过对该句柄结构体进行配置,可以设置I2C的时钟速度、地址模式、传输方向等。
5. ADC:ADC是模数转换器,用于将模拟信号转换为数字信号。
在STM32 HAL中,ADC的句柄结构体为ADC_HandleTypeDef。
通过对该句柄结构体进行配置,可以设置ADC的采样时间、参考电压、转换通道等。
NVIC和EXIT的关系
原]STM32中EXTI(外部中断)和NVIC(嵌套向量中断)的关系[ 2012-4-13 6:38:00 | By: mxh0506 ]2推荐NVIC是Cortex-M3核心的一部分,关于它的资料不在《STM32的技术参考手册》中,应查阅ARM公司的《Cortex-M3技术参考手册》Cortex-M3的向量中断统一由NVIC管理EXTI是ST公司在其STM32产品上扩展的外中断控制。
它负责管理映射到GPIO引脚上的外中断和片内几个集成外设的中断(PVD,RTC alarm,USB wakeup,ethernet wakeup),以及软件中断。
其输出最终被映射到NVIC的相应通道。
因此,配置EXTI中断的过程必然包含对NVIC的配置,例如下面配置EXTI0的过程,就要首先配置EXTI控制器(使能相应的中断线,选择中断/事件模式,触发边沿极性),然后再配置NVIC 控制器(EXTI0映射在NVIC上的通道号,中断优先级,中断屏蔽状态):/* Connect EXTI Line 0 to GPIO Pin PB0 */GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);/* Configure EXTI line 0 */EXTI_InitStructure.EXTI_Line = EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // or RisingEXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);/* Enable this interrupt on corresponding NVIC channel */NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; // EXTI0_IRQn is defined in stm32f10x.hNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);EXTI0_IRQn的值,其实就是EXTI0中断向量在中断向量表中的位置(STM32技术参考手册中断向量表Position栏中的数值)。
stm32外部中断实验原理
stm32外部中断实验原理STM32是意法半导体公司推出的一款32位单片机系列产品,具有高性能、低功耗和广泛的外设功能。
其中外部中断是其重要的功能之一,可以实现外部事件的异步处理,适用于各种实时应用。
外部中断的原理是通过外部引脚和STM32之间的触发信号来实现中断的触发和处理。
STM32支持多种中断模式,包括上升沿触发、下降沿触发、双边沿触发和低电平触发等。
如何使用外部中断呢?首先,在程序中需要使用到外部中断的引脚上要连接一个外部触发源,比如按键或传感器等。
然后,在程序中对该引脚进行配置,指定外部中断的触发方式。
接下来,在程序中编写中断处理函数,在中断触发时执行相应的处理逻辑。
最后,在启动中断之前,需要使能相应的中断,并配置优先级。
STM32外部中断是基于NVIC(Nested Vectored Interrupt Controller)的,它是ARM Cortex-M处理器的一部分。
它能够支持多重中断,并可配置中断优先级。
当一个外部中断触发时,会产生一个中断请求,然后被NVIC捕获,并根据优先级进行中断处理。
在硬件层面上,外部中断将通过外部中断控制器(EXTI)和GPIO控制器进行连接。
外部中断的引脚通过GPIO控制器配置为中断模式,并通过EXTI控制器与NVIC连接。
当外部触发源产生中断信号时,通过GPIO控制器将该中断信号传递给EXTI控制器,然后触发中断处理。
在软件编程方面,首先需要对GPIO和EXTI进行相应的初始化配置。
对于GPIO,我们需要设置引脚的模式、速度和上下拉等参数。
对于EXTI,我们需要设置中断触发方式(例如上升沿触发)和中断屏蔽(可以选择屏蔽或非屏蔽中断)等。
接着,使用STM32提供的库函数进行中断处理的配置。
首先,我们需要使用NVIC_Init函数来配置NVIC,使能相应的中断和设置中断优先级。
然后,使用EXTI_Init函数设置外部中断的触发方式和屏蔽等。
最后,编写中断处理函数,当外部中断触发时进行相应的处理。
外部中断(EXTI)的学习
tmp = ((uint32_t)0x0F) << (0x04 * (GPIO_PinSource & (uint8_t)0x03)); AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp; AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) << (0x04 * (GPIO_PinSource & (uint8_t)0x03))); }
void EXTI_key_config(void) {
GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* 使能 GPIOC 时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); /* 配置 PC6 引脚为输入浮空 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOC, &GPIO_InitStructure); /* 配置 PD13 PD14 引脚为输入浮空 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD, &GPIO_InitStructure);
STM32实验报告
实验一:一个灯的闪烁一、实验要求1.熟悉使用STM32F103ZET6开发板2.利用C语言程序实现一个灯闪烁二、电路原理图图1-1 LED灯硬件连接图三、软件分析1.本实验用到以下3个库函数(省略了参数):RCC_DeInit();RCC_APB2PeriphClockCmd();GPIO_Init();2.配置输入的时钟:SystemInit()主要对RCC寄存器进行配置,GPIOA连接在APB2上,因此RCC_APB2PeriphClockCmd()函数需要使能APB2Periph_GPIOA3.声明GPIO结构: PF6~PF10口配置为输出GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;4.应用GPIO口:点亮LED1有五种方法①ODR寄存器法:GPIOA->ODR=0xffbf;②位设置/清除寄存器法:GPIOA->BRR|=0X001;③方法③只适用于GPIOx_BSRR寄存器④GPIO_WriteBit()函数法:GPIO_Write(0xffbf);⑤置位复位库函数法:GPIO_ResetBits(GPIOF,GPIO_Pin_8);5.主函数程序:int main(void){RCC_Configuration(); /* 配置系统时钟 */GPIO_Configuration(); /* 配置GPIO IO口初始化 */ for(;;){GPIOF->ODR = 0xfeff; /* PF8=0 --> 点亮D3 */Delay(600000);GPIOF->ODR = 0xffff; /* PF8=1 --> 熄灭D3 */Delay(600000);}}四、实验现象下载程序后开发板上的LED1灯闪烁五、总结通过对本实验可以发现,和51等8位单片机相比,STM32对I/O端口的操作变得复杂了许多。
stm32中断下降沿触发电压标准
stm32中断下降沿触发电压标准在STM32微控制器中,可以通过配置外部中断的触发边沿来实现下降沿触发功能。
下降沿触发是指当外部信号从高电平跳变到低电平时触发中断。
首先,我们需要了解STM32中断下降沿触发的电压标准。
在STM32微控制器中,外部中断的触发电压标准通常为VIL(信号被认为是逻辑低电平的最大电压)和VIH(信号被认为是逻辑高电平的最小电压)。
根据STM32的官方文档,通常情况下,VIL为0.3VDD和0.5VDD之间,其中VDD是微控制器的供电电压。
而VIH则为0.7VDD和0.9VDD 之间。
这意味着,当外部信号的电压低于0.3VDD时,信号将被认为是逻辑低电平;而当外部信号的电压超过0.7VDD时,信号将被认为是逻辑高电平。
需要注意的是,这只是STM32中断下降沿触发的标准电压范围,具体的数值可能会根据不同的微控制器型号和具体应用而有所变化。
因此,在具体应用中,我们应该查阅相应的STM32参考手册,以获取准确的电压范围。
接下来,我们将重点讨论如何在STM32中配置下降沿触发的外部中断。
首先,我们需要选择合适的GPIO引脚作为外部中断的输入引脚。
然后,我们需要将该引脚配置为输入模式。
在STM32 HAL库中,我们可以使用以下代码实现这一步骤:```GPIO_InitTypeDef GPIO_InitStruct;//选择GPIO引脚GPIO_InitStruct.Pin = GPIO_PIN_x;//配置为输入模式GPIO_InitStruct.Mode = GPIO_MODE_INPUT;//配置为下拉输入模式(可选)GPIO_InitStruct.Pull = GPIO_PULLDOWN;//初始化GPIO引脚HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);接下来,我们需要设置外部中断触发的条件。
在STM32中,我们可以通过EXTI线路来配置外部中断触发条件。
STM32-PVD编程及EXTI_Line16中断设置附图
先看一下这2张截自STM32参考手册的图片:下面这张表截自STM32F103x8/B的数据手册,对上图的参数给出了具体数值:下面对上面2张图和表格中的数据做一个简要的解释:1)PVD = Programmable Votage Detector 可编程电压监测器它的作用是监视供电电压,在供电电压下降到给定的阀值以下时,产生一个中断,通知软件做紧急处理。
在给出表格的上半部分就是可编程的监视阀值数据。
当供电电压又恢复到给定的阀值以上时,也会产生一个中断,通知软件供电恢复。
供电下降的阀值与供电上升的PVD阀值有一个固定的差值,这就是表中的VPVDhyst(PVD迟滞)这个参数,通过列出的PVD阀值数据可以看到这个差别。
引入这个差值的目的是为了防止电压在阀值上下小幅抖动,而频繁地产生中断。
2)POR = Power On Reset 上电复位;PDR = Power Down Reset 掉电复位。
POR的功能是在VDD电压由低向高上升越过规定的阀值之前,保持芯片复位,当越过这个阀值后的一小段时间后(图中的"滞后时间"或表中的"复位迟滞"),结束复位并取复位向量,开始执行指令。
这个阀值就是表中倒数第4行(min=1.8V,typ=1.88V,max=1.96V)。
POR的功能是在VDD电压由高向低下降越过规定的阀值后,将在芯片内部产生复位,这个阀值就是表中倒数第3行(min=1.84V,typ=1.92V,max=2.0V)。
3)可以看到POR比PDR大了0.04V,这就是表中倒数第2行,VPDRhyst(PDR迟滞)=40mV。
4)从上面的第2张图可以看到,当VDD上升越过POR阀值时,内部并不马上结束复位,而是等待一小段时间(Reset temporization),这就是表中的最后一行TRSTTEMPO,它的典型数值是2.5ms。
这个滞后时间是为了等待供电电压能够升高到最低可靠工作电压以上,我们看到POR阀值最小只有1.8V,最大也只有1.96V,都低于数据手册中给出的最低可靠工作电压2.0V,所以这个滞后时间是十分必要的,如果供电电压上升缓慢,尤其是从1.8V升到2.0V以上超过1~2.5ms,则很可能造成上电复位后MCU不能正常工作的情况。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EXTI配置规则
配置时钟→初始化IO口→配置中端向量优先级→指定中断IO口→中断方式→使能中断→写中断函数
主函数
Void main (void)
{
开启用到的外设时钟
Void RCC_Configuation();
初始化IO口
Void IO_Configuation();
中断设置
Void EXTI_Configuation()
{
定义结构变量
EXTI_InitTypeDef EXTI_InitStructure;
清除中断标志
EXTI_ClearPendingBit(EXTI_Linex);
选择中断管脚
GPIO_EXTILineConfig(GPIO_PortSourceGPIOx,GPIO_PinSourcex)
选择中段线路
EXTI_InitStructure.EXTI_Line(EXTI_Linex);
中断模式
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
中断触发方式
EXTI_InitStructure.EXTI_Trigger=EXTI_Teigger_Rising_Falling;
中段线路使能
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
初始化设置
EXTI_Init(&EXTI_InitStucture);
}
配置中断向量优先级
Void NVIC_Configuation()
{
定义结构(只定义一次)
NVIC_InitTypeDef NVIC_InitStructure;
选择中断分组(选择一次)
NVIC_PriorityGroupConfig(NVIC_Priority_group_x);
选择中断通道
NVIC_InitStructure.NVIC_IRQChannel=EXTIx_IRQChannel;
抢占式中断优先级设置
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=x;
响应式中断优先级设置
NVIC_InitStructure.NVIC_IRQChannelSubPriority=x;
使能中断
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
初始化设置
NVIC_Init(&NVIC_InitStruction);
}
死循环
While(1);
}
中断函数
Void EXTIx_IRQHandler(voie)
{
点亮LED
GPIO_SetBits(GPIOx,GPIO_Pin_x);
清除中断标志
EXTI_ClearITPendingBit(EXTI_Linex);
}。