STM8S提供2种中断管理模式:
STM8同时发生中断管理模式
在该模式下,所有的中断的中断优先级都是3级,因此它们都是不可以被中断的(除了被TLI,RESET或TRAP中断之外)。
硬件的中断优先级按如下顺序排列,从低到高的优先级是:MAIN,IT4,IT3,IT2,IT1,IT0,TRAP/TLI(同等优先级)以及RESET。
图19所示是一个同时发生中断管理模式的例子。
(图18:同时发生中断管理模式)
STM8嵌套中断管理模式
在该模式下,允许在中断子程序中响应中断。一旦一个中断的优先级被设置低于3级时该模式就立即有效。
硬件优先级从低到高按如下顺序给定,即MAIN,IT4,IT3,IT2,IT1,IT0和TRAP。
通过设定ITC_SPRx寄存器的相应的I1_x和I0_x位来配置每一个中断向量的软件优先级。I1_x和I0_x位具有和CC寄存器的I1和I0位相同的意思(见表14)。
不可以将中断优先级设为级别0(I1_x=1,I0_x=0),在这种情况下,该中断的优先级将保持为先前的值。例如:如果先前的值是CFh,然后编程的值是64h,那么结果是44h。
RESET和TRAP向量是没有软件优先级的。当两者的任何一个被响应时,CC寄存器的位I1和I0两位都被置位。
注意:在STM8中断被响应时如果位I1和I0被修改,那么设备将作如下处理:如果一个中断X仍然处在悬起状态(新的中断或者中断标志没有被清除)同时该新的优先级又比先前的优先级高的话,那么该中断X会被重新响应。否则该中断的软件优先级在下一个中断请求(X中断的IRET之后)来之前保持不变。
在中断子程序的执行过程中,执行HALT,POP CC,RIM,SIM和WFI指令会改变当前的软件优先级直到下一条IRET指令被执行或者先前提到的指令之一被执行。图20所示嵌套中断管理的例子。
---------------------------------------------------------------------------
警告:没有标志位及中断来指示堆栈发生溢出
----------------------------------------------------------------------------
向量地址 | ITC_SPRx寄存器位
|
8008h | I1_0 and I0_0 bits(1) |
800Ch | I1_1 and I0_1 bits |
… | … |
80C7h | I1_29 and I0_29 bits |
(表14向量地址映象对应软件的优先级位)
1.ITC_SPRx寄存器对应于TLI的位可以被读写,但是它们对中断处理的管理是没有作用的。
(图20:嵌套中断管理)
关键字:STM8 嵌套 中断管理
引用地址:
STM8 同时的和嵌套的中断管理
推荐阅读最新更新时间:2024-11-07 15:21
STM8定时器初始化和GPIO初始化顺序导致GPIO动作不正确
现象 用定时器TIM4定时翻转GPIO用低电平灌电流驱动LED闪烁的简单测试程序不能正常执行。LED灯不闪烁,debug查看GPIO口却是正确的被翻转了。测试IO口电压不对。 问题代码 void main(void) { // 系统时钟不分频(内部16MHz) CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); // TIM4进行128分频,同时设置溢出上限值保证1ms一次中断 TIM4_TimeBaseInit(TIM4_PRESCALER_128, 124); // 开TIM4更新事件中断 TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
[单片机]
STM8 自动唤醒AWU
简介 AWU是用来当MCU进入低功耗的活跃停机(Active Halt) 模式时提供一个内部的唤醒时间基准。该时间基准的时钟是由内部的低速RC振荡器时钟(LSI)或者通过预分频的HSE晶振时钟来提供的。 LSI 时钟测量 在使用LSI低速内部时钟时,为了确保最好的精度,它的频率可以通过TIM3的输入捕捉1 来测定。 AWU 时钟框图 AWU功能描述 AWU 操作 为了使用AWU功能,按顺序执行如下步骤: 1. 使用AWU_CSR寄存器的MSR位和TIM3的输入捕捉通道1来检测LS的时钟频率; 2. 通过写AWU_APR 的APR 位来定义适当的预分频值; 3. 通过写AWU_TBR 的AWUTB 来
[单片机]
STM8 时钟修改
系统功能 对STM8的时钟修改,并用LED进行显示,观察LED的闪烁速度是否有变化。 硬件设计 LED控制电路原理图 软件设计 /********************************************************************* 微 雪 电 子 WaveShare http://www.waveShare.net 目标系统: 基于STM8单片机 应用软件: Cosmic CxSTM8 说 明: 若用于商业用途,请保留此段文字或注明代码来源 深 圳 市 微 雪 电 子 有 限 公 司 保 留 所 有 的 版 权 *******************************
[单片机]
TIM2定时器中断与中断嵌套
/************************************************************ Copyright (C), 2012-2022, yin. FileName: main.c Author: ycw Version : 1.0 Date: 2012.04.22 Description: TIM2 EXIT0 NVIC Version: V1.0 Function List: TIM2 EXIT0 NVIC History: author time version desc YCW 12/04/22 1.0
[单片机]
STM8单片机+RC522电路原理图+读写卡源代码
基于stm8的ds1302模块千万别把数据写在第3个区,不然卡就锁住了,只能写在第2个区 电路原理图如下: stm8单片机源码: /* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/ #include stm8s.h #include stm8s_clk.h #include intrinsics.h #include stm8s
[单片机]
STM8的AWU应用体会
AWU——STM8中的精简RTC 今天使用STM8L001进行了类似RTC定时从停止模式唤醒MCU的实验。不知为何,在STM8S系列部分芯片(我没一个个去查看)和STM8L001、STM8L101等个别芯片上是没有RTC模块的,取而代之的是其阉割版 —— AWU模块。 因为只能配置自动唤醒闹钟,没有设置日历的功能。 这个AWU看文档配置起来极其简单,但实际操作起来还是有些坑的。我以实验用的STM8L001为例。 文档说第一步要测量LSI的时钟频率。 后面的步骤在库文件的AWU_Init函数中都已经有了过程。 怎么测量LSI的时钟频率呢? 这写的一堆是干嘛呢…我比较懒,就去库文件中找了找,发现了几个好东西。 在s
[单片机]
【STM8】串口数据一直卡在读中断
▪ 现象 STM8 UART1 开启了读中断,初始化代码如下: // 配置串口参数为:波特率115200,8位数据位,1位停止位,无校验,禁止同步传输,允许接收发送 UART1_Init((u32)115200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE); // 启用 UART1 中断 // UART1_IT_RXNE_OR 表示 接收数据寄存器非空或者溢出错误时 触发中断 UART1_ITConfig(UART1_IT_RXNE_OR, ENA
[单片机]
STM8 tim1 ch1 PWM输出
// 函数功能:初始化定时器1 的通道1,用于控制LED 的亮度 // 输入参数:无 // 输出参数:无 // 返回值:无 // 备注:无 void Tim1_Init() { /* Set the Autoreload value */ TIM1- ARRH = (uint8_t)(1000 8); //2M/1000=2K TIM1- ARRL = (uint8_t)(1000); /* Set the Prescaler value */ TIM1- PSCRH = 0x00; //8分频 16M/8=2M TIM1- PSCRL = 0x08; TIM1- CCR1
[单片机]