中断,特别是外部中断,是MCU实现复杂功能的重要手段。
中断源和向量:
所有I/O引脚都具有外部中断能力,每一个端口都有独立的中断向量以及独立的标志
各功能外设的中断
最多32个中断向量(入口地址已由硬件固定),最多40个外部中断源(4级可编程的软件嵌套优先级),其中的11个中断向量被分配为外部中断。
优先级及响应逻辑:
复位具有最高优先级,复位期间所有中断被禁止。
同一时间可以有几个中断排队等待处理时:
1. 最高软件优先级的中断被响应;(通过ITC->SPRx寄存器I1和I0配置每一个中断的软件优先级)
2. 如果几个排队的中断具有相同的软件优先级,那么最高硬件优先级的中断先响应。//中断的硬件优先级是唯一且互斥的
硬件中断优先级低->高:MAIN、IT4、IT3、IT2、IT1、IT0、TRAP和RESET。中断屏蔽可通过CC寄存器的位I1和位I0以及设置软件优先级的ITC->SPRx实现。PD7是最高优先级的硬件中断源TLI入口。
中断的管理
1、并发中断管理模式所有优先级都是3级,除响应RESET、TRAP、TLI中断,不可以被打断;
2、嵌套中断管理模式允许在中断程序中响应中断;一旦有中断的优先级低于3级该模式立即有效;
使用中断控制器ITC对各中断进行管理:
不可屏蔽的事件: RESET, TRAP;不可屏蔽的最高优先级的硬件中断TLI
不可屏蔽的中断: RESET,TLI和TRAP拥有最高的软件优先级来处理,不考虑CC寄存器的I1和I0的状态。
在TLI中断服务子程序中禁止使用TRAP指令,TLI中断可中断(除TRAP及RESET之外)3级软件中断,软件中断TRAP不能使处理器从停机Halt模式退出。
简单中断的配置和使用(以STM8L151为例):
GPIO_Init(KEY_PORT, KEY_Pin, GPIO_Mode_In_FL_IT);
EXTI_DeInit ();
EXTI_SetPinSensitivity(EXTI_Pin_4,EXTI_Trigger_Falling);
如果使用寄存器来配置中断:
寄存器EXTI->CR1功能定义
寄存器EXTI->CR2功能定义
使能中断
{asm("rim"); }== {enableInterrupts();}
其在stm8l15x.h文件中对中断的定义如下:
#define enableInterrupts() __enable_interrupt() /* enable interrupts */
#define disableInterrupts() __disable_interrupt() /* disable interrupts */
#define rim() __enable_interrupt() /* enable interrupts */
#define sim() __disable_interrupt() /* disable interrupts */
详细的32个中断向量定义:
#define FLASH_EOP_vector 0x03
#define FLASH_WR_PG_DIS_vector 0x03
#define DMA1_CH0_HT_vector 0x04
#define DMA1_CH0_TC_vector 0x04
#define DMA1_CH1_HT_vector 0x04
#define DMA1_CH1_TC_vector 0x04
#define DMA1_CH2_HT_vector 0x05
#define DMA1_CH2_TC_vector 0x05
#define DMA1_CH3_HT_vector 0x05
#define DMA1_CH3_TC_vector 0x05
#define RTC_ALARM_vector 0x06
#define RTC_WAKEUP_vector 0x06
#define EXTIE_vector 0x07
#define EXTIF_vector 0x07
#define EXTIPVD_vector 0x07
#define EXTIB_vector 0x08
#define EXTID_vector 0x09
#define EXTI0_vector 0x0A
#define EXTI1_vector 0x0B
#define EXTI2_vector 0x0C
#define EXTI3_vector 0x0D
#define EXTI4_vector 0x0E
#define EXTI5_vector 0x0F
#define EXTI6_vector 0x10
#define EXTI7_vector 0x11
#define CLK_CSS_vector 0x13
#define CLK_SWITCH_vector 0x13
#define TIM1_BIF_vector 0x13
#define COMP_EF1_vector 0x14
#define COMP_EF2_vector 0x14
#define TIM2_OVR_UIF_vector 0x15
#define TIM2_CAPCOM_BIF_vector 0x16
#define TIM2_CAPCOM_CC1IF_vector 0x16
#define TIM2_CAPCOM_CC2IF_vector 0x16
#define TIM2_CAPCOM_TIF_vector 0x16
#define TIM3_OVR_UIF_vector 0x17
#define TIM3_CAPCOM_BIF_vector 0x18
#define TIM3_CAPCOM_CC1IF_vector 0x18
#define TIM3_CAPCOM_CC2IF_vector 0x18
#define TIM3_CAPCOM_TIF_vector 0x18
#define TIM1_OVR_UIF_vector 0x19
#define TIM1_CAPCOM_CC1IF_vector 0x1A
#define TIM1_CAPCOM_CC2IF_vector 0x1A
#define TIM1_CAPCOM_CC3IF_vector 0x1A
#define TIM1_CAPCOM_CC4IF_vector 0x1A
#define TIM1_CAPCOM_COMIF_vector 0x1A
#define TIM1_CAPCOM_TIF_vector 0x1A
#define TIM4_TIF_vector 0x1B
#define TIM4_UIF_vector 0x1B
#define SPI_MODF_vector 0x1C
#define SPI_OVR_vector 0x1C
#define SPI_RXNE_vector 0x1C
#define SPI_TXE_vector 0x1C
#define SPI_WKUP_vector 0x1C
#define USART_T_TC_vector 0x1D
#define USART_T_TXE_vector 0x1D
#define USART_R_IDLE_vector 0x1E
#define USART_R_OR_vector 0x1E
#define USART_R_PE_vector 0x1E
#define USART_R_RXNE_vector 0x1E
#define I2C_ADD10_vector 0x1F
#define I2C_ADDR_vector 0x1F
#define I2C_AF_vector 0x1F
#define I2C_ARLO_vector 0x1F
#define I2C_BERR_vector 0x1F
#define I2C_BTF_vector 0x1F
#define I2C_OVR_vector 0x1F
#define I2C_RXNE_vector 0x1F
#define I2C_SB_vector 0x1F
#define I2C_STOPF_vector 0x1F
#define I2C_TXE_vector 0x1F
#define I2C_WUFH_vector 0x1F
上一篇:STM8->GPIO
下一篇:STM8L15x系列DAC的使用
推荐阅读最新更新时间:2024-03-16 16:23