1 / 30

STM32 外部中断(EXIT)

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介绍.

max
Download Presentation

STM32 外部中断(EXIT)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. STM32 外部中断(EXIT)

  2. 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级可编程中断优先级的设置。

  3. NIVC介绍 • STM32可以支持的68个外部中断通道,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,stm32只用高4位)。 • 对于这4bit的中断优先级控制位还必须分成2组看:从高位开始,前面是定义抢先式优先级的位,后面用于定义子优先级。4bit的分组组合可以有以下几种形式:

  4. 外部中断/事件控制器(EXTI) • 外部中断/事件控制器由19个产生事件/中断要求的边沿检测器组成。每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以被独立的屏蔽。挂起寄存器保持着状态线的中断要求。 • EXTI线16连接到PVD输出 • EXTI线17连接到RTC闹钟事件 • EXTI线18连接到USB唤醒事件

  5. NVIC 寄存器

  6. EXIT寄存器 • typedef struct • { • vu32 IMR; • vu32 EMR; • vu32 RTSR; • vu32 FTSR; • vu32 SWIER; • vu32 PR; • } EXTI_TypeDef;

  7. 函数NVIC_PriorityGroupConfig • 函数原形 :void NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup) • 功能描述 设置优先级分组:先占优先级和从优先级 • 输入参数 NVIC_PriorityGroup:优先级分组位长度 • 参阅Section:NVIC_PriorityGroup 查阅更多该参数允许取值范围 • 输出参数 :无 • 返回值 :无 • 先决条件 :优先级分组只能设置一次

  8. 函数NVIC_Init • 函数原形 :void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) • 功能描述 :根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 • 输入参数 NVIC_InitStruct:指向结构NVIC_InitTypeDef的指针,包含了外设GPIO的配置信息 • 参阅Section:NVIC_InitTypeDef查阅更多该参数允许取值范围 • 输出参数:无 • 返回值:无 • 先决条件 :无

  9. 函数NVIC_StructInit • 函数原形: void NVIC_StructInit (NVIC_InitTypeDef* NVIC_InitStruct) • 功能描述: 把NVIC_InitStruct中的每一个参数按缺省值填入 • 输入参数 NVIC_InitStruct:指向结构NVIC_InitTypeDef的指针,待初始化 • 输出参数 :无 • 返回值: 无 • 先决条件 :无

  10. 函数EXTI_Init • 函数原形 :void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct) • 功能描述 :根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器 • 输入参数 EXTI_InitStruct:指向结构EXTI_InitTypeDef的指针,包含了外设EXTI的配置信息 • 参阅Section:EXTI_InitTypeDef查阅更多该参数允许取值范围 • 输出参数: 无 • 返回值 :无 • 先决条件 :无

  11. 函数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);

  12. 函数EXTI_StructInit • 函数原形 :void EXTI_StructInit(EXTI_InitTypeDef*EXTI_InitStruct) • 功能描述 :把EXTI_InitStruct中的每一个参数按缺省值填入 • 输入参数: EXTI_InitStruct:指向结构EXTI_InitTypeDef的指针,待初始化 • 输出参数 :无 • 返回值 :无 • 先决条件 :无

  13. 函数EXTI_ClearITPendingBit • 函数原形 void EXTI_ClearITPendingBit(u32 EXTI_Line) • 功能描述 :清除EXTI线路挂起位 • 输入参数 EXTI_Line:待清除EXTI线路的挂起位 • 参阅Section:EXTI_Line查阅更多该参数允许取值范围 • 输出参数: 无 • 返回值 :无 • 先决条件 :无

  14. 电路图

  15. 步骤: • 1)初始化IO 口为输入。 • 2)开启IO 口复用时钟,设置IO 口与中断线的映射关系。 • 3)开启与该IO 口相对的线上中断/事件,设置触发条件。 • 4)配置中断分组(NVIC),并使能中断。 • 5)编写中断服务函数。

  16. 程序调试: #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管脚*/

  17. 程序调试: • #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

  18. 程序调试: • 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); • }

  19. 程序调试: • 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); • }

  20. 程序调试: • 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); • }

  21. 程序调试: • 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--); • }

  22. 程序调试: • 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);

  23. 程序调试: • 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); • }

  24. 程序调试: • int main() • { LED_config(); • Exit_Init() ; • Led_Turn_on_all(); //点亮所有的LED灯 • Delay_ARMJISHU(8000000); • Led_Turn_off_all(); //关闭所有的LED灯 • Delay_ARMJISHU(8000000); • while(1) • ; • }

  25. 程序调试(中断函数): • void EXTI9_5_IRQHandler(void) • { • if(EXTI_GetITStatus(EXTI_Line9) != RESET) • EXTI_ClearITPendingBit(EXTI_Line9); • Led_Turn_on_2(); • /* Toggle GPIO_LED pin 6 */ • }

  26. 程序调试(中断函数): • void EXTI0_IRQHandler(void) • { • if(EXTI_GetITStatus(EXTI_Line9) != RESET) • EXTI_ClearITPendingBit(EXTI_Line9); • Led_Turn_on_3(); • /* Toggle GPIO_LED pin 6 */ • }

  27. 程序调试 • 下载程序 • 按下按键 ,点亮LED

  28. 谢谢

More Related