zoukankan      html  css  js  c++  java
  • MM32/STM32中断和事件梳理

    Interrupt_event梳理


    1.预备资料

    MM32/stm32中文参考手册
    Cortex-M3权威指南(深入了解中断和异常)
    MM32F103产品手册(配置GPIO的复用功能可能用到)


    2.提出问题

    什么是中断?
    怎样配置一个中断?


    3.思维导图整体框架(CTRL+中键缩放查看)


    4.什么是中断?

    中断,Interrupt,就是CPU正在执行某项任务,被此项任务外的其他事务打断,CPU将正在执行的任务暂停(保护现场)转而执行其他高优先级的事务(处理中断),等此项事务执行完成,CPU再来执行先前被打断的任务(返回/恢复现场)。
    对于用户而言,我们不必关心CPU怎样跳转(保护/恢复现场),我们主要关注CPU响应我们的预置中断请求即可。
    因此,中断的配置主要关注:怎样进入中断和中断中做什么事情。


    5.NVIC(嵌套中断向量中断控制器)


    中断和异常向量

    中断与异常是ARM内核的东西,需要深入了解可以看《Cortex-M3权威指南》
    这里分析stm32中的中断向量表的使用与查询

    表中的几个重要参数:
    位置:配置中断是,告诉CPU中断的位置
    名称:外设请求的中断名称,详情可以看“说明”字段
    优先级:当同时发生多个中断请求时,CPU需要一种合理高效的调度模式,决定处理各个中断请求的次序(抢占优先级,响应优先级)

    以表中的EXTI0说明:
    这里需要配置EXTI0上的中断,即当EXTI0线上发生上升沿或者下降沿(可配置)时,我们需要CPU跳转到相应的中断服务函数中执行我们想执行的任务,可以这样配置:

    • 设置NVIC的中断位置为6
    • 设置边沿触发模式(上升沿/下降沿/双边沿)
    • 适当的时候在EXTI0上产生触发信号,激活中断执行中断服务函数

    关于产生EXTI0触发信号
    查阅外部中断通用I/O映射可以知道,通过配置GPIO[x]0连接到EXTI0线


    6.EXTI(外部中断/事件控制器)


    框图

    • 配置1-3 + NVIC响应中断使能 可以触发硬件的外部中断
    • 配置2-3 + NVIC响应中断使能 可以触发软件的外部中断
    • 配置1-4可以触发硬件的外部事件(事件可用于sleep mode唤醒等)
    • 配置2-4可以触发软件的外部事件

    配置一个中断(EXTI0外部中断)


    配置时钟和GPIO(EXTI0输入)

        GPIO_InitTypeDef  GPIO_InitStructure;                 //GPIO
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL,ENABLE);
        RCC_PCLK2Config(RCC_HCLK_Div8);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_ALL,ENABLE);
        RCC_PCLK2Config(RCC_HCLK_Div8);
    
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //配置EXTI0的触发信号,具体查阅--外部中断/事件线路映射
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //input mode
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;	   //50M
        GPIO_Init(GPIOA, &GPIO_InitStructure);
    

    配置EXTI控制器

        NVIC->ISER[0]=(1<<6);//使能CPU的中断响应,其中位置为6,在中断和异常向量表中可以查询得到
        EXTI->IMR=(0x1<<0);  //配置EXTI的中断使能,请看上边的框图分析   
        EXTI->RTSR=(0x1<<0); //line 0 rising    配置上升沿触发 
        EXTI->FTSR=(0x1<<0); //line 0 falling   配置下降沿触发,细节请看EXTI的寄存器描述
        while(EXTI->IMR&0x100);       //等待进入中断
    

    写中断服务函数

    void EXTI0IRQHandler(void)   //中断服务函数,请到库函数查看各个中断对应的预定义中断函数名
    {
        EXTI->PR=0x1;            //清除挂起中断
        print("Hello EXTI0
    ");  
        EXTI->IMR&=0xfffffc1f;   //除能中断
    }
    

    触发

    这样通过在GPIO引脚输入脉冲即可进入中断函数。

    7.总结中断配置步骤

    • 配置NVIC寄存器NVIC->ISER[0]=(0x1<<6)
    • 配置外设中断寄存器,使能中断
    • 根据定义的中断子函数名写中断函数,例如void EXTI0IRQHandler(void
    • 运行程序,使之产生中断
    • 查看进入中断情况,是否触发中断

    参考资料

    [1]. MM32参考手册
    [2]. stm32中文参考手册
    [3]. Cortex-M3权威指南
    [4]. MM32F103产品手册

  • 相关阅读:
    如何将Oracle安装为Linux服务
    cp | mv | rm
    scp命令
    【读书笔记】深入理解计算机系统:第一章——计算机系统漫游
    微信小程序笔记(3):小程序的生命周期及其相关函数
    微信小程序笔记(2):wxml相比于html的扩展
    微信小程序笔记(1):小程序的代码构成和目录文件结构
    [C/C++]const限定符总结
    整数的表示与编码
    关于补码的由来和作用
  • 原文地址:https://www.cnblogs.com/OneFri/p/6225138.html
Copyright © 2011-2022 走看看