×
单片机 > 单片机程序设计 > 详情

STM32系列第9篇--外部中断

发布时间:2020-08-31 发布时间:
|

STM32的每个IO都可以作为外部中断输入。 
STM32的中断控制器支持19个外部中断/事件请求:

  1. 线0~15:对应外部IO口的输入中断。

  2. 线16:连接到PVD输出。

  3. 线17:连接到RTC闹钟事件。

  4. 线18:连接到USB唤醒事件。

每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。

线0~15和IO口映射关系: 
GPIOx.0映射到EXTI0 
GPIOx.1映射到EXTI1 
… 
GPIOx.15映射到EXTI15

外部中断一般配置步骤:

1、初始化IO口为输入。

GPIO_Init();

2、 开启IO口复用时钟。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

3、设置IO口与中断线的映射关系。

void GPIO_EXTILineConfig();

4、 初始化线上中断,设置触发条件等。

EXTI_Init();

5、配置中断分组(NVIC),并使能中断。

NVIC_Init();

6、 编写中断服务函数。

EXTIx_IRQHandler();

7、清除中断标志位

EXTI_ClearITPendingBit();

exti.c

void EXTIX_Init(void)
{
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    KEY_Init(); //按键端口初始化
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能复用功能时钟
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);//设置IO与中断线映射关系
    /***   初始化   ***/
    EXTI_InitStructure.EXTI_Line=EXTI_Line4;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//设置为中断而不是事件
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能
    EXTI_Init(&EXTI_InitStructure);    /***   初始化end   ***/
    /***   初始化NVIC   ***/
    NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;//使能按键KEY0所在的外部中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;//子优先级0
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
    NVIC_Init(&NVIC_InitStructure);    //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
    /***   初始化NVIC END  ***/}/***   中断服务函数   ***/void EXTI4_IRQHandler(void)
{

    delay_ms(10);//消抖
    if(KEY0==0) //按键KEY0
    {
        LED0=!LED0;
        LED1=!LED1; 
    } 
    EXTI_ClearITPendingBit(EXTI_Line4);  //清除LINE4上的中断标志位  }1234567891011121314151617181920212223242526272829303132333435

main.c

int main(void)
{
    delay_init();     //延时函数初始化  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    uart_init(115200); //串口初始化为115200
    LED_Init();  //初始化与LED连接的硬件接口
    BEEP_Init();         //初始化蜂鸣器端口
    KEY_Init();         //初始化与按键连接的硬件接口
    EXTIX_Init();//外部中断初始化
    LED0=0;//点亮LED0
    while(1)
    {    
        printf("OK
");
        delay_ms(1000);  
    }
}


关键字:STM32系列  外部中断 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会