第七章——中断控制器(2)初始化命令字和初始化流程

8259A的初始化命令字

在这里插入图片描述
(1)ICW1的格式和含义
ICW1叫芯片控制初始化命令字,需要写到偶地址端口
在这里插入图片描述
D7~D5:可为1也可为0
D4:此位作为ICW1标识位以区分于操作命令字OCW2和OCW3,因为OCW2和OCW3也要求写入偶地址端口,D4=1作为指示ICW1的标志
D3(LTIM):设定中断请求信号的形式,0为边沿触发方式,1为电平触发方式
D2:可为1也可为0
D1(SNGL):指出本片是否与其他8259A处于级联状态,系统中只有一片8259A时为1,多片时主片和从片的该位均为0
D0(IC4):用来指出后面是否将设置ICW4。如初始化程序中使用ICW4,则该位为1(由于要使用ICW4的第0位设置1来表示本系统为非8位系统,所以16位和32位系统中,ICW4必须使用,即D0(IC4)为1)

(2)ICW2的格式和含义
ICW2是设置中断类型号的初始化命令字,必须写到奇地址端口中
中断类型号的具体取值不但和ICW2有关,也和引入中断的引脚IR0-IR7有关。
在这里插入图片描述
1.ICW2是任选的,而一旦ICW2确定,IR0-IR7所对应的8个中断类型号也确定了
2.ICW2的低3位并不影响中断类型号的具体数值,只有ICW2的高5位影响中断类型号,而低3位(写入多少都无效)是由引入中断请求的引脚IR0-IR7决定的

(3)ICW3的格式和含义
ICW3是标志主片/从片的初始化命令字,需要写到奇地址端口中
当ICW1的D1(SNGL)位为0时才设置ICW3
主片格式:
在这里插入图片描述
D7 ~ D0对应于IR0-IR7引脚上的连接情况,如某一引脚上连有从片,则对应位为1,否则为0

从片格式:
在这里插入图片描述
D2 ~ D0的值与从片的输出端INT到底连在主片的哪条中断请求输入引脚有关,如某从片的INT引脚连在主片的IR5引脚上,则此从片的ICW3中的D2 ~ D0应为101

(4)ICW4的格式和含义
ICW4叫方式控制初始化命令字,要求写入奇地址端口
在这里插入图片描述
D7 ~ D5:这3位总是为0,用来作为ICW4的标识码
D4(SFNM):如为1,则为特殊全嵌套方式。这种系统中,一般包含多片8259A
D3(BUF):如为1,则为缓冲方式,为0则用非缓冲方式
D2(M/S ):表示本片为主片还是从片。为1时为主片。BUF=0时,该位不起作用,可为1也可为0
D1(AEOI):AEOI为1,则设置中断自动结束方式。此方式下,当第二个INTA脉冲结束时,当前中断服务器ISR中的相应位会自动清除
D0:为1表示非8位系统

8259A的初始化流程

8259A进入工作之前,必须用初始化命令字将系统中的每片8259A进行初始化。
在这里插入图片描述

对8259A设置初始化命令字的例子,这里8259A的端口地址为80H(偶),81H(奇)
在这里插入图片描述
1.设置ICW1:00010011(边沿、无级联、采用ICW4)
2.设置ICW2:00011000(设置IR7-IR0的中断类型号)
3.设置ICW4:00001101(不采用特殊全嵌套、缓冲、主片、不采用自动结束、非8位)

8259A的操作命令字

(1)OCW1的格式和含义
OCW1叫做中断屏蔽操作命令字,要求写入奇地址
在这里插入图片描述
某位为1时,对应于此位的中断请求受到屏蔽

(2)OCW2的格式和含义
用来设置优先级循环方式和中断结束方式的操作命令字,要求写入偶地址端口
在这里插入图片描述R:决定了系统的中断优先级是否按循环方式设置,为1采用优先级循环方式,为0则为非循环方式
EOI:中断结束命令位,当EOI为1时,使当前中断服务寄存器中的对应位ISn复位。即当AEOI为0时,ISn位必须用EOI命令来清除。
SL:决定了L2、L1、L0是否有效,如为1,则有效
L2、L1、L0:
1.当OCW2给出特殊的中断结束命令时,L2、L1、L0指出了了具体要清除当前中断服务寄存器中的哪一位
2.当OCW2给出特殊的优先级循环方式命令字时,L2、L1、L0指出了循环开始时哪个中断的优先级最低
注:两种情况下,SL位都为1
1.当EOI=1,SL=0时,则使当前中断处理子程序对应的ISn被清除
2.当R=1,SL=0时,使当前的优先级次序左移一位
在这里插入图片描述

(3)OCW3的格式和含义
操作命令字OCW3有三方面的功能:一是设置和撤销特殊屏蔽方式;二是设置中断查询方式;三是设置对8259A内部寄存器的读出命令。必须写入偶地址

ESMM为特殊的屏蔽模式允许位,SMM为特殊屏蔽模式位,当ESMM=SMM=1时,只要CPU内部的IF为1,系统就可响应任何未被屏蔽的中断请求,这时,再发送一个ESMM=1,SMM=0的OCW3时,系统又恢复原来的优先级方式,若ESMM=0,则SMM不起作用,故ESMM称为SMM的允许位。
P:查询方式位,当P=1时,8259A设置为中断查询方式。当CPU往8259A发出查询命令后,再执行一条输入指令,就将一个读信号RD 送到8259A,8259A收到这个读信号就好像收到两个INTA 脉冲一样,使当前中断服务寄存器中的某一位置1,并将查询字送到数据总线。查询字中表明了当前外设有无中断请求,并且表明了当前优先级最高的中断请求到底是哪个。

查询字格式:
在这里插入图片描述
P=1时,若优先级次序为IR3~IR2,当前在IR3和IR1引脚上有中断请求,CPU可得到如上查询字。这个查询字说明当前级别最高的中断请求为IR4,于是CPU便可转入IR4中断处理程序。

当P=0时,通过使OCW3中的RR位为1,便可构成对8259A内部寄存器的读出命令来读取寄存器IRR和ISR的内容。先使用输出指令往偶地址端口发读出命令,接着用输出指令从偶地址读取寄存器IRR或ISR的内容。

初始化命令字一般是在系统启动时由初始化程序一次性写入的,而操作命令可由任何程序在任何时候多次写入。

中断全嵌套的例子

在这里插入图片描述
全嵌套方式工作的条件:
1.主程序必须执行开中断指令,使IF为1,才有可能响应中断
2.每当进入中断处理程序时,系统会自动关中断,所以,只有中断处理程序中再次打开中断,才有可能与较高级的中断形成嵌套结构
3.每个中断处理程序结束时,必须执行中断结束命令,清除对应的ISn位,才能返回断点

使用中断结束命令的例子

在这里插入图片描述
注:
1.用OCW2去构成中断结束命令,将此命令发往偶地址端口(用于中断结束)
2.进入中断处理程序后,只有执行STI指令,才能允许其他中断处理程序进行嵌套,如果一个中断处理程序一直没有执行STI指令,那么,这个中断处理程序执行过程中就不会受其他中断处理程序嵌套。
但当中断处理程序执行完最后一条指令即IRET之后(恢复进入中断前的标志寄存器的值),系统便开放中断,从而允许新的中断请求进入。

关于优先级设置和中断结束命令的小结

(1)关于优先级的设置方法
1.全嵌套方式是8259A默认的工作方式。若未设置其他方式,就为全嵌套方式,IR0优先级最高。
2.特殊全嵌套方式用ICW4设置的,其中D4(SFNM)=1位特殊全嵌套方式,这种方式下,IR0优先级最高。
3.优先级自动循环方式是用OCW2命令设置的,其中R=1,SL=0,EOI=0。
4.优先级特殊循环方式用OCW2命令设置的,其中R=1,SL=1,EOI=0,最低优先级由L2L1L0给出(指定的是最低优先级)

(2)关于中断结束方式的设置方法
1.中断自动结束方式用ICW4设置,其中D1(AEOI)=1为中断自动结束方式
2.一般中断结束方式用OCW2命令设置,其中R=0,SL=0,EOI=1。
3.特殊中断结束方式用OCW2命令设置,其中R=0,SL=1,EOI=1。

(3)优先级循环方式和中断结束方式一起设置的命令
1.优先级自动循环方式和一般中断结束方式由OCW2命令设置,R=1,SL=0,EOI=1
2.优先级特殊循环方式和特殊中断结束命令有OCW2命令设置,R=1,SL=1,EOI=1

### 使用STM32F4标准外设库对Timer 7进行1ms中断初始化 为了实现基于STM32F4系列微控制器的定时器7 (TIM7)1ms中断初始化,需遵循以下方法: #### 定时器配置概述 TIM7 是一个高级控制定时器,在 STM32F4 中可用作通用计数器或生成周期性事件。通过将其配置为自动重载模式并启用更新中断,可实现精确的时间间隔触发。 以下是具体实现方式及其相关代码示例: --- #### 配置步骤 ##### 1. RCC 初始化 使能 TIM7 所需的时钟源。这一步确保定时器模块获得工作所需的时钟信号。 ```c RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE); ``` ##### 2. 设置预分频系数 (PSC) 设定预分频寄存器值以调整输入到计数器的实际频率。假设系统核心时钟为 168 MHz,则 PSC 计算如下: \[ \text{Prescaler} = (\frac{\text{System Clock}}{\text{Desired Frequency}} - 1) \] 对于目标时间基底为 1 ms 系统时钟为 168 MHz 的情况, \[ \text{Prescaler Value} = (\frac{168\cdot10^6}{1000}) - 1 = 167999 \] 因此,设置 `TIM_Prescaler` 值为 167999。 ```c TIM_TimeBaseStructure.TIM_Period = 999; // 自动重装载值 TIM_TimeBaseStructure.TIM_Prescaler = 167999; ``` ##### 3. 设定计数值范围 (ARR) 指定计数器的最大值(即自动重装值)。这里我们希望每次达到该最大值后产生一次中断,故将 ARR 设置为 999 来匹配我们的需求——每千次计数完成一轮循环。 ```c TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 不使用时钟分割 TIM_TimeBaseInit(TIM7, &TIM_TimeBaseStructure); // 应用上述参数至 TIM7 ``` ##### 4. 更新中断使能与优先级分配 允许 TIM7 的更新事件触发中断请求,并合理安排其在 NVIC 中的地位以便及时响应。 ```c TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); ``` ##### 5. 启动定时器 最后启动 TIM7 并进入运行状态等待第一次溢出发生从而引发相应的 ISR 处理流程。 ```c TIM_Cmd(TIM7, ENABLE); ``` --- #### 中断服务程序(ISR) 当定时器到达预定周期结束时会跳转执行此部分逻辑来处理实际业务操作比如 LED 切换或其他实时任务调度等功能。 ```c void TIM7_IRQHandler(void){ if(TIM_GetITStatus(TIM7,TIM_IT_Update)!=RESET){ // 清除标志位以防重复调用 TIM_ClearITPendingBit(TIM7,TIM_IT_Update); // 用户自定义功能写在此处... } } ``` [^1] 参考站内引用: 引用[1]: STM32H743xx基本定时器TIM17相关内容描述了如何初始化以及管理定时器资源的方法论。 [^2] 关于STM32F4xx使用DMA+TIM3_PWM调试灯带WS2812过程中提到的具体开发环境工具链同样适用于本案例中的标准外设库应用情境。 [^3] 软件STM32cubeIDE下STM32F4xx使用32位定时器2(TIM2)用DMA+PWM点亮灯带WS2812的基础样例提供了有关不同型号间差异性的见解。 [^5] stm32h7xx_hal.c文件学习中涉及到了一些基础概念如滴答定时器机制等知识点也间接支持理解此处所讨论的内容结构框架构建思路。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值