EXT1中断

                                                                          
EXTI简介
    EXTI可以实现对每个中断/时间进行单独配置,可以配置为中断或事件,以及促发事件的属性
EXTI功能框图(EXTI位于APB2总线上)
(可以看野火视频加深理解)
中断/事件线
EXTI0——EXTI15用于GPIO,通过编程可以实现任何一个端口作为EXTI的输入源
由图可知,EXTI0可以通过AFIO的外部中断配置器1(AFIO_EXTICR1)选择配置为PA0,PB0,PC0,PD0.....,其他EXTIx的配置是类似的
EXTI结构体变量
typedef struct
{
  uint32_t EXTI_Line;            //中断/事件线选择,可选则EXTI0-EXTI15
 /*EXTI16-PVD输出  EXTI17-RTC闹钟事件 EXTI18-USB唤醒事件 EXTI19以太网唤醒事件*/
  EXTIMode_TypeDef EXTI_Mode;   //EXTI模式选择  可选择产生中断(EXTI_Mode_Interupt)或者事件(EXTI_Mode_Event)
  EXTITrigger_TypeDef EXTI_Trigger; //EXTI边沿促发事件,可选上升沿促发,下降沿促发,上升沿和下降沿都促发
  FunctionalState EXTI_LineCmd;    //控制是否使能EXTI线 (ENABLE)或者(DISABLE)
}EXTI_InitTypeDef;
GPIO_EXTILineConfig()://将选择的GPIOx作为EXTIx
实验设计
1)PA0连接到EXT用于产生中断,PA0的电平变化通过按键控制
2)通过PA0中断控制LED
   
  EXTI.h函数编写
#ifndef __EXTI_H
#define __EXIT_H     
#include "sys.h"
void EXTIX_Init(void);//外部中断初始化                                 
#endif
  EXTI.c函数编写
#include "exti.h"
#include "led.h"
#include "delay.h"
//外部中断0服务程序
void EXTIX_Init(void)
{
       EXTI_InitTypeDef EXTI_InitStructure;
       NVIC_InitTypeDef NVIC_InitStructure;
      GPIO_InitTypeDef GPIO_InitStructure;
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);    //使能复用功能时钟 AFIO时钟
       //初始化IO口
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA时钟
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;//KEY0  PA0
    GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING; //设置成浮空输入
                                                         //输入不用设置速度
     GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA0
   //初始化EXTI  需要提前打开AFIO时钟
   //GPIOA0      中断线以及中断初始化配置 上升沿触发 //KEY1
      GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
      EXTI_InitStructure.EXTI_Line=EXTI_Line0;  //选择线0
      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;      //选择中断模式
      EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Rising;   //选择上升沿促发
      EXTI_InitStructure.EXTI_LineCmd =ENABLE;                //使能线中断
      EXTI_Init(&EXTI_InitStructure);          //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    //初始化NVIC
      /* 配置NVIC为优先级组1 */
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
      NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;              //使能按键PA0所在的外部中断通道
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;    //抢占优先级2,
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                    //子优先级3
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //使能外部中断通道
      NVIC_Init(&NVIC_InitStructure);
}
//外部中断0服务程序
void EXTI0_IRQHandler(void)
{
  //确保是否产生了EXTI Line中断
    if(EXTI_GetITStatus(EXTI_Line0) != RESET)
    {
            ....
            ....
            ....
            ....
            ....
            ....
        //清除中断标志位
        EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);     
    }  
}
注:使用线0-线4时,NVIC_IRQChanne = EXTI0_IRQn | EXTI1_IRQn | EXTI2_IRQn | EXTI3_IRQn | EXTI4_IRQn
    :使用线5-线9时,  NVIC_IRQChannel = EXTI9_5_IRQn;
    :使用线10-线15时,NVIC_IRQChannel = EXTI15_10_IRQn;
   需记住,否则会出错
注:中断服务函数名称需要在startup_stm32f10x_hd.s中寻找264-323中.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值