EXTI

2020-08-14  本文已影响0人  圆肩男孩

EXTI:External interrupt/event controller


EXTI

中断流程:

输入线(软件中断事件寄存器:EXTI_SWIER:20位)→边沿检测电路→软件中断事件控制寄存器(软件中断事件寄存器:EXTI_SWIER:20位)→请求挂起寄存器(挂起寄存器:EXTI_PR:20位)→中断屏蔽寄存器(中断屏蔽寄存器:EXTI_IMR:20位)→到NVIC中断控制器

事件流程:

输入线→边沿检测电路→软件中断事件控制寄存器→事件屏蔽寄存器(EXTI_EMR)→脉冲发生器(触发ADC、定时器等)

输入线:

20根,EXTI0-15(GPIO)、EXTI16(PVD输出)、EXTI17(RTC闹钟事件)、
EXTI18(USB唤醒事件)、EXTI19(以太网唤醒事件)

寄存器:AFIO_EXTICR,低16位,高16位保留,4位位1组

使用按键控制LED灯
按键:GPIOC_13
//初始化GPIO
void GPIO_Key_Config(void)
{
  GPIO_InitTypeDef  GPIO_InitStruct;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); 
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;        
  GPIO_Init(GPIOC, &GPIO_InitStruct);
}
//初始化EXTI
void EXIT_Key_Config(void)
{
  EXTI_InitTypeDef  EXTI_InitStruct;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//选择输入线
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);
//用于产生中断/事件线(20)
  EXTI_InitStruct.EXTI_Line = EXTI_Line13;
//中断/事件模式
  EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
//上升沿触发
  EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
//使能
  EXTI_InitStruct.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStruct);
}
//
void EXTI_NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStruct;
//配置优先级分组
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
//选择中断源,stm32f10x.h文件中
    NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
}
//编写中断服务函数
//启动文件中找到中断服务函数的名称,在stm32f10x_it.c文件中编写
void EXTI15_10_IRQHandler (void)
{
//判断指定的EXTI线路出发是否发生
    if(EXTI_GetITStatus(EXTI_Line13) != RESET)
    {
        LED_B_TOGGLE;
    }
//清除EXTI线路挂起位
    EXTI_ClearITPendingBit(EXTI_Line13);
}
上一篇 下一篇

猜你喜欢

热点阅读