STM8L探索套件学习笔记-EXTI外部中断(二)
STM8L学习笔记:外部中断

External interrupt control register 1 (EXTI_CR1)
地址偏移量:0x00 复位值:0x00
7
6
5
4
3
2
1
0
RW
RW
RW
RW
RW
RW
RW
RW
P3IS[1:0]
P2IS[1:0]
P1IS[1:0]
P0IS[1:0]
每个端口的 bit3
每个端口的 bit2
每个端口的 bit1
P5IS[1:0]
P4IS[1:0]
每个端口的 bit7
每个端口的 bit6
每个端口的 bit5
每个端口的 bit4
的外部中断触发方式 的外部中断触发方式 的外部中断触发方式 的外部中断触发方式
设置位。(当 CCR 寄存 设置位。(当 CCR 寄存 设置位。(当 CCR 寄存 设置位。(当 CCR 寄存
I1 和 I0 都 被 置 1 时 I1 和 I0 都 被 置 1 时 都 被 置 1 时 (level 3-- 都 被 置 1 时 (level 3--
(level 3-- 软 件 优 先 级 (level 3--软 件 优 先 级 软件优先级使能,CCR 软件优先级使能,CCR
使能,CCR 寄存器复 使能,CCR 寄存器复 寄存器复位值两位都 寄存器复位值两位都
位值两位都是 1),这 位值两位都是 1),这 是 1),这些位只能被 是 1),这些位只能被
些位只能被写)。
些位只能被写)
写)
写)
需要注意的是,
需要注意的是,
需要注意的是,
需要注意的是,
在 Port F[3:0] 与 Port 在 Port E[3:0] 与 Port 在 Port D[3:0] 与 Port 在 Port B[3:0] 与 Port
STM8S单片机外部中断唤醒

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。
第4 章 外部中断

包括非屏蔽中断、异常、指令中断、复位。
2、设备中断(43~68个通道)
指STM32微控制器片内所有设备的中断,其数量与型号有关,对于 大容量(hd)类型,共60个。
3、外部中断(16/20个中断源、7/11个通道)
16个中断源,通过7个端口(PA、PB、PC、PD、PE、PF、PG)引脚 接外部设备信号。 7个中断通道:EXTI0、1、2、3、4各占1个,EXTI9—5为1个, EXTI15—10为1个通道。 另外4个中断源连接的是内部设备,用于检测电压、RTC闹钟、两 个唤醒CPU,且各占1个通道。
6
STM32中断系统结构
SRM32微控制器
CPU 片内设备43~68个 EXTI0~4 NMI EXTI 控制器 外 部 中 断
NVIC
……
异常 保留
EXTI5~9 EXTI10~15 EXTI0~15
7
对于互联型产品,外部中断/事件控制
器有20个产生事件/中断请求的边沿检测器。
其它产品,有19个。每个输入线可以独立地
配置输入类型(脉冲或挂起)和对应的触发事件
(上升沿或下降沿或者双边沿都触发)。
8
4.1.3 STM32中断机制 STM32 目前支持的中断共为 84 个(16 个内核+68 个外部),和 16 级可编程中断优 先级的设置 。 对于这 4bit 的中断优先级控制位还必须 分成 2 组看:从高位开始,前面是定义抢先 式优先级的位,后面用于定义子优先级。4bit 的分组组合可以有以下形式:
说
明
DMA通道5全局中断Fra bibliotekADC1-2全局中断 USB高/低优先级中 断或CAN发/收中断 CAN的SCE中断 外部中断9~5 通道 TIM1刹车中断 TIM1更新中断
STM8L中文参考手册_2

手动开关手动开关没有自动切换为直接的但它提供给用户的切换事件时间的精确控制。
参照图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—外部中断事件控制器

第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两个寄存器可以控制器需要检测哪些类型的电平跳变过程,可以是只有上升沿触发、只有下降沿触发或者上升沿和下降沿都触发。
STM8LI2C程序第二次数据通信失败的问题分析

/* Transmit data */ I2C_SendData(I2C1, Slave_Buffer_Rx[Tx_Idx++]); break; /******* Slave receiver **********/ /* check on EV1*/ case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED: break;
/* Set LED2 */ STM_EVAL_LEDOn(LED2);
} Event = I2C_GetLastEvent(I2C1); switch (Event) {
/******* Slave transmitter ******/ /* check on EV1 */ case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED: Tx_Idx = 0; break;
客户对 I2C 中断处理程序进行了修改,对应的代码如下,黄色部分标出了客户修改的代码: case (I2C_EVENT_SLAVE_STOP_DETECTED): /* write to CR2 to clear STOPF flag */ //I2C1->CR2 |= I2C_CR2_ACK; I2C1->CR2 |= (I2C_CR2_ACK + I2C_CR2_STOP);
3. 程序中的出错现象
客户的程序调时发现相同的数据连续从主控发给从机,只有第一次的通信波形是好的,第二次通信时设备地址可正常发送,
从机也有应答,但当第一 byte 数据发送完成后,主机收不到从机的应答信号。
stm8s外部中断

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。
IARFORSTM8例程要点总结计划

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,重新来一遍编译、下载、运行,按键终于听话了。