zoukankan      html  css  js  c++  java
  • (stm32f103学习总结)—stm32外部中断

    一、外部中断介绍

    1.1 EXTI简介

      EXTI简介 STM32F10x外部中断/事件控制器(EXTI)包含多达 20 个用于产生事 件/中断请求的边沿检测器。EXTI的每根输入线都可单独进行配置,以选 择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或 边沿触发),还可独立地被屏蔽。(stm32f103有19个)

    1.2 EXTI结构框图

    1.3 外部中断/事件线映射

      STM32F10x的EXTI具有20个中断/事件线,如下:(stm32f103有19个以太网唤醒事件没有;stm32f107有20个)

      STM32F10x 的 EXTI 供外部 IO 口使用的中断线有 16 根,但是我们使用的 STM32F103 芯片却远远不止 16 个 IO 口,那么 STM32F103 芯片怎么解决这个问题的呢?
      因为 STM32F103 芯片每个 GPIO 端口均有 16 个管脚,因此把每个 端 口 的 16 个 IO 对 应 那 16 根 中 断 线 EXTI0-EXTI15 。 比 如 :GPIOx.0-GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线 EXTI0-EXTI15,这样一来每个中断线就对应了最多 7 个 IO 口,比如:GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。但是中断线每次只能连接一个在 IO 口上,这样就需要通过 AFIO 的外部中断配置寄存器 1 的 EXTIx[3:0]位来决定对应的中断线映射到哪个 GPIO 端口上,对于中断线映射到 GPIO 端口上的配置函数在stm32f10x_gpio.c 和 stm32f10x_gpio.h 中,所以使用到外部中断时要把这个文件加入到工程中,在创建库函数模板的时候我们默认已经添加。EXTI 的 GPIO 映射图如图 18.1.3 所示:

     

    二、外部中断配置步骤

      要使用外部中断我们就需要先配置它,通常都需经过这几步:

    (1)使能IO口时钟,配置IO口模式为输入

    (2)开启 AFIO 时钟,设置 IO 口与中断线的映射关系

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);  //开启AFIO时钟

    void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);  //设置IO 口与中断线的映射关系即哪个io口哪一个管脚作为中断输入线

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);  //这里以配置GPIOA口 GPIOA的第0管脚作为中断输入线

    (3)配置中断分组(NVIC),使能中断

    (4)初始化EXTI,选择触发方式

    1 void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
    2 typedef struct
    3 {
    4   uint32_t EXTI_Line;               //中断/事件线
    5   EXTIMode_TypeDef EXTI_Mode;       //EXTI模式
    6   EXTITrigger_TypeDef EXTI_Trigger; //EXTI触发方式
    7   FunctionalState EXTI_LineCmd;     //中断线使能或失能 
    8 }EXTI_InitTypeDef;

    (5)编写EXTI中断服务函数(中断函数固件库中已经定义必须使用下列函数名不能自己定义)

    EXTI0_IRQHandler

    EXTI1_IRQHandler

    EXTI2_IRQHandler

    EXTI3_IRQHandler

    EXTI4_IRQHandler

    EXTI9_5_IRQHandler

    EXTI15_10_IRQHandler

     

    三、编写外部中断控制程序 要实现外部中断方式控制LED,程序框架如下:

    (1)初始化对应端口的EXTI(第三部分中的1-4小步)

    (2)编写EXTI中断函数

    (3)编写主函数

     1 /*******************************************************************************
     2 * 函 数 名         : My_EXTI_Init
     3 * 函数功能           : 外部中断初始化
     4 * 输    入         : 无
     5 * 输    出         : 无
     6 *******************************************************************************/
     7 void My_EXTI_Init(void)
     8 {
     9   NVIC_InitTypeDef NVIC_InitStructure;
    10   EXTI_InitTypeDef EXTI_InitStructure;
    11 
    12   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //AFIO使能
    13   GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//选择GPIO管脚用作外部中断线路
    14 //EXTI0 NVIC 配置
    15   NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//EXTI0中断通道
    16   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
    17   NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级
    18   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
    19   NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
    20 //初始化EXTI 配置
    21   EXTI_InitStructure.EXTI_Line=EXTI_Line0;
    22   EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
    23   EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
    24   EXTI_InitStructure.EXTI_LineCmd=ENABLE;
    25   EXTI_Init(&EXTI_InitStructure);
    26 }
     1 /*******************************************************************************
     2 * 函 数 名         : EXTI0_IRQHandler
     3 * 函数功能           : 外部中断0函数
     4 * 输    入         : 无
     5 * 输    出         : 无
     6 *******************************************************************************/
     7 void EXTI0_IRQHandler(void)
     8 {
    9   if(EXTI_GetITStatus(EXTI_Line3)==1) //判断EXTI中断标志位状态函数
    10   {
    11     //填写中断中需要完成的程序
    12    }
    13    EXTI_ClearITPendingBit(EXTI_Line3); //在结束中断服务函数前,清楚中断标志位
    14 15 }
  • 相关阅读:
    生成组合算法
    今天复习C++的const,又学到了很多内容,总结一下[原创]
    文字和图片在一行,文字靠左,图片靠右(div)[转]
    联合查询
    排序查询
    分页查询 ★
    分组查询
    基础查询
    条件查询
    连接查询 (二)sql99语法
  • 原文地址:https://www.cnblogs.com/zhj868/p/12626672.html
Copyright © 2011-2022 走看看