320 likes | 748 Views
STM32 外部中断(EXIT). NIVC介绍. ARM cortex_m3内核支持256个中断(16个内核+240外部)和可编程256级中断优先级的设置,与其相关的中断控制和中断优先级控制寄存器(NVIC、SYSTICK等)也都属于cortex_m3内核的部分。STM32采用了cortex_m3内核,所以这部分仍旧保留使用,但STM32并没有使用cortex_m3内核全部的东西(如内存保护单元MPU等),因此它的NVIC是cortex_m3内核的NVIC的子集。 STM32目前支持的中断共为84个(16个内核+68个外部),和16级可编程中断优先级的设置。. NIVC介绍.
E N D
NIVC介绍 • ARM cortex_m3内核支持256个中断(16个内核+240外部)和可编程256级中断优先级的设置,与其相关的中断控制和中断优先级控制寄存器(NVIC、SYSTICK等)也都属于cortex_m3内核的部分。STM32采用了cortex_m3内核,所以这部分仍旧保留使用,但STM32并没有使用cortex_m3内核全部的东西(如内存保护单元MPU等),因此它的NVIC是cortex_m3内核的NVIC的子集。 • STM32目前支持的中断共为84个(16个内核+68个外部),和16级可编程中断优先级的设置。
NIVC介绍 • STM32可以支持的68个外部中断通道,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,stm32只用高4位)。 • 对于这4bit的中断优先级控制位还必须分成2组看:从高位开始,前面是定义抢先式优先级的位,后面用于定义子优先级。4bit的分组组合可以有以下几种形式:
外部中断/事件控制器(EXTI) • 外部中断/事件控制器由19个产生事件/中断要求的边沿检测器组成。每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以被独立的屏蔽。挂起寄存器保持着状态线的中断要求。 • EXTI线16连接到PVD输出 • EXTI线17连接到RTC闹钟事件 • EXTI线18连接到USB唤醒事件
EXIT寄存器 • typedef struct • { • vu32 IMR; • vu32 EMR; • vu32 RTSR; • vu32 FTSR; • vu32 SWIER; • vu32 PR; • } EXTI_TypeDef;
函数NVIC_PriorityGroupConfig • 函数原形 :void NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup) • 功能描述 设置优先级分组:先占优先级和从优先级 • 输入参数 NVIC_PriorityGroup:优先级分组位长度 • 参阅Section:NVIC_PriorityGroup 查阅更多该参数允许取值范围 • 输出参数 :无 • 返回值 :无 • 先决条件 :优先级分组只能设置一次
函数NVIC_Init • 函数原形 :void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) • 功能描述 :根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 • 输入参数 NVIC_InitStruct:指向结构NVIC_InitTypeDef的指针,包含了外设GPIO的配置信息 • 参阅Section:NVIC_InitTypeDef查阅更多该参数允许取值范围 • 输出参数:无 • 返回值:无 • 先决条件 :无
函数NVIC_StructInit • 函数原形: void NVIC_StructInit (NVIC_InitTypeDef* NVIC_InitStruct) • 功能描述: 把NVIC_InitStruct中的每一个参数按缺省值填入 • 输入参数 NVIC_InitStruct:指向结构NVIC_InitTypeDef的指针,待初始化 • 输出参数 :无 • 返回值: 无 • 先决条件 :无
函数EXTI_Init • 函数原形 :void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct) • 功能描述 :根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器 • 输入参数 EXTI_InitStruct:指向结构EXTI_InitTypeDef的指针,包含了外设EXTI的配置信息 • 参阅Section:EXTI_InitTypeDef查阅更多该参数允许取值范围 • 输出参数: 无 • 返回值 :无 • 先决条件 :无
函数EXTI_Init • 举例: • EXTI_InitTypeDef EXTI_InitStructure; • EXTI_InitStructure.EXTI_Line = EXTI_Line12 | EXTI_Line14; • EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; • EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; • EXTI_InitStructure.EXTI_LineCmd = ENABLE; • EXTI_Init(&EXTI_InitStructure);
函数EXTI_StructInit • 函数原形 :void EXTI_StructInit(EXTI_InitTypeDef*EXTI_InitStruct) • 功能描述 :把EXTI_InitStruct中的每一个参数按缺省值填入 • 输入参数: EXTI_InitStruct:指向结构EXTI_InitTypeDef的指针,待初始化 • 输出参数 :无 • 返回值 :无 • 先决条件 :无
函数EXTI_ClearITPendingBit • 函数原形 void EXTI_ClearITPendingBit(u32 EXTI_Line) • 功能描述 :清除EXTI线路挂起位 • 输入参数 EXTI_Line:待清除EXTI线路的挂起位 • 参阅Section:EXTI_Line查阅更多该参数允许取值范围 • 输出参数: 无 • 返回值 :无 • 先决条件 :无
步骤: • 1)初始化IO 口为输入。 • 2)开启IO 口复用时钟,设置IO 口与中断线的映射关系。 • 3)开启与该IO 口相对的线上中断/事件,设置触发条件。 • 4)配置中断分组(NVIC),并使能中断。 • 5)编写中断服务函数。
程序调试: #include "stm32f10x.h" #define EXTI0_IRQChannel ((u8)0x06) /* EXTI Line0 Interrupt */ #define EXTI9_5_IRQChannel ((u8)0x17) /* External Line[9:5] Interrupts */ #define RCC_GPIO_LED RCC_APB2Periph_GPIOF /*LED使用的GPIO时钟*/ #define LEDn 4 /*LED数量*/ #define GPIO_LED GPIOF /*LED灯使用的GPIO组*/ #define DS1_PIN GPIO_Pin_6 /*DS1使用的GPIO管脚*/ #define DS2_PIN GPIO_Pin_7 /*DS2使用的GPIO管脚*/ #define DS3_PIN GPIO_Pin_8 /*DS3使用的GPIO管脚*/ #define DS4_PIN GPIO_Pin_9 /*DS4使用的GPIO管脚*/
程序调试: • #define GPIO_LED_ALLGPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9 • #define RCC_KEY1 RCC_APB2Periph_GPIOD • #define GPIO_KEY1_PORT GPIOD • #define GPIO_KEY1 GPIO_Pin_3
程序调试: • void LED_config(void) • { • GPIO_InitTypeDef GPIO_InitStructure; • /* Enable GPIOB, GPIOC and AFIO clock */ • RCC_APB2PeriphClockCmd(RCC_GPIO_LED | RCC_APB2Periph_AFIO , ENABLE); //RCC_APB2Periph_AFIO • /* LEDs pins configuration */ • GPIO_InitStructure.GPIO_Pin = GPIO_LED_ALL; • GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; • GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; • GPIO_Init(GPIO_LED, &GPIO_InitStructure); • }
程序调试: • void Led_Turn_on_all(void) • { • /* Turn On All LEDs */ • GPIO_ResetBits(GPIO_LED, GPIO_LED_ALL); • } • void Led_Turn_on_1(void) • { • /* Turn On DS1 */ • GPIO_ResetBits(GPIO_LED, DS1_PIN); • }
程序调试: • void Led_Turn_on_2(void) • { • /* Turn On DS2 */ • GPIO_ResetBits(GPIO_LED, DS2_PIN ); • } • void Led_Turn_on_3(void) • { • /* Turn On DS3 */ • GPIO_ResetBits(GPIO_LED, DS3_PIN); • }
程序调试: • void Led_Turn_on_4(void) • { • /* Turn On DS4 */ • GPIO_ResetBits(GPIO_LED, DS4_PIN); • } • void Led_Turn_off_all(void) • { • /* Turn Off All LEDs */ • GPIO_SetBits(GPIO_LED, GPIO_LED_ALL); • } • static void Delay_ARMJISHU(__IO uint32_t nCount) • { • for (; nCount != 0; nCount--); • }
程序调试: • void Exit_Init(void) • { • NVIC_InitTypeDef NVIC_InitStructure; • EXTI_InitTypeDef EXTI_InitStructure; • GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource8); • GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9); • EXTI_InitStructure.EXTI_Line = EXTI_Line0; • EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; • EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; • EXTI_InitStructure.EXTI_LineCmd = ENABLE; • EXTI_Init(&EXTI_InitStructure); • EXTI_InitStructure.EXTI_Line = EXTI_Line8; • EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; • EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; • EXTI_InitStructure.EXTI_LineCmd = ENABLE; • EXTI_Init(&EXTI_InitStructure);
程序调试: • NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel; • NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; • NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; • NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; • NVIC_Init(&NVIC_InitStructure); • NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel; • NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; • NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; • NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; • NVIC_Init(&NVIC_InitStructure); • }
程序调试: • int main() • { LED_config(); • Exit_Init() ; • Led_Turn_on_all(); //点亮所有的LED灯 • Delay_ARMJISHU(8000000); • Led_Turn_off_all(); //关闭所有的LED灯 • Delay_ARMJISHU(8000000); • while(1) • ; • }
程序调试(中断函数): • void EXTI9_5_IRQHandler(void) • { • if(EXTI_GetITStatus(EXTI_Line9) != RESET) • EXTI_ClearITPendingBit(EXTI_Line9); • Led_Turn_on_2(); • /* Toggle GPIO_LED pin 6 */ • }
程序调试(中断函数): • void EXTI0_IRQHandler(void) • { • if(EXTI_GetITStatus(EXTI_Line9) != RESET) • EXTI_ClearITPendingBit(EXTI_Line9); • Led_Turn_on_3(); • /* Toggle GPIO_LED pin 6 */ • }
程序调试 • 下载程序 • 按下按键 ,点亮LED