STM8L探索套件学习笔记-EXTI外部中断(二)
- 格式:docx
- 大小:8.88 KB
- 文档页数:1
STM8S单片机外部中断唤醒
一、STM8S 外部中断进行唤醒
先了解一下STM8S的中断资源
再看看STM8S的中断管理。
STM8S采用软件优先级和硬件优先级来控制一个中断的响应,先比较软件优先级只有当软件优先级一致时才会比较硬件优先级,由于硬件优先级具有唯一性,这样便保证了某一时刻定会只有一个中断被处理。
要使用外部中断,只需简单的配置一下EXTI_CR1寄存器,并将主程序main的软件优先级置为0即可。
默认情况下自复位开始,主程序的软件优先级被设置为3,处于最高软件优先级,仅有TRAP,TLI,RESET中断能够打断,其余的中断都是不会被响应的。
为了防止中断过程中被别的优先级高的中断所打断,可以将当前优先级置为最高3级。
代码如下:
main.c代码
//EXTI_CR1|=EXTI_CR1_PBIS_R;//PB5TRINT高电平触发
EXTI_CR1|=EXTI_CR1_PCIS_R;//PC3上升沿触发
//#defineEXTI_CR1_PCIS_R(1《《4)
RIM;//开全局中断,必须要有这句,否则只会响应不可屏蔽中断
//#defineHALT_asm(“halt”)
//#defineRIM_asm(“rim”)
//#defineSIM_asm(“sim”)
GPIO_Init(GPIOC,TRINT,GPIO_MODE_IN_PU_IT);//使能对应的IO口中断
stm8s_it.c代码
//收发中断(PC3)BJ8F101。
手动开关手动开关没有自动切换为直接的但它提供给用户的切换事件时间的精确控制。
参照图20中的流程图。
1。
写使用系统时钟开关选择目标时钟源的8位值寄存器(clk_swr)。
然后swbsy位是由硬件,和目标源振荡器开始。
古老的时钟源继续驱动CPU和外设。
2。
该软件具有等到目标时钟源准备(稳定的)。
这是在clk_swcr寄存器和快捷旗由中断如果swien位设置显示。
3。
最终软件的作用是设置,在所选择的时间,在clk_swcr的赛文点寄存器来执行开关。
在手动和自动切换模式,旧的系统时钟源不会自动关闭的情况下是由其他模块(LSI混凝土可用于例如独立的看门狗驱动)。
时钟源可以关机使用在内部时钟寄存器的位(clk_ickcr)和外部时钟寄存器(clk_eckcr)。
如果时钟开关不因任何原因的工作,软件可以通过清除swbsy标志复位电流开关操作。
这将恢复clk_swr注册到其以前的内容(旧的系统时钟)。
注意:在清理swbsy标志具有复位时钟主开关的程序,应用程序必须等到后产生新的主时钟切换请求之前有一段至少两个时钟周期。
9.7周门控时钟(PCG)外周时钟门控(PCG)模式选择性地启用或禁用系统时钟(SYSCLK)连接到外围设备在运行或慢速模式的任何时间来优化功耗。
设备复位后,所有的外设时钟被禁用。
唯一的一点是在复位状态是默认启用pcken27因为它用于启动。
软件已被正确地写入关掉ROM Bootloader执行后的时钟。
您可以启用时钟的任何外围设置在clk_pckenrx周围门控时钟寄存器的相应pcken点。
●使周围,首先使在clk_pckenr相应的pcken点寄存器然后设置使点周围的外围控制寄存器。
●禁用适当的外围,先禁用在周边的适当位控制寄存器,然后停止相应的时钟。
注:蜂鸣器,RTC和液晶显示器是由不同的SYSCLK特定的时钟,使他们继续运行,即使时钟门控的外设寄存器是断言。
9.8时钟安全系统(CSS)9.8.1时钟安全系统对HSE时钟安全系统(CSS)监控HSE晶体时钟源故障时安全作为系统时钟。
第17章EXTI—外部中断事件控制器上⼀章节我们已经详细介绍了NVIC,对STM32F7xx中断管理系统有个全局的了解,我们这章的内容是NVIC的实例应⽤,也是STM32F7xx控制器⾮常重要的⼀个资源。
学习本章时,配合《STM32F76xxx参考⼿册》系统配置控制器以及中断和事件章节⼀起阅读,效果会更佳,特别是涉及到寄存器说明的部分。
特别说明,本书内容是以STM32F767xx系列控制器资源讲解。
17.1 EXTI简介外部中断/事件控制器(EXTI)管理了控制器的25个中断/事件线。
每个中断/事件线都对应有⼀个边沿检测器,可以实现输⼊信号的上升沿检测和下降沿的检测。
EXTI可以实现对每个中断/事件线进⾏单独配置,可以单独配置为中断或者事件,以及触发事件的属性。
17.2 EXTI功能框图EXTI的功能框图包含了EXTI最核⼼内容,掌握了功能框图,对EXTI就有⼀个整体的把握,在编程时就思路就⾮常清晰。
EXTI功能框图见图17-1。
图 17-1 EXTI功能框图EXTI可分为两⼤部分功能,⼀个是产⽣中断,另⼀个是产⽣事件,这两个功能从硬件上就有所不同。
⾸先我们来看图 171中红⾊虚线指⽰的电路流程。
它是⼀个产⽣中断的线路,最终信号流⼊到NVIC控制器内。
编号1是输⼊线,EXTI控制器有25个中断/事件输⼊线,这些输⼊线可以通过寄存器设置为任意⼀个GPIO,也可以是⼀些外设的事件,这部分内容我们将在后⾯专门讲解。
输⼊线⼀般是存在电平变化的信号。
编号2是⼀个边沿检测电路,它会根据上升沿触发选择寄存器(EXTI_RTSR)和下降沿触发选择寄存器(EXTI_FTSR)对应位的设置来控制信号触发。
边沿检测电路以输⼊线作为信号输⼊端,如果检测到有边沿跳变就输出有效信号1给编号3电路,否则输出⽆效信号0。
⽽EXTI_RTSR和EXTI_FTSR两个寄存器可以控制器需要检测哪些类型的电平跳变过程,可以是只有上升沿触发、只有下降沿触发或者上升沿和下降沿都触发。
stm8s外部中断
stm8s外部中断
stm8s外部中断相关的寄存器除了io的⼏个寄存器之外,还有就是EXTI_CR1,EXTI_CR2寄存器。
这⼏要注意,io的CR2寄存器的作⼏是开关中断。
另外,stm8s系列外部中断没有标志位。
以PC1下降沿触发为例,配置如下:
asm("sim");//关总中断
EXTI_CR1_PCIS = 2;//仅下降沿触发
PC_DDR_DDR1 = 0;//io⼏向:输⼏
PC_CR1_C11=0;//因为DDR为0,所以CR1为0表⼏浮空输⼏模式
PC_CR2_C21 = 1;//1:使能外部中断,0:关闭外部中断
asm("rim");//开总中断
说明:EXTI_CR1_PCIS可以选择0——3,含义如下图所⼏:
iar中断函数写法如下:
/* Defines an interrupt handler for EXTI2 vector. */
#pragma vector=7
__interrupt void EXTI2_IRQHandler(void)
{
}
中断函数我并没有写内容,说明⼏点:iar的中断向量号⼏stm8s 参考⼏册的中断向量号⼏2,所以⼏册⼏PC的终端向量号为5,此处为7。
IAR+STM8 ——EXTI外面中断控制寄存器2013-03-2123:23:15| 分类:STM8|举报|字号订阅这块三合一的开发板上有且只有一个按键,没方法,就拿这唯一的按键来用吧。
吸取前面UART3的教训,先看开发板的原理图吧。
这个按键被接到了STM8S207SB的PD7上,已做了上拉办理。
为了简单了然,还是点LED1吧。
按一下LED1亮,再按一下LED1灭。
好了,写程序吧。
include<iostm8s207sb.h>#defineLED1_FLASHPD_ODR_ODR3=!PD_ODR_ODR3//开发板上的LED1接在PD3上voidGPIO_init(void){PD_DDR=0x08;//配置PD端口的方向寄存器PD3输出PD_CR1=0x08;//设置PD3为推挽输出PD_CR2=0x80;//使能PD7外面中断}voidEXTI_init(void){EXTI_CR1=0x80;//PD口下降沿触发中断}#pragmavector=0x02//这里很要点!看下面说明。
__interruptvoidEXTI_PD7_TLI(void){LED1_FLASH;}voidinit_devices(void){asm("sim");//关全局中断GPIO_init();EXTI_init();asm("rim");//开全局中断}voidmain(void){init_devices();主循环里没有程序需要执行while(1);}这里重视要说明的一点是PD7的外面中断程序。
看了一下芯片手册,PD口外面中断EXTI3的中断向量号是6,想自然,又是想自然,按IAR的规矩中断向量要加2,就这样写#pragmavector=0x08,结果就是按下按键,程序没响应了,素来在中断里不出来。
接下来只能另想方法,仔细翻了资料后发现,PD7和PD其他端口不同样,PD7后边拖了个小尾巴TLI,再看手册上的TLI描述,乖乖,TLI拥有芯片最高等别中断,享有独立专用的中断向量号0,这下就好办了,按IAR的规矩,向量号加2,程序改成#pragmavector=0x02,重新来一遍编译、下载、运行,按键终于听话了。
资料来源:/zzwdkxx/article/details/9036679 STM32-外部中断学习笔记2013-06-07 10:1813368人阅读评论(1) 收藏举报分类:STM32(25)目录(?)[+]中断分类STM32的EXTI控制器支持19 个外部中断/ 事件请求。
每个中断设有状态位,每个中断/ 事件都有独立的触发和屏蔽设置。
STM32的19个外部中断对应着19路中断线,分别是EXTI_Line0-EXTI_Line18:线0~15:对应外部IO口的输入中断。
线16:连接到PVD 输出。
线17:连接到RTC 闹钟事件。
线18:连接到USB 唤醒事件。
触发方式:STM32 的外部中断是通过边沿来触发的,不支持电平触发。
外部中断分组:STM32 的每一个GPIO都能配置成一个外部中断触发源,STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0为第一组,那么依此类推,我们能得出一共有16 组,STM32 规定,每一组中同时只能有一个中断触发源工作,那么,最多工作的也就是16个外部中断。
寄存器组EXTICR寄存器组,总共有4 个,因为编译器的寄存器组都是从0 开始编号的,所以EXTICR[0]~ EXTICR[3],对应《STM32参考手册》里的EXTICR1~ EXTICR 4(查了好久才搞明白这个数组的含义!!)。
每个EXTICR只用了其低16 位。
EXTICR[0] ~EXTICR[3]的分配如下:EXTI寄存器的结构体:typedef struct{vu32 IMR;vu32 EMR;vu32 RTSR;vu32 FTSR;vu32 SWIER;vu32 PR;} EXTI_TypeDef;IMR:中断屏蔽寄存器这是一个32 寄存器。
但是只有前19 位有效。
当位x 设置为1 时,则开启这个线上的中断,否则关闭该线上的中断。
STM32学习笔记(2):外部中断的使用2011年3月20日外部中断中断对于开发嵌入式系统来讲的地位绝对是毋庸置疑的,在C51单片机时代,一共只有5个中断,其中2个外部中断,2个定时/计数器中断和一个串口中断,但是在STM32中,中断数量大大增加,而且中断的设置也更加复杂。
今天就将来探讨一下关于STM32中的中断系统。
1基本概念ARM Coetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。
STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit中的高4位。
STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。
68个通道的优先级控制字至少构成17个32位的优先级寄存器。
4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,后面是响应优先级。
按照这种分组,4bit一共可以分成5组第0组:所有4bit用于指定响应优先级;第1组:最高1位用于指定抢占式优先级,后面3位用于指定响应优先级;第2组:最高2位用于指定抢占式优先级,后面2位用于指定响应优先级;第3组:最高3位用于指定抢占式优先级,后面1位用于指定响应优先级;第4组:所有4位用于指定抢占式优先级。
所谓抢占式优先级和响应优先级,他们之间的关系是:具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。
如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
STM32学习手记③-EXTI中断用系统滴答定时器的精确定时函数,新手尽量少用,容易出错,还是用简单的延时操作好了。
抢占式优先级别与响应式优先级概念不懂,因为没看什么资料书就直接上程序了,以后有时间要看看相关方面的书。
STM的外部中断与51的不同,他的外部中断不是固定的IO口,例如,STM32有80个IO口,他每个IO口都可以映像到16个个外部中断,即PA3可以映像成外部中断1,也可以映像成外部中断2。
中断开启过程:1、在RCC里将要使用的IO口时钟打开(为什么一定要设置RCC_APB2Periph_AFIO,不懂,待以后理解)2、在GPIO里将该IO口映像到相应的外部中断3、在NVIC里将该中断通道打开中断使用注意事项:1、先使用if语句判断是发生哪个中断2、执行中断程序3、清除中断标志位,中断发生后必须清除中断位,否则会出现死循环不断发生这个中断。
要花时间看资料,了解CortexM3的中断机制(比如EXTI和USART中断有什么区别)。
/************************************************ ***********例程名称:外部中断实验硬件连接:指示灯连接 PE0按钮连接 PA3功能描述:本例程实现外部中断的输入试验,利用杜邦线把PA3接到开发板的GND,指示灯闪烁一下**/#include "stm32f10x_lib.h"/************************************************ *********** 函数名称:void RCC_Configuration()* 功能描述:复位和时钟控制配置* 参数:无* 返回值:无* 全局变量:无* 全局静态变量:无* 局部静态变量:无************************************************* ***************/void RCC_Configuration(){ErrorStatus HSEStartUpStatus; //定义外部高速晶振启动状态枚举变量RCC_DeInit(); //复位RCC外部寄存器到默认值RCC_HSEConfig(RCC_HSE_ON); //打开外部高速晶振HSEStartUpStatus=RCC_WaitForHSEStartUp(); //等待外部高速时钟准备好if(HSEStartUpStatus==SUCCESS){ //外部高速时钟已经准备好FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enab le); //开启FLASH预读缓冲功能,加速FLASH的读取。
EXTI外部中断整理⾃:正点原⼦PPT⽬录1 简介STM32F4的每个IO都可以作为外部中断输⼊,STM32F4的中断控制器⽀持23个外部中断/事件请求。
EXTI线0~15:对应外部IO⼝的输⼊中断。
EXTI线16:连接到PVD输出。
EXTI线17:连接到RTC闹钟事件。
EXTI线18:连接到USB OTG FS唤醒事件。
EXTI线19:连接到以太⽹唤醒事件。
EXTI线20:连接到USB OTG HS(在FS中配置)唤醒事件。
EXTI线21:连接到RTC⼊侵和时间戳事件。
EXTI线22:连接到RTC唤醒事件。
每个外部中断线可以独⽴的配置触发⽅式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专⽤的状态位。
虽然只有16个给IO⼝使⽤的中断线,但是我们可以使⽤响应的映射函数来让中断线和IO⼝实现对应。
(注意:同⼀时间对于同⼀中断线,有且仅能有⼀个IO⼝与之相对应)是不是16个中断线就可以分配16个中断服务函数呢?不是,IO⼝外部中断在中断向量表中只分配了7个中断向量,也就是只能使⽤7个中断服务函数从表中可以看出,外部中断线5—9分配⼀个中断向量,共⽤⼀个服务函数外部中断线10—15分配⼀个中断向量,共⽤⼀个中断服务函数。
中断函数列表EXTI0_IRQHandlerEXTI1_IRQHandlerEXTI2_IRQHandlerEXTI3_IRQHandlerEXTI4_IRQHandlerEXTI9_5_IRQHandlerEXTI15_10_IRQHandler2 外部中断配置步骤1、使能SYSCFG时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟2、设置IO⼝与中断线的映射关系(记得先初始化GPIO)void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex);eg:SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);//将PE2连接到外部中短线2上⾯3、初始化中断线,设置触发条件void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);这⾥也是需要传递⼀个结构体参数进去,该结构体定义如下:typedef struct{uint32_t EXTI_Line; //指定要配置的中断线EXTIMode_TypeDef EXTI_Mode; //模式:事件 OR中断EXTITrigger_TypeDef EXTI_Trigger;//触发⽅式:上升沿/下降沿/双沿触发FunctionalState EXTI_LineCmd; //使能 OR失能}EXTI_InitTypeDef;eg:/* 配置EXTI_Line0 */EXTI_InitStructure.EXTI_Line = EXTI_Line0;//LINE0EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能EXTI_Init(&EXTI_InitStructure);//配置/* 配置EXTI_Line2,3,4 */EXTI_InitStructure.EXTI_Line = EXTI_Line2 | EXTI_Line3 | EXTI_Line4;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能EXTI_Init(&EXTI_InitStructure);//配置4、记住EXTI配置完毕后还要配置NVIC的优先级5、编写中断服务函数。
STM32学习笔记——外部中断EXTISTM32学习笔记——外部中断EXTICreated on: 2012-10-30Author: zhang bin学习笔记for STM32F103C8redesigned by zhang bin2012-10-30versions:V-0.1All Rights Reservedmain.c如下,注释的⽐较详细,把下⾯的例⼦即说明都看明⽩基本上就可以⽤了://抢占级别⾼的会打断其他中断优先执⾏,⽽响应级别⾼的会在其他中断执⾏完优先执⾏。
//EXTI:外部中断/事件控制器//EXTI控制器可以产⽣⾼达19个软件事件/中断请求//将19根线配置为中断源,将19根线配置为事件源,将19根线配置为软件中断/事件线,详见《STM32F103xxx使⽤⼿册》//P135//在这个⽂件中主要是进⾏各种初始化配置,包括GPIO配置、EXTI配置、系统时钟配置等//中断服务程序则在stm32f10x_it.c⽂件中,该⽂件提供所有异常处理程序和外围中断服务程序的模板,详见该⽂件#include "stm32f10x_lib.h"EXTI_InitTypeDef EXTI_InitStructure; //定义外部中断初始化结构体变量内部含有4个成员详见EXTI_InitTypeDef的定义ErrorStatus HSEStartUpStatus;//定义错误状态变量,是枚举类型void RCC_Configuration(void);void GPIO_Configuration(void);void NVIC_Configuration(void);int main(void){#ifdef DEBUGdebug();#endifRCC_Configuration(); //系统时钟配置NVIC_Configuration();//NVIC配置GPIO_Configuration(); //配置GPIO//STM32的外部中断不是固定的,是可以映射的。