中断嵌套实验

使用汇编语言,要求:

外部中断1可以嵌套外部中断0

没有中断时,8个LED发光二极管以0.1s的速度闪烁。

有外部中断0时,8个LED发光二极管以0.1s的速度流水点亮。(中断子程序0)

有外部中断1时,会打断外部中断0,8个LED发光二极管会常亮10秒(中断子程序1)

允许外部中断0和外部中断1,外部中断触发方式设置(IT0,IT1),中断入口设置,设置中断优先级。

程序段: 

      org   0000h
      jmp   Start
      ORG	0003H
      JMP	INT00
	  ORG   0013H
	  JMP   INT11
      ORG   0100H
Start:	
      MOV 	SP,#60H
      SETB	EA 
      SETB	EX0
	  SETB  EX1
      ClR   IT0
	  CLR   IT1
	  SETB  PX1
      CLR 	A  
Loop:	
	  CPL  	A  
	  MOV	P0,A  
	  LCALL DELAY 
      JMP  	Loop

DELAY: 
	  MOV 	R6,#200
D1:      
	  MOV 	R7,#248   
      DJNZ 	R7,$      
      DJNZ 	R6,D1
      RET 

;----中断子程序0程序示例------
INT00:
	  MOV 	R1,#9
	  MOV	A,#0ffH
 LOOP1:		 
	  MOV	P0,A   
	  LCALL	DELAY		
	  SETB	C 
	  RLC	A 
	  DJNZ 	R1,LOOP1
	  RETI 
;----中断子程序1----
INT11:
	 MOV A,#00H
	 Mov P0,A
	 MOV R1,#9
LOOP1:		  
	 LCALL	DELAY		
	 DJNZ 	R1,LOOP1
	 RETI

注释:

1.org:汇编起始地址命令

org伪指令规定程序存放的起始地址。如果不用org,则汇编得到的目标程序将从0000H地址开始。

例如:

ORG 2000H

Start:Mov A,#00H

即规定标号START代表从地址2000H开始存放程序。

2. 中断允许寄存器IE

 3.TCON寄存器:IT1,IT0选择外部中断请求是什么方式。

 4.流水灯点亮

INT00:
	  MOV 	R1,#9
	  MOV	A,#0ffH
 LOOP1:		 
	  MOV	P0,A   
	  LCALL	DELAY		
	  SETB	C 
	  RLC	A 
	  DJNZ 	R1,LOOP1
	  RETI 
;1111 1111
;1111 1110
;1111 1100

5.我不知道DELAY可以延时多久,所以我不知道R1应该置多少。

;----中断子程序1----
;需要常亮10秒
INT11:
	MOV A,#00H
	Mov P0,A
      ;全亮
	MOV 	R1,#9
	;循环10秒(这里R1该置多少?)
LOOP1:		  
	LCALL	DELAY		
	DJNZ 	R1,LOOP1
	RETI

6.关于外部中断1触发方式设置不同的方式,带来的影响?

IT1=0,电平触发方式

IT1=1,跳沿触发方式

???

学习这篇文章:

(2条消息) 电平触发和边沿触发的区别_下降沿触发_Pilgrim2017的博客-CSDN博客

 电平触发:高或低电平保持的时间内触发

边沿触发:由高到低或由低到高这一瞬间触发

在数字电平变化的电压上升沿或下降沿到一定阈值时就产生触发,即边沿触发。

当电压达到数字电平的高或低电压一段时间后(一般是最小脉冲宽度的三分之一),才产生触发是电平触发。

边沿触发的话,电平保持多久都只产生一次。

电平触发的话,只要一直保持对应的电平,就会不断触发。

比如:按下开关,边沿触发的话,应该只会触发一次中断。

而电平触发的话,会不断响应。(个人理解,不知道对不对)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个简单的 STM32 中断嵌套实验: 首先,需要在 CubeMX 中配置需要使用的中断,例如 TIM2 的更新中断和外部中断 EXTI0。配置完毕后,需要在代码中开启全局中断和相应的中断优先级,例如: ```c HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); HAL_NVIC_EnableIRQ(TIM2_IRQn); HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); __enable_irq(); ``` 其中,`HAL_NVIC_SetPriority`函数用于设置中断优先级,第一个参数是中断号,第二个参数是抢占优先级,第三个参数是子优先级;`HAL_NVIC_EnableIRQ`函数用于开启中断。 接下来,需要在中断服务函数中进行嵌套中断的处理。例如,在 TIM2 更新中断中调用一个函数,该函数会触发 EXTI0 外部中断: ```c void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM2) { // 在 TIM2 更新中断中调用函数 trigger_external_interrupt trigger_external_interrupt(); } } void trigger_external_interrupt() { // 触发 EXTI0 外部中断 HAL_GPIO_EXTI_Callback(GPIO_PIN_0); } ``` 在 EXTI0 外部中断服务函数中,可以再次触发 TIM2 更新中断: ```c void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == GPIO_PIN_0) { // 在 EXTI0 外部中断中调用函数 trigger_tim2_interrupt trigger_tim2_interrupt(); } } void trigger_tim2_interrupt() { // 触发 TIM2 更新中断 HAL_TIM_IRQHandler(&htim2); } ``` 这样就实现了中断的嵌套处理。需要注意的是,中断服务函数中的代码应该尽量简洁,不要阻塞中断的处理,以免影响系统的实时性。同时,中断优先级的设置也需要根据具体的应用场景进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lpl还在学习的路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值