第6章 STM8中断控制系统
深入浅出stm8单片机入门、进阶与应用实例
深入浅出stm8单片机入门、进阶与应用实例STM8单片机是一款性能优越、功能丰富的微控制器,被广泛应用于嵌入式系统中。
本文将从深入浅出的角度,为大家介绍STM8单片机入门、进阶以及实际应用案例。
一、STM8单片机入门1. STM8单片机概述STM8单片机是意法半导体公司推出的一款8位微控制器,采用了高性能的STM8内核和丰富的外设资源。
相比其他8位单片机,STM8单片机具有更高的性能、更丰富的功能和更低的功耗。
2. STM8单片机编程语言STM8单片机支持多种编程语言,包括C语言、汇编语言、BASIC语言等。
其中,C语言是最常用的一种编程语言,具有语法简单、易于理解等优点。
3. STM8单片机开发环境STM8单片机开发环境包括开发工具和编程器。
常用的开发工具有IAR Embedded Workbench、ST Visual Develop、Keil uVision等。
编程器可以选择ST-Link/V2、ST-Link/V3、J-Link等。
4. STM8单片机基础知识STM8单片机基础知识包括IO口、定时器、中断等。
掌握这些基础知识是学习STM8单片机的基础。
其中,IO口用于接收或输出数字信号,定时器用于计时、测量时间等,中断用于实现程序的异步处理。
二、STM8单片机进阶与实践1. STM8单片机外设应用STM8单片机具有丰富的外设资源,包括GPIO、I2C、SPI、USART、ADC等。
这些外设可以满足不同应用场景的需求。
例如,GPIO用于控制LED等外围设备,I2C和SPI用于连接外部设备,USART用于串口通信,ADC用于模拟信号的采集。
2. STM8单片机通信协议STM8单片机支持多种通信协议,包括UART、I2C、SPI等。
这些通信协议可以实现与其他设备的通信,例如与传感器、显示器、无线模块等设备的通信。
不同的通信协议有着不同的特点和应用场景,需要根据实际需求选择合适的协议。
3. STM8单片机中断技术中断是STM8单片机中的一项重要技术,可以实现程序的异步处理。
STM8-时钟中断TIM系统
说实话我能够使用的单片机不多,我总是以为无论什么单片机都能开发出好的产品。
前些年用51,总是向各位大大学习,无休止的索取,在网上狂览一通。
心里感激的同时也想奉献一些,可是我会什么?后来使用avr(公司要求)还是向大大们学习,我又想奉献,可是我会什么?我会的大大们都写了,我不会的大大们也写了。
一个星期前花项目经费买了阿莫的kit三合一板,最近几天闲了下来,便动手调试一下。
算是有点心得,我又想奉献,可是我会什么?我只是想和大大们交流一下,哪怕是对的或者是错的,大大们满足我的一点心愿吧。
唠叨了这么多,现在开始吧。
配置:stvd ,cosmic我学单片机开门三砖总是要砸的。
第一砖:电源系统,这没什么好说的,只是它是stm8工作的基础总是要提一下第二砖:时钟系统,这等下再说。
第三砖:复位系统,stm8只需要一只104电容从reset脚到地就可以了。
现在说说时钟系统,学习单片机无论8位的还是32位的,都要从时钟开始,下面是我一开始的时钟切换程序。
1 CLK_ECKR |=0X1; //开启外部时钟2 while(!(CLK_ECKR&0X2)); //等待外部时钟rdy3 CLK_CKDIVR &= 0XF8; //CPU无分频4 CLK_SWR = 0XB4; //选择外部时钟5 CLK_SWCR |=0X2; //使能外部时钟上面的代码看起来没什么问题,可在调试过程中出现了有时能切换,有时有不能的情况,后来发现只要在第5行设上断点就能切换,我就想是不是得让cpu等一下,我又仔细的翻看下rm0016的时钟部分,发现得等待CLK_SWCR的标志位置位才能切换。
就变成了下面的代码CLK_ECKR |=0X1; //开启外部时钟while(!(CLK_ECKR&0X2)); //等待外部时钟rdyCLK_CKDIVR &= 0XF8; //CPU无分频CLK_SWR = 0XB4; //选择外部时钟while(!(CLK_SWCR&0X8)); //这里要等CLK_SWCR |=0X2; //使能外部时钟现在一切ok,是不是觉得看东西要仔细一下~~。
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系列单片机原理与应用 复习
✧─数据存储器:多达1K字节真正的数据EEPROM;可达30万次擦写✧RAM:多达2K字节时钟、复位和电源管理✧ 3.0~5.5V工作电压,内核电压1.8V✧灵活的时钟控制,4个主时钟源✧–低功率晶体振荡器✧–外部时钟输入✧–用户可调整的内部16MHz RC✧–内部低功耗128kHz RC✧带有时钟监控的时钟安全保障系统电源管理:✧–低功耗模式(等待、活跃停机、停机)✧–外设的时钟可单独关闭✧永远打开的低功耗上电和掉电复位中断管理✧带有32个中断的嵌套中断控制器✧ 6个外部中断向量,最多37个外部中断定时器✧2个16位通用定时器,带有2+3个CAPCOM通道(IC、OC 或PWM)✧高级控制定时器:16位,4个CAPCOM✧通道,3个互补输出,死区插入和灵活的自动唤醒定时器✧2个看门狗定时器:窗口看门狗和独立看门狗通信接口✧带有同步时钟输出的UART ,智能卡,红外IrDA,LIN接口✧SPI接口最高到8Mbit/s✧I2C接口最高到400Kbit/s2.2 STM8S系列MCU内部结构 P222.2.1 STM8内核CPU P24PC为24位,可寻址224=16Mb累加器(A) ,堆栈指针(SP),索引寄存器(X和Y),条件码寄存器(CC):2.2.2 STM8S封装与引脚排列2.3掌握通用I/O口GPIO初始化P31●可选择的输入模式:悬空输入(缺省状态)和带上拉输入●可选择的输出模式:推挽式输出和开漏输出PB_DDR,PB_CR1,PB_CR22.3.1 I/O引脚结构2.3.2 I/O端口数据寄存器与控制寄存器2.3.3输入模式2.3.4输出模式每一个端口都有一个输出数据寄存器 (ODR),一个引脚输入寄存器(IDR)和一个数据方向寄存器(DDR) 总是同相关的。
控制寄存器1(CR1)和控制寄存器2(CR2)用于对输入/输出进行配置。
任何一个I/O引脚可以通过对DDR,ODR,CR1和CR2寄存器的相应位进行编程来配置。
STM8的C语言编程(6)--8位定时器应用之二
本文由扶疏见影贡献 doc文档可能在WAP端浏览体验不佳。
建议您优先选择TXT,或下载源文件到本机查看。
STM8 的 C 语言编程(6)-- 位定时器应用之二 语言编程( )-- )--8 今天进行的实验依然是用定时器 4,只不过改成了用中断方式来实现,由定时器 4 的中断服务程序来驱动 LED 的闪烁。
实现中断方式的关键点有几个,第一个关键点就是要打开定时器 4 的中断允许 位,在定时器 4 的 IER 寄存器中有定义。
第二个关键点,就是打开 CPU 的全局 中断允许位,在汇编语言中,就是执行 RIM 指令,在 C 语言中,用下列语句实 现: _asm("rim"); 第 3 个关键点就是中断服务程序的框架或写法,中断服务程序的写法如下: @far @interrupt void TIM4_UPD_OVF_IRQHandler (void) { // 下面是中断服务程序的实体 } 第 4 个关键点就是要设置中断向量, 即将中断服务程序的入口填写到中断向量表 中,如下所示,将 IRQ23 对应的中断服务程序的入口填写成 TIM4_UPD_OVF_ IRQHandler struct interrupt_vector const _vectab[] = { {0x82, (interrupt_handler_t)_stext}, /* reset */ {0x82, NonHandledInterrupt}, /* trap */ {0x82, {0x82, {0x82, {0x82, {0x82, {0x82, {0x82, {0x82, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, /* /* /* /* /* /* /* /* irq0 irq1 irq2 irq3 irq4 irq5 irq6 irq7 */ */ */ */ */ */ */ */ {0x82, NonHandledInterrupt}, /* irq8 */ {0x82, NonHandledInterrupt}, /* irq9 */ {0x82, NonHandledInterrupt}, /* irq10 */ {0x82, {0x82, {0x82, {0x82, {0x82, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, /* /* /* /* /* irq11 irq12 irq13 irq14 irq15 */ */ */ */ */ {0x82, NonHandledInterrupt}, /* irq16 */ {0x82, NonHandledInterrupt}, /* irq17 */ {0x82, {0x82, {0x82, {0x82, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, /* /* /* /* irq18 irq19 irq20 irq21 */ */ */ */ */ irq23 */ */ */ */ */ */ */ {0x82, NonHandledInterrupt}, /* irq22 {0x82, TIM4_UPD_OVF_IRQHandler},/* {0x82, NonHandledInterrupt}, /* irq24 {0x82, NonHandledInterrupt}, /* irq25 {0x82, {0x82, {0x82, {0x82, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, /* /* /* /* irq26 irq27 irq28 irq29 }; 解决了以上 4 个关键点,我们就能很轻松地用 C 语言实现中断服务了。
STM8S系列单片机原理与应用(潘永雄)第6-11章章 (2)
第7章 STM8S系列MCU定时器
TIM1定时器功能完善,可实现下列操作: (1) 基本定时操作、计数操作。 (2) 利用输入捕获功能,测量脉冲信号时间参数(高、低 电平时间)。 (3) 利用输出比较功能,可产生单脉冲信号、PWM信号 等。 (4) 在PWM输出信号中,具有死区时间编程选择功能。 (5) 具有与其他定时器联动的功能。
第7章 STM8S系列MCU定时器
表7-1 STM8S定时器的主要功能
定时器 计数 计数 编号 方向 长度
分频系数
捕获 /比较 (CC) 通道数
向上
1~65 536 之间任意
TIM1
16
4
向下
整数
互 补
重 复 计
外部 刹车 与其他定时
计数脉冲可选
输 数 输入 器级联
出器
可选,有外部 3 8 位 1 TIM5、TIM6
第7章 STM8S系列MCU定时器 图7-1 高级控制定时器TIM1的内部结构
第7章 STM8S系列MCU定时器
7.2 TIM1时基单元
TIM1时基单元内部结构如图7-2所示。它由16位预分频 器TIM1_PSCR(TIM1_PSCRH, TIM1_PSCRL)、16位双向(向 上或向下)计数器TIM1_CNTR(TIM1_CNTRH, TIM1_CNTRL)、 16位自动重装寄存器TIM1_ARR(TIM1_ARRH,TIM1_ARRL) 及8位重复计数器TIM1_RCR组成。
stm8中断使用
stm8中断使用工程应用分析最近的一个项目中用到了stm8s,一个比较重要的知识点就是中断的使用。
暂且称stm8s这边做从机,要进行双机通信。
stm8s作“从机”接收数据,也可以发送数据给主机。
自定了一个通信协议,一个CLK线,一个DAT线,CLK线总是由主机边控制。
类似于I2C通信,CLK为高时,DAT由高到底表示开始。
CLK 位高时,DAT由低到高表示结束。
CLK为高电平时,DAT线数据为保持,为低电平时允许数据跳变。
实际的时序图如下:我这边接收数据其实有很多种方法,比如:1.可以在程序主循环while(1)中每一次周期监视检测电平的变化,来达到判断信号的目的2.采用延时,很多常用的通信会采用,比如我们接收数据,在高电平读数据,传送16位数据,得到第一个CLK高电平之后,可以直接延时固定间隔时间读,就可以得到下一个高电平时DAT数据,以此类推3.采用中断,不依赖于时间,完全依赖于硬件检测电平变化4.采用中断加延时的方法评价:1的方法,对时间要求比较高,因为有传输速度的要求,电平变化本来比较快,应尽可能缩短主循环一次执行时间,后续添加其他功能会有影响2的方法,对时间要求比较高,双机通信,一对一尚可,如果一对很多,不稳定,待验证3的方法,完全依赖于自身的硬件,比较稳定4的方法,依然存在2的缺点,情况类似最终实现方法DAT触发条件为上升沿和下降沿,CLK触发条件为上升沿DAT触发,检测DAT电平,只有开始和结束符合条件,所以可以用这个来判断开始位和结束位。
CLK上升沿触发中断,读DAT,可以保证肯定是在高电平时读的数据。
俩个中断同时开启,最终的操作还是简单的,参考代码如下:上面的firstStepin++这种做法如果一次出错,就乱了,还需要改进。
-------------------------------------------------------------------------分割线---------------------------------------------------------------------------------stm8的中断具体使用方法和常规的中断使用类似,首先要关闭全局中断,然后初始化中断用到的GPIO口,设置输入输出,是否可以中断,然后设置触发条件,用到多于一个中断,就要设置优先级。
STM8教程实验4-外部中断+按键
例程四按键中断其实在上个例程就说那个中断的,但不是重点说,例程四就重点说下这个中断的设置,主要是针对外部中断,对于其他的中断,到时在相应的模块里面会说的。
在STM8S207RB这个芯片里面有很多IO口都可以触发中断的。
主要是GPIO_A,GPIO_B,GPIO_C,GPIO_D,GPIO_E,这五组IO口都可以触发外部中断,所以大家以后要设计电路的话,必须先要查看先对应的文档来看下,了解清楚芯片的资料才好设置。
其实大家学会调用库里面的函数的话,这些初始化相当来说就很容易的了。
以上外部中断的设置来自“STM8寄存器.pdf”文档第74页下面看下电路图先吧,只要当你清楚电路具体的链接,才能完成相对应的初始化。
用到内部的资源"stm8s_clk.h""stm8s_exti.h""stm8s_gpio.h""stm8s_uart1.h""stm8s_clk.c""stm8s_exti.c""stm8s_gpio.c""stm8s_uart1.c"看完了电路图,照样是先看主函数在主函数里面最重要的是Buttom_Init();的初始化,其他的初始话上前几个例程已经有介绍过,相信大家也很清楚了。
下面重点讲下Buttom_Init()。
函数原型:第一条语句是设置Buttom1和Buttom2相对应的IO为上拉输入;第二条语句是设置GPIOD,也即是按键,为下降沿触发中断。
__enable_interrupt();这条语句是开总中断,在上一个例程里面说过了,以后凡是有触发中断的都要用上这条语句,所以说这条语句很重要的。
下面讲下外部中断常用的几个函数,这些函数都是库有的,可以直接调用的。
这个函数是设置哪组GPIO口为哪种方式触发中断的,触发方式有以下几种下降沿和顶电平触发,只有上升沿触发,只有下降沿触发,上升沿和下降沿触发这4种。
STM8S单片机外部中断唤醒
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。
STM8学习笔记——定时器定时功能和中断相关
STM8学习笔记——定时器定时功能和中断相关
定时器都差不多,无非就是计数,溢出了标志置位,如果中断允许的话产
生一个中断。
说到中断,STM8S105 的中断向量表如下
时基单元:
在选用内部时钟的情况下,CK_PSC 是由fmaster 提供的,经过定时器预分频器分频产生CK_CNT 时钟,然后作为一次计数的时基,举个例子,16M 的
内部RC,经过16 分频,则CK_CNT 为1M,那么定时1ms 只需计数1000 次。
计数模式:
共有三种:向上,向下,中央对齐
以向上计数为例:计数器从0 计数到用户定义的比较值(TIMx_ARR 寄存器
的值),然后重新从0 开始计数并产生一个计数器溢出事件,同时,如果
TIM1_CR1 寄存器的UDIS 位是0,将会产生一个更新事件(UEV)。
关于IAR 中断函数的写法
asm(“sim”);//关全局中断
asm(“rim”);//开全局中断
#pragma vector=TIM2_OVR_UIF_vector (这里根据上面的中断向量表选择要进入的中断的向量)
__interrupt void TIM2_OVR_UIF(void)//__interrupt 关键字表示中断函数{ TIM2_SR1 &=~0x01; // 清除更新中断标记,这步不能漏掉,否则会连续进入中。
第6章 STM8中断控制系统
正因如此,ITC_SPR1寄存器的b1、b0对应TLI,即0号 中断,而不是复位中断RESET;同理,TC_SPR1寄存器的 b3、b2对应AWU,即1号中断,而不是软件中断TRAP; ITC_SPR8寄存器的b3、b2对应29号中断。即ITC_SPR8~ ITC_SPR1定义了30个中断源(编号为0~29,其中25~29中
向量地址 8000h 8004h 8008h 800Ch 8010h 8014h 8018h 801Ch 8020h 8024h 8028h 802Ch 8030h 8034h 8038h 803Ch 8040h 8044h 8048h 804Ch 8050h 8054h 8058h 805Ch 8060h 8064h 8068h 806Ch到 807Ch
● 不可屏蔽的中断:
RESET,TLI 和 TRAP
●
可屏蔽中断: 外部中源 不可屏蔽中断不会考虑CC寄存器的I1和I0的状态。仅仅当TRAP 中断发生时候将PC,X, Y, A 和 CC 寄存器的内容压栈。相应的向量载入到PC寄存 器中同时置位I1和I0位禁止中断(3级优先级)。 STM8S支持32个中断,中断服务程序入口地址称为中断向量,放在 8000H~807FH之间。每个中断向量占4个字节,共4x32(128字节)。中断服 务程序可放在16MB任一存储区。
断号保留,没有定义)的优先级,而ITC_SPR8寄存器的高4
位没有定义。
(4) 优先级10最低,分配给主程序使用。因此,不允许
将中断优先级设为10。如果将某一个中断优先级设为10, 为使对应中断请求得到响应,STM8 CPU将保留该中断源 先前的优先级。换句话说,当前中断优先级设置操作无效。 (5) 当两个或两个以上可屏蔽中断源具有相同的软件优 先级时,硬件查询顺序如表6-1所示,即1号中断(自动唤醒 中断AWU)优先级最高,CLK中断次之,而24号中断
STM8S 定时器及其中断
2)GPIO 简介: 通用输入/输出口用于芯片和外部进行数据传输。一个IO端口可以包括多达8个引脚, 每个引脚可以被独立编程作为数字输入或者数字输出口。 GPIO 寄存器 :
I/O的配置和使用
控制寄存器1(CR1)和控制寄存器2(CR2)用于对输入/输出进行配置。任何一个I/O引脚可 以通过对DDR,ODR,CR1和CR2寄存器的相应位进行编程来配置。
3)TIM4:10MS产生一次溢出中断
void Tim4_Init(void) { TIM4_IER = 0x00;//禁止中断 TIM4_PSCR =0x07;//计数器时钟=主时钟/ 27=2Mhz/128 (计数器周期64us) TIM4_CNTR =0; //设定计数器的初值 TIM4_ARR =156;//设定重装载时的寄存器值(10ms/64us=156.25) TIM4_EGR = 0x01;//计数器重新初始化并产生寄存器更新 TIM4_CR1 = 0x01; //允许计数器工作 TIM4_SR &= 0xFE;//清除更新标志 TIM4_IER = 0x01; ;//允许更新中断 }
8位基本定时器TIM4----寄存器
应用实例:实现GPS_W LED 1S闪烁一次 System LED 2S闪烁一次 闪烁持续时间均为500ms 使用到的资源: 1)CLK(时钟):HSI 2)GPIO(通用输入输出口):PA1/PA3 3)TIM4(8位基本定时器):定时器溢出中断
8位基本定时器TIM4----寄存器
8位基本定时器TIM4----寄存器
8位基本定时器TIM4----寄存器
8位基本定时器TIM4----寄存器
STM8 COSMIC 中断
W\SHGHI YRLG #IDU LQWHUUXSWBKDQGOHUBW YRLG t)-
LQWHUUXSWBKDQGOHUBW"LQWHUUXSWBKDQGOHU>ń P t)- " LQWHUUXSWBYHFWRU
LQWHUUXSWBYHFWRU<FRQVW>BYHFWDE>@ ń P t)- ˍ (/ ඪ
¹YHFWRU ILOH QDPHƑ
(</Ʋ
3Ǹ၏BBYHFWDEּ) ˫ p ּ̤-YHFWRU DGGUH
ޖVWPBLQWHUUXSWBYHFWRUOV-
Ƒ ˷v
ܼ̤ ּ)
p%
BBYHFWDE GFE GFE SDJH BBVWH[W GFZ BBVWH[W GFE GFE SDJH IB1RQ+DQGOHG,QWHUUXSW GFZ IB1RQ+DQGOHG,QWHUUXSW
జ
D F G H
D F G H
LUTBV\VWHPBWLPBRYI
ͩ$ " t
Ƒ
PV
జ
ˣ Ϥ
Ϥ ַę "L ַȒ#
Ȓ# ˷v ę [ś #IDU #LQWHUUXSW YRLG LUTBV\VWHPBWLPBRYI ^
LI V\VWHPBGHOD\ ^ V\VWHPBGHOD\
Ƒܼ ̤ / ̤
1RQ+DQGOHG,QWHUUXSW ּ" జ /LQWHUUXSWBKDQGOHUBW LQWHUUXSWBKDQGOHU #- / ń ࡙3
这一节,我们将向大家介绍如何使用 STM8 的外部输入中断
我们使用的是 D 口,所以只需要设置与 D 口有关的位,EXTI_CR1 中的第 6、7 位是设置 PD 口的中断方式。如下图所示:
我们的实验是设置为仅下降沿触发,所以在我们只需要设置为 EXTI_CR1 = 0x80 就可以了。
下面是软件代码的编写
#include "iostm8s207rb.h" #define LED1_FLASH PD_ODR_ODR0 #define LED2_FLASH PD_ODR_ODR1 #define LED3_FLASH PD_ODR_ODR2 #define LED4_FLASH PD_ODR_ODR3
下面我们将逐步讲解与外部中断有关的寄存器 1)CR1,CR2 这两个寄存器相信大家都很熟悉了,我们前面与 IO 口有关的操作都要到这两个寄存器, 之前我们设置的一般都是推挽式输出以及上拉式输入 在这里我们设置成中断上拉输入,因为我们的硬件上没有外接上拉,需要内部上拉,设 置对应位的寄存器值是 CR1 = 1 以及 CR2 = 0 2)EXTI_CR1
void main( void ) { init_devices(); // 主循环里没有程序需要执行 while(1); }
#pragma vector=0x02 // 这里很关键!看说明。 __interrupt void EXTI_PD7_TLI(void) { LED4_FLASH; }
#pragma vector=0x08 __interrupt void EXTI_PD(void) { if(PD_IDR_IDR5 == 0) //key1按下 { if(PD_IDR_IDR6 == 0) //key1 key2同时按下 LED3_FLASH; else LED1_FLASH; } else LED2_FLASH; }
STM8库函数之中断计时
STM8库函数之中断计时STM8库函数之中断计时作者:carloszo原理分析中断计时的原理是基于时间片轮转理论。
按照顺序结构的写法,有时候避免不了沉重冗长的时间等待。
例如键盘扫描,你就给我弄了一个delay_20ms()函数,而在这延时的过程,其实MCU可以做很多事情的。
通过中断计时,给每个任务分配一个时间片,这样就可以避免因为使用delay造成的mcu等待,合理分配资源。
中断计时的具体实施步骤为,首先配置主时钟频率,配置计时器计时周期,使能中断,设置计时变量及初始值,如time_250ms_flag = 0,进中断后修改计时变量值等于1。
在main函数判断time_250ms_flag的值是否为1,如果为1,进行相应任务。
代码1.定义时间变量unsigned char time_250us_flag;unsigned char time_1ms_cnt;unsigned char time_10ms_cnt;unsigned char time_20ms_cnt;unsigned char time_100ms_cnt;unsigned char time_1s_cnt;2.配置主时钟void clk_init(void){CLK_DeInit();CLK_HSICmd(ENABLE);//内部高速时钟:16MCLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV2);//时钟频率:16M/2=8M }3.配置计时器void tim_init(void){TIM2_DeInit();TIM2_TimeBaseInit(TIM2_PRESCALER_8,249);//计时周期:250usTIM2_ARRPreloadConfig(ENABLE);TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);TIM2_Cmd(ENABLE);}4.中断设置@near @interrupt void TIM2_UPD_OVF_BRK_IRQHandler (void){/* In order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction. */TIM2_ClearITPendingBit(TIM2_IT_UPDATE);time_250us_flag =1;return;}5.main函数调用main(){sys_init();enableInterrupts();//使能总中断while(1){if(time_250us_flag==1) {time_250us_flag =0; time_1ms_cnt++;}if( time_1ms_cnt >=4) {time_1ms_cnt =0;time_10ms_cnt++;}if( time_10ms_cnt >=10) { time_10ms_cnt =0;time_20ms_cnt++;}if( time_20ms_cnt >=2) { time_20ms_cnt =0;time_100ms_cnt++;}if( time_100ms_cnt >=5) { time_100ms_cnt =0; time_1s_cnt++;}if( time_1s_cnt >=10) {time_1s_cnt =0;}}}。
STM8单片机中断的主要功能解析
STM8单片机中断的主要功能解析
内部中断:一般是由硬件错误或者运算过程中出错引起的,一般是不可避免的;
外部中断:是处理器的外设发出的中断请求,如定时器中断,UART接收中断,外部中断一般都可以通过中断控制器进行屏蔽;
……所有IO引脚都具有外部中断能力,每个端口都有独立的中断向量以及独立的标志;外设中断能力;
……软件中断能力(TRAP)
……具有灵活的优先级和中断等级管理,支持可嵌套和同级中断管理:——多达4个软件可编程的嵌套等级;——最多有32个中断向量,其入口地址由硬件固定;——2个不可避免的中断:RESET,TRAP;——1个不可避免的最高优先级硬件中断TL1;
2.中断的主要功能1. 实现高速CPU和低速外设之间速度的配合;打印机的打印字符的速度比较慢,于是CPU向打印机传送一个字符后,可以去执行其他任务,打印机打印完该字符,向CPU提出中断请求……
2. 可实现实时控制,所有参数可随时向CPU发送中断请求,使控制对象保持最佳工作状态;
3. 实现故障的紧急处理;
4. 实现人机接口,如键盘;
3.STM8中断源和中断向量中断源:中断信号的触发源;
中断向量:每个中断源对应至少一个中断标志,中断源请求CPU中断时,对应的中断标志位发送改变,CPU在每条语句结束检查中断标志位,如果允许中断,则产生中断,CPU 将PC指针指向对应中断服务程序入口,改地址就是中断向量;
在单片机中,中断技术主要用于实时控制,实时控制要求单片机能够及时的响应被控制对象提出的分析,计算和控制等请求,使被控制对象保持在最佳工作状态,以达到预期的最优控制效果,这些中断请求发生使随机的,要求单片机快速响应,是一个复杂的过程;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
正因如此,ITC_SPR1寄存器的b1、b0对应TLI,即0 号中断,而不是复位中断RESET;同理,TC_SPR1寄存器 的b3、b2对应AWU,即1号中断,而不是软件中断TRAP; ITC_SPR8寄存器的b3、b2对应29号中断。即 ITC_SPR8~ITC_SPR1定义了30个中断源(编号为0~29, 其中25~29中断号保留,没有定义)的优先级,而 ITC_SPR8寄存器的高4位没有定义。
复位值:0xFF
76
ITC_SPR1 VECT3SPR[1:0]
54 VECT2SPR[1:0]
3
2
1
0
VECT1SPR[1:0]
VECT0SPR[1:0]
ITC_SPR2 VECT7SPR[1:0]
VECT6SPR[1:0]
VECT5SPR[1:0]
VECT4SPR[1:0]
ITC_SPR3 VECT11SPR[1:0]
4.AD转换结束中断。 5. 串行发送结束中断。 6. 串行接收有效中断。 7.电源掉电中断。
2020/7/1
广东工业大学物理与光电工程学院
2.中断优先级
当多个外设以中断方式与CPU进行数据交换时,
可能遇到两个或两个以上外设中断请求同时有效的
情形。在这种情况下,CPU先响应哪一外设的中断
请求?这就涉及到中断优先级问题。一般说来,为
广东工业大学物理与光电工程学院
中断向 量号
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
中断源
RESET TRAP TLI AWU CLK EXTI0 EXTI1 EXTI2 EXTI3 EXTI4 CAN CAN SPI TM1 TM1 TM2 TM2 TM3 TM3
广东工业大学物理与光电工程学院
中断屏蔽和处理流程
中断屏蔽是通过CC寄存器的位I1和位I0以及 设置每个中断向量的软件优先级的ITC_SPRx 来管理的。
广东工业大学物理与光电工程学院
图6-3 中断嵌套示意图
6.2.2 中断响应条件与处理过程
中断响应条件: 对于可屏蔽中断,当一个中断请求出现时,
外设与CPU之间的通信方式有三种: 查询方式 中断方式 直接存储器存取(DMA)方式。
广东工业大学物理与光电工程学院
6.1.1 查询方式
查询方式包括查询输出方式和查询输入方式。 所谓查询输入方式,是指CPU读外设数据前, 先查询外设是否处于准备就绪状态(即外设是 否已将数据输出到CPU的数据总线上);查询 输出方式是指CPU向外设输出数据前,先查询 外设是否处于空闲状态(即外设是否可以接收 CPU输出的数据)。
4、中断处理过程
中断处理过程涉及中断查询和响应两个方面。
2020/7/1
广东工业大学物理与光电工程学院
6.2 STM8S中断系统
6.2.1 中断源及其优先级 6.2.2 中断响应条件与处理过程 6.2.3 外中断源及其初始化 6.2.4 中断服务程序结构
广东工业大学物理与光电工程学院
6.2.1 中断源及其优先级
广东工业大学物理与光电工程学院
(2) ITC_SPR1寄存器中的VECT0SPR[1:0]对应顶级中断 TLI,即PD7引脚中断,其中断优先级被系统强制置为11(最 高级),不可更改,且属于不可屏蔽中断,即TLI中断有效时, 可中断优先级为3的任意一个可屏蔽中断源的中断服务程序。
(3) 不可屏蔽中断事件RESET、TRAP优先级被默认为 11(最高),因此没有软件优先级寄存器位与之对应。一旦这 两个中断有效,CPU响应后CC寄存器内的中断优先级标志I1、 I0位自动置1。
(4) 优先级10最低,分配给主程序使用。因此,不允许 将中断优先级设为10。如果将某一个中断优先级设为10, 为使对应中断请求得到响应,STM8 CPU将保留该中断源 先前的优先级。换句话说,当前中断优先级设置操作无效。
(5) 当两个或两个以上可屏蔽中断源具有相同的软件 优先级时,硬件查询顺序如表6-1所示,即1号中断(自动 唤醒中断AWU)优先级最高,CLK中断次之,而24号中断 (FLASH)优先级最低。未被响应的中断请求处于等待状态。
发送完成
是
更新/上溢出/下溢出/触发/刹车
捕获/比较 更新/上溢出
捕获/比较
更新/上溢出
捕获/比较 发送完成
接收寄存器满
I2C中断
是
发送完成
接收寄存器满
转换结束
更新/上溢出
编程结束/禁止编程 广东工业大学物理与光电工程学院
保留
从活跃停机(Active Halt)模式唤醒功能
是
是 是 是 是 是 是 是 是
是
向量地址
8000h 8004h 8008h 800Ch 8010h 8014h 8018h 801Ch 8020h 8024h 8028h 802Ch 8030h 8034h 8038h 803Ch 8040h 8044h 8048h 804Ch 8050h 8054h 8058h 805Ch 8060h 8064h 8068h 806Ch到 807Ch
(6) 对于RESET、TRAP、TLI不可屏蔽源来说,复位中断 RESET级别最高,只要复位中断RESET有效,任何时候CPU 均可响应。而当TRAP(软件中断)、TLI (顶级硬件中断)同时 有效时,CPU先响应TRAP中断请求,如图6-2所示。
基于如下资源的中断管理:
● 位I1和I0位于CPU的条件代码寄存器(CCR)
下面以CPU向外设输出数据为例,简要介绍查 询传输方式的工作过程:当CPU需要向外设输 出数据时,先将控制命令(如外设的启动命令) 写入外设的控制端口,然后不断读外设的状态 口,当发现外设处于空闲状态后,就将数据写 入外设的数据口,完成数据的输出过程。
广东工业大学物理与光电工程学院
查询方式优缺点: 硬件开销少、传输程序简单,但缺点是CPU 占用率高,因为在外设未准备就绪或处于非空闲 状态前,CPU一直处于查询状态,不能执行其他 操作,任何时候也只能与一个外设进行数据交换。
STM8中断控制器处理2种类型的中断源:
● 不可屏蔽的中断: RESET,TLI 和 TRAP
● 可屏蔽中断: 外部中断或者内嵌的外设中断 。
不可屏蔽中断源 不可屏蔽中断不会考虑CC寄存器的I1和I0的状态。仅仅当TRAP 中断发生时候将PC,X, Y, A 和 CC 寄存器的内容压栈。相应的向量载入到PC寄存 器中同时置位I1和I0位禁止中断(3级优先级)。 STM8S支持32个中断,中断服务程序入口地址称为中断向量,放在 8000H~807FH之间。每个中断向量占4个字节,共4x32(128字节)。中断服 务程序可放在16MB任一存储区。
广东工业大学物理与光电工程学院
1. 中断源 在计算机控制系统中,把引起中断的事件称为中断
源。在单片机控制系统中,常见的中断源有:
1.外部中断,如CPU某些特定引脚电平变化引起的中断。
2.各类定时/计数器溢出中断即定时时间到或计数器满中断)。
3.EEPROM 或FlashRom操作(擦除、写入)结束中断。
必须满足一列条件,CPU才会响应。 ① 对应中断必须处于允许状态。 ② 该中断优先级(ITC_SPRx寄存器对应位定
义)必须高于当前正在执行的中断服务程 序的优先级(记录在寄存器CC的I1、I0 位)。
广东工业大学物理与光电工程学院
当一个中断请求必须被响应时:
1. 在当前正在执行指令结束之后,正常的操作被悬起; 2. PC,X,Y,A和CC寄存器被自动压栈,9个字节; 3. 根据ITC_SPRx寄存器中的值对应的中断服务向量,CC寄存
VECT10SPR[1:0]
VECT9SPR[1:0]
VECT8SPR[1:0]
ITC_SPR4 VECT15SPR[1:0]
VECT14SPR[1:0]
VECT13SPR[1:0] VECT12SPR[1:0]
ITC_SPR5 VECT19SPR[1:0]
VECT18SPR[1:0]
VECT22SPR[1:0] VECT16SPR[1:0]
● 软件优先级寄存器 (ITC_SPRx)
● 复位向量地址0x00 8000位于程序空间的起始部分。对于具有启 动ROM的型号,ST公司把 复位初始化程序固化在ROM区中。 ● 固定的中断向量地址位于程序空间映像的高位地址段(0x00 8004 to 0x00 807C),其地址顺 序即为硬件的优先顺序。
器中的位I1和I0被相应设置; 4. 通过中断向量载入中断服务子程序的入口地址,接着对中断
服务子程序的第一条指令取址。 5.中断服务子程序必须以IRET指令结束,该指令会把堆栈中的
保存的寄存器内容出栈,同时由于运 行IRET指令,位I1和位 I0被重新恢复,程序也恢复运行。
广东工业大学物理与光电工程学院
6.2.3 外中断源及其初始化
UART1 UART1
I2C UART2/3 UART2/3
ADC TIM4 FLASH
描述
从停机(Halt) 模式 唤醒功能
复位
是
软件中断
外部最高级中断
自动唤醒HALT模式中断
时钟控制器
端口A外部中断
是
端口B外部中断
是
端口C外部中断
是
端口D外部中断
是
端口E外部中断
是
CAN RX 中断
是
CAN TX/ER/SC 中断
广东工业大学物理与光电工程学院
6.1.2 中断通信方式
采用中断传输方式就可以克服查询传输方式存在的缺陷: 当CPU需要向外设输出数据时,将启动命令写入外设控 制口后,就继续执行随后的指令序列,而不是被动等待; 当外设处于空闲状态,可以接收数据时,由外设向CPU 发出允许数据传送的请求信号——即中断请求信号,如 果满足中断响应条件,CPU将暂停执行随后的指令序列, 转去执行预先安排好的数据传送程序——称为中断服务 程序,CPU响应外设中断请求的过程简称为中断响应; 待完成了数据传送后,再返回断点处继续执行被中断了 的程序——这一过程称为中断返回。可见,在这种方式 中,CPU发出控制命令后,将继续执行控制命令后的指 令序列,而不是通过检测外设的状态来确定外设是否处 于空闲状态,这不仅提高了CPU的利用率,而且能同时 与多个外设进行数据交换——只要合理安排相应中断的 优先级以及同优先级中断的查询顺序即可。因此,中断 传输方式是CPU与外设之间最常见的一种数据传输方式。