STM32中断触发

使用PB1作为外部中断触发,按一次按键灯处于亮状态,在按一次灯灭。

1、先配置GPIO端口、复用管脚外设时钟使能GPIO_Config();

void GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//PB1复用管脚时钟使能

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12| GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//配置推挽输出,灯太亮,刺眼,故意把配置OD门,亮度暗一点
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//由于配置OD输出,顾这要上拉
    GPIO_Init(GPIOD,&GPIO_InitStructure);

    //配置PB1管脚作为触发输入,因为PB1管脚直接接开关按钮到地,所以内部上拉让其管脚处于高电平状态,当开关按下时,PB1管脚被拉低,通过下降沿进行触发
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
}

2、配置嵌套向量中断控制NVIC_Config(void),使用不同通道时得注意,EXTI0~EXTI4对应的是EXTI0_IRQn、EXTI1_IRQn、EXTI2_IRQn、EXTI3_IRQn和EXTI4_IRQn,EXTI5~EXTI9都用EXTI9_5_IRQn这个通道,EXTI10~EXTI15都用EXTI15_10_IRQn这个通道。

void NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

    #ifdef  VECT_TAB_RAM
    /* Set the Vector Table base location at 0x20000000 */
    NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
    #else  /* VECT_TAB_FLASH  */
    /* Set the Vector Table base location at 0x08000000 */
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
    #endif

    NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //由于使用的是PB1,对应的是EXTI1通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //中断使能
    NVIC_Init(&NVIC_InitStructure);
}

3、中断管脚配置EXTI_Config(void)

void EXTI_Config(void)
{
    EXTI_InitTypeDef EXTI_InitStructure;

    //PB1作为外部中断,得相连接
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,EXTI_PinSource1);

    EXTI_InitStructure.EXTI_Line = EXTI_Line1;//通道
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿
    EXTI_InitStructure.EXTI_LineCmd    = ENABLE;//使能
    EXTI_Init(&EXTI_InitStructure);
}

5、主函数调用上面几个函数

int main(void)
{
    Clock_Config();
    GPIO_Config();
    NVIC_Config();
    EXTI_Config();

  while (1)
  {

  }
}

6、找中断函数名,函数名都已固定好,可以到startup_stm32f2xx.s中查找相关中断函数名,这里用的是EXTI1_IRQHandler()

__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     SVC_Handler                ; SVCall Handler
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
                DCD     PendSV_Handler             ; PendSV Handler
                DCD     SysTick_Handler            ; SysTick Handler

                ; External Interrupts
                DCD     WWDG_IRQHandler                   ; Window WatchDog
                DCD     PVD_IRQHandler                    ; PVD through EXTI Line detection
                DCD     TAMP_STAMP_IRQHandler             ; Tamper and TimeStamps through the EXTI line
                DCD     RTC_WKUP_IRQHandler               ; RTC Wakeup through the EXTI line
                DCD     FLASH_IRQHandler                  ; FLASH
                DCD     RCC_IRQHandler                    ; RCC
                DCD     EXTI0_IRQHandler                  ; EXTI Line0
                DCD     EXTI1_IRQHandler                  ; EXTI Line1     //这里有,把EXTI1_IRQHandler 拷贝下来
                DCD     EXTI2_IRQHandler                  ; EXTI Line2
                DCD     EXTI3_IRQHandler                  ; EXTI Line3
                DCD     EXTI4_IRQHandler                  ; EXTI Line4   

7、写中断函数,把拷贝的函数名copy到stm32f2xx_it.c文件中的任意位置

int flag = 0;//定义全局变量
void EXTI1_IRQHandler()
{
    EXTI_ClearITPendingBit(EXTI_Line1); //清除中断挂起位,方便下次中断进入,因中断产生,该位会自动置位,所以这里得手动清除
    if(!flag)
    {
        flag = ~flag;
        GPIO_SetBits(GPIOD,GPIO_Pin_12);
        GPIO_SetBits(GPIOD,GPIO_Pin_13);
        GPIO_SetBits(GPIOD,GPIO_Pin_14);
        GPIO_SetBits(GPIOD,GPIO_Pin_15);
    }
    else
    {
        flag = ~flag;
        GPIO_ResetBits(GPIOD, GPIO_Pin_12);
        GPIO_ResetBits(GPIOD, GPIO_Pin_13);
        GPIO_ResetBits(GPIOD, GPIO_Pin_14);
        GPIO_ResetBits(GPIOD, GPIO_Pin_15);
    }
}

OK,到此,中断处理函数就写好了,按一次按键灯处于亮状态,在按一次灯灭

时间: 2024-08-27 23:22:38

STM32中断触发的相关文章

STM32中断管理函数

CM3 内核支持256 个中断,其中包含了16 个内核中断和240 个外部中断,并且具有256 级的可编程中断设置.但STM32 并没有使用CM3 内核的全部东西,而是只用了它的一部分. STM32 有76 个中断,包括16 个内核中断和60 个可屏蔽中断,具有16 级可编程的中断优先级. 而我们常用的就是这60 个可屏蔽中断,所以我们就只针对这60 个可屏蔽中断进行介绍. 在 MDK 内,与NVIC 相关的寄存器,MDK 为其定义了如下的结构体: typedef struct { vu32 I

6.SysTick系统时钟滴答实验(stm32中断入门)

系统时钟滴答实验很不难,我就在面简单说下,但其中涉及到了STM32最复杂也是以后用途最广的外设-NVIC,如果说RCC是实时性所必须考虑的部分,那么NVIC就是stm32功能性实现的基础,NVIC的难度并不高,但是理解起来还是比较复杂的,我会在本文中从实际应用出发去说明,当然最好去仔细研读宋岩翻译的<Cortex-M3权威指南>第八章,注意这不是一本教你如何编写STM32代码的工具书,而是阐述Cortex-M3内核原理的参考书,十分值得阅读. SysTick系统时钟的核心有两个,外设初始化和S

[stm32] 中断

1 #include "stm32f10x.h" 2 #include "stm32f10x_tim.h" 3 #include "misc.h" 4 #include "stm32f10x_gpio.h" 5 6 unsigned int CCR2_Val=45000; 7 extern void time_ini(void); 8 unsigned int capture1=0; 9 TIM_TimeBaseInitTyp

STM32 中断应用概览

本章参考资料< STM32F4xx 中文参考手册>第十章-中断和事件.<ARM Cortex?-M4F 技术参考手册> -4.3 章节: NVIC 和 4.4 章节: SCB-4.4.5 的 AIRCR.STM32 中断非常强大,每个外设都可以产生中断,所以中断的讲解放在哪一个外设里面去讲都不合适,这里单独抽出一章来做一个总结性的介绍,这样在其他章节涉及到中断部分的知识我们就不用费很大的篇幅去讲解,只要示意性带过即可.本章如无特别说明,异常就是中断,中断就是异常,请不要刻意钻牛角尖

STM32中断控制的流程

对于 STM32 讲(还是以Timer2例),外部中断通道位置 28(35 号优先级)是给外部设备 TIME2 的,但 TIME2本身能够引起中断的中断源或事件有好多个,比如更新事件(上溢/下溢) .输入捕获.输出匹配.DMA 申请等.所有TIME2 的中断事件都是通过一个 TIME2 的中断通道向 STM32 内核提出中断申请,那么 STM32 中如何处理和控制 TIME2 和它众多的.不同的.中断申请呢? 1.因为cortex_m3 内核对于每一个外部中断通道都有相应的控制字和控制位,用于单

stm32中断 抢占优先级 和 响应优先级 有什么区别

与51不同,stm32的中断分类更灵活.51只是按先后顺序大小排列互相打断. stm32中多了响应优先级这一概念. stm32的中断分为 1.抢占(占先)优先级. 2.响应优先级. 1.抢占优先级.抢占优先级高的中断,可以打断抢占优先级低的中断. 2.响应优先级.抢占优先级相同的中断,响应优先级高的可以优先执行. 也许会有疑问:抢占优先级相同的中断,响应优先级高的不可以打断响应优先级低的中断.两个中断肯定是谁先来了就相应谁,两个中断不可能同时来.响应优先级又有何用呢. 其实,响应优先级主要给出了

STM32中断定时,控制LED灯

1 #include "led.h" 2 3 void TIM3_Int_Init(u16 arr,u16 psc) 4 { 5 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 6 NVIC_InitTypeDef NVIC_InitStructure; 7 8 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //设置TIM3时钟使能 9 10 11 TIM_TimeBaseStru

STM32中断系统

1.中断介绍:    1.1 中断概念 CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂 时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序 或中断处理程                 序),以处理该事件,该事件处理完后又返回被中断的程序 继续执行,这一过程称为中断.引发中断的称为中断源.比如:看电视 时突然门铃响,那么门铃响就相当于中           断源.有些中断还能够被其他高 优先级的中断所中断,那么这种情况又叫做中断的嵌套.           

STM32中断

中断响应配置