精华内容
下载资源
问答
  • STM32 I/O 作为外部中断输入

    万次阅读 2018-04-08 17:03:03
    这一步设置你要作为外部中断输入的 IO 口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要带上拉,或者下拉电阻。否则可能导致中断不停的触发。在干扰较大的地方,...

     I/O口作为外部中断。general  purpose input and output

    STM32 的每个 IO口都可以作为中断输入,要把 IO口作为外部中断输入,
    有以下几个步骤:
    1) 初始化 IO 口为输入。
    这一步设置你要作为外部中断输入的
    IO 口的状态,可以设置为上拉/下拉输入,也可以设
    置为浮空输入,但浮空的时候外部一定要带上拉,或者下拉电阻。否则可能导致中断不停的触
    发。在干扰较大的地方,就算使用了上拉
    /下拉,也建议使用外部上拉/下拉电阻,这样可以一
    定程度防止外部干扰带来的影响。
    2) 开启 IO 口复用时钟,设置 IO 口与中断线的映射关系。
    STM32 IO 口与中断线的对应关系需要配置外部中断配置寄存器 EXTICR,这样我们要
    先开启复用时钟,然后配置
    IO 口与中断线的对应关系。才能把外部中断与中断线连接起来。
    3) 开启与该 IO 口相对的线上中断/事件,设置触发条件。
    这一步,我们要配置中断产生的条件,
    STM32 可以配置成上升沿触发,下降沿触发,或者
    任意电平变化触发,但是不能配置成高电平触发和低电平触发。这里根据自己的实际情况来配
    置,同时要开启中断线上的中断。这里需要注意的是:如果使用外部中断,并设置该中断的
    EMR
    位的话,会引起软件仿真不能跳到中断,而硬件上是可以的。而不设置 EMR,软件仿真就可以
    进入中断服务函数,并且硬件上也是可以的。建议不要配置
    EMR 位。
    4) 配置中断分组(NVIC),并使能中断。
    这一步,我们就是配置中断的分组,以及使能,对
    STM32 的中断来说,只有配置了 NVIC
    的设置,并开启才能被执行,否则是不会执行到中断服务函数里面去的。关于 NVIC 的详细介
    绍,请参考
    5.2.6 节。
    5) 编写中断服务函数。
    这是中断设置的最后一步,中断服务函数,是必不可少的,如果在代码里面开启了中断,
    但是没编写中断服务函数,就可能引起硬件错误,从而导致程序崩溃!所以在开启了某个中断

    后,一定要记得为该中断编写服务函数。在中断服务函数里面编写你要执行的中断后的操作。

    NVIC 相关的寄存器, MDK 为其定义了如下的结构体:
    typedef struct
    {
    __IO uint32_t ISER[8]; //
    中断使能寄存器组 Interrupt Set-Enable Registers
    uint32_t RESERVED0[24];
    __IO uint32_t ICER[8]; //
    中断除能寄存器组
    uint32_t RSERVED1[24];
    __IO uint32_t ISPR[8]; //
    中断挂起控制寄存器组
    uint32_t RESERVED2[24];
    __IO uint32_t ICPR[8]; //
    中断解挂控制寄存器组
    uint32_t RESERVED3[24];
    __IO uint32_t IABR[8]; //
    中断激活标志位寄存器组
    uint32_t RESERVED4[56];
    __IO uint8_t IP[240]; //
    中断优先级控制寄存器组
    uint32_t RESERVED5[644];
    __O uint32_t STIR; //
    软件触发中断寄存器组
    } NVIC_Type;

            ISER[8]ISER 全称是: Interrupt Set-Enable Registers 每1 bit 代表一个中断,总共有32×8=256个中断,你要使能某个中断,必须设置相应的 ISER 位为 1,使该中断被使能(这里仅仅是使能,还要配合中断分组、屏蔽、 IO 口映射等设置才算是一个完整的中断设置)

            ICER[8]:全称是: Interrupt Clear-Enable Registers 该寄存器组与 ISER[8] 的作用恰好相反,是用来清除某个中断的使能的。 如果想清除一个中断,不是在对应bit写0,而应该在对应位置写1。写0是无效的。
            ISPR[8]:全称是: Interrupt Set-Pending Registers ,每个位对应的中断和 ISER 是一样的。通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。写 0 是无效的。

            ICPR[8]:全称是: Interrupt Clear-Pending Registers ,通过设置 1,可以将挂起的中断取消挂起操作。写 0 无效。

            IABR[8]:全称是: Interrupt Active Bit Registers,是一个中断激活标志位寄存器组。对应位所代表的中断和 ISER 一样,如果为 1,则表示该位所对应的中断正在被执行。这是一个只读寄存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。

            IP[240]:全称是: Interrupt Priority Registers 是一个中断优先级控制的寄存器组。这个寄存器组相当重要! STM32 的中断分组与这个寄存器组密切相关。 IP 寄存器组由 240 8bit 的寄存器组成,每个可屏蔽中断占用 8bit,这样总共可以表示 240 个可屏蔽中断。 而 STM32 只用到了其中的 68 个。 IP[67]~IP[0]分别对应中断 67~0。 而每个可屏蔽中断占用的 8bit 并没有全部使用,而是 只用了高 4 。这 4 位,又分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。而这两个优先级各占几个位又要根据 SCB->AIRCR 中的中断分组设置来决定。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。 

             STM32 5 个分组是通过设置 SCB->AIRCR BIT[10:8]来实现的,而 SCB->AIRCR 的修改需要通过在高 16 位写入 0X05FA 这个密钥才能修改的,故在设置 AIRCR 之前,应该把密钥加入到要写入的内容的高 16 位,以保证能正常的写入 AIRCR在修改 AIRCR 的时候,我们一般采用读->改->写的步骤,来实现不改AIRCR 原来的其他设置。

    这里简单介绍一下 STM32 的中断分组: STM32 将中断分为 5 个组,组 0~4。该分组的设
    置是由
    SCB->AIRCR 寄存器的 bit10~8 来定义的。具体的分配关系如表 5.2.6.1
    所示:

    AIRCR[108] bit[74]分配情况 分配结果
    0 111 04 0 位抢占优先级, 4 位响应优先级
    1 110 13 1 位抢占优先级, 3 位响应优先级
    2 101 22 2 位抢占优先级, 2 位响应优先级
    3 100 31 3 位抢占优先级, 1 位响应优先级
    4 011 40 4 位抢占优先级, 0 位响应优先级

                                                                    表 5.2.6.1 AIRCR 中断分组设置表

       

    //设置 NVIC
    //NVIC_PreemptionPriority
    : 抢占优先级
    //NVIC_SubPriority : 响应优先级
    //NVIC_Channel : 中断编号
    //NVIC_Group : 中断分组 0~4
    //
    注意优先级不能超过设定的组的范围!否则会有意想不到的错误
    //组划分:
    //00 位抢占优先级, 4 位响应优先级
    //11 位抢占优先级, 3 位响应优先级
    //22 位抢占优先级, 2 位响应优先级
    //33 位抢占优先级, 1 位响应优先级
    //44 位抢占优先级, 0 位响应优先级
    //NVIC_SubPriority NVIC_PreemptionPriority 的原则是, 数值越小, 越优先
    void MY_NVIC_Init(u8 NVIC_PreemptionPriorityu8 NVIC_SubPriorityu8 NVIC_Channelu8 NVIC_Group)
    {
    u32 temp;
    MY_NVIC_PriorityGroupConfig(NVIC_Group);//
    设置分组
    temp=NVIC_PreemptionPriority<<(4-NVIC_Group);
    temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
    temp&=0xf; //
    取低四位
    NVIC->ISER[NVIC_Channel/32]|=(1<<NVIC_Channel%32);
    //
    使能中断位(要清除的话,相反操作就 OK)
    NVIC->IP[NVIC_Channel]|=temp<<4;     //
    设置响应优先级和抢断优先级
    }

     NVIC配置总结:

      1)  SCB->AIRCR 决定抢占优先级的位数,设置怎么解释IP(interrupt priority)分组。其实这个分组的设置在每个系统里面只要设置一次就够了,设置多次,则是以最后的那一次为准。整个系统的优先级分组格式都一样。

     2)   ISER 使能对应的中断管脚,

     3)设置优先级。
           IP[channel] 决定具体的抢占优先级和子优先级。

           IP和SCB->AIRCR 一起决定中断的优先级。

           IABR 自读,显示当前正在执行的中断时那个管脚的中断。

    》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

    以上是对NVIC的管理和配置,下面说明一下外不中断的配置。

    》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

    STM32F103 EXTI 控制器支持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置STM32F103 19 个外部中断为:
        线
    0~15:对应外部 IO 口的输入中断。
        线
    16:连接到 PVD 输出。
        线
    17:连接到 RTC 闹钟事件。
        线
    18:连接到 USB 唤醒事件。
    对于外部中断
    EXTI 控制 MDK 定义了如下结构体:
    typedef struct
    {
    __IO uint32_t IMR;  //interrupt mask register
    __IO uint32_t EMR;  //event mask register 
    __IO uint32_t RTSR;  //rising trigger selection register 
    __IO uint32_t FTSR;  //falling trigger selection register 
    __IO uint32_t SWIER;   //software interrupt event register  
    __IO uint32_t PR;     //pending register 
    } EXTI_TypeDef;

        IMR中断屏蔽寄存器。这是一个 32 寄存器。但是只有前 19 位有效(19个外部中断)。当位 x 设置为 1 时,则开启这个线上的中断,否则关闭该线上的中断。
        EMR:事件屏蔽寄存器,同 IMR,只是该寄存器是针对事件的屏蔽和开启
        RTSR上升沿触发选择寄存器。该寄存器同 IMR,也是一个 32 为的寄存器,只有前 19位有效。位 x 对应线 x 上的上升沿触发,如果设置为 1,则是允许上升沿触发中断/事件。否则,不允许。
        FTSR下降沿触发选择寄存器。同 RTSR,不过这个寄存器是设置下降沿的。下降沿和上升沿可以被同时设置,这样就变成了任意电平触发了。
        SWIER软件中断事件寄存器通过向该寄存器的位 x 写入 1,在未设置 IMR EMR 的时候,将设置 PR 中相应位挂起如果设置了 IMR EMR 时将产生一次中断。被设置的 SWIER位,将会在 PR 中的对应位清除后清除。
        PR挂起寄存器当外部中断线上发生了选择的边沿事件,该寄存器的对应位会被置为 10:表示对应线上没有发生触发请求。通过向该寄存器的对应位写入 1 可以清除该位在中断服务函数里面经常会要向该寄存器的对应位写 1 来清除中断请求 。

            通过以上配置就可以正常设置外部中断了,但是外部 IO 口的中断,还需要一个寄存器配置,也就是 IO 复用里的外部中断配置寄存器 EXTICR这是因为 STM32 任何一个 IO 口都可以配置成中断输入口,但是 IO 口的数目远大于中断线数(16 个)。于是 STM32 就这样设计,GPIOA~GPIOG [15:0]分别对应中断线 15~0

            这样每个中断线对应了最多 7 IO 口,以中断线 0为例:它对应了 GPIOA.0GPIOB.0GPIOC.0GPIOD.0GPIOE.0GPIOF.0GPIOG.0而中断线每次只能连接到 1IO口上,这样就需要 EXTICR来决定对应的中断线配置到哪个 GPIO上了。

    EXTICR AFIO 的结构体中定义,如下:
    typedef struct
    {
        __IO uint32_t EVCR;
        __IO uint32_t MAPR;
        __IO uint32_t EXTICR[4];

    } AFIO_TypeDef;


    -------

    EXTICR1


    EXTICR2 对应EXTI4,EXTI5,EXTI6,EXTI7。

    EXTICR3 对应EXTI8,EXTI9,EXTI10,EXTI11。

    EXTICR4 对应EXTI12,EXTI13,EXTI14,EXTI15。

    映射GPIOX_K 管脚。

    例如,EXTI11,配置外部中断管脚11,通过对EXTIX[3:0]的设置分别设置为GPIOA  ~ GPIOG 。

    //外部中断配置函数
    //只针对 GPIOA~G;不包括 PVDRTC USB 唤醒这三个
    //参数: GPIOx0~6, 代表 GPIOA~G;
    //BITx
    : 需要使能的位;
    //TRIM
    : 触发模式, 1, 下升沿; 2, 上降沿;3,任意电平触发
    //该函数一次只能配置 1 IO 口, 多个 IO 口, 需多次调用
    //该函数会自动开启对应中断, 以及屏蔽线
    void Ex_NVIC_Config(u8 GPIOxu8 BITxu8 TRIM)
    {
    u8 EXTADDR;

    u8 EXTOFFSET;
    EXTADDR=BITx/4; //
    得到中断寄存器组的编号
    EXTOFFSET=(BITx%4)*4;//得到中断寄存器组内的偏移
    RCC->APB2ENR|=0x01; //enable AFIO  clock

    AFIO->EXTICR[EXTADDR]&=~(0x000F<<EXTOFFSET);//清除原来设置!!!
    AFIO->EXTICR[EXTADDR]|=GPIOx<<EXTOFFSET;        //EXTI.BITx 映射到 GPIOx.BITx
    //
    自动设置
    EXTI->IMR|=1<<BITx;     //开启 line BITx 上的中断,写1 开启中断
    if(TRIM&0x01)EXTI->FTSR|=1<<BITx; //line BITx 上事件下降沿触发

    if(TRIM&0x02)EXTI->RTSR|=1<<BITx; //line BITx 上事件上升降沿触发
    }

            Ex_NVIC_Config 完全是按照我们之前的分析来编写的,首先根据 GPIOx 的位得到中断寄存器组的编号,即 EXTICR 的编号,EXTICR 里面配置中断线应该配置到 GPIOx 的哪个位然后使能该位的中断及事件,最后配置触发方式。这样就完成了外部中断的配置了。



     NVIC配置总结:

      1)  SCB->AIRCR 决定抢占优先级的位数,设置怎么解释IP(interrupt priority)分组。其实这个分组的设置在每个系统里面只要设置一次就够了,设置多次,则是以最后的那一次为准。整个系统的优先级分组格式都一样。

     2)   ISER 使能对应的中断bit,

     3)设置优先级。
           IP[channel] 决定具体的抢占优先级和子优先级。

           IP和SCB->AIRCR 一起决定中断的优先级。

           IABR 自读,显示当前正在执行的中断时那个管脚的中断。


    外部中断配置总结:

        1) EXTI.BITx 映射到 GPIOx.BITx,通过AFIO_EXTICRn。

        2)开启外部中断线。

        3)设置触发方式。

    展开全文
  • 上拉和下拉

    2019-08-10 21:43:17
    如果上升沿触发,就必须设为内部下拉输入或者设为浮空输入外部接下拉电阻。 上拉电阻与下拉电阻可在管脚输入电压的情况下使用。 集成电路的管脚设定为输入状态时,如果管脚悬空(图1),易受静电等外界干扰,可能会...

    管脚用来做外部中断触发,如果是下降沿触发,就必须设为内部上拉输入或者设为浮空输入外部接上拉电阻;如果上升沿触发,就必须设为内部下拉输入或者设为浮空输入外部接下拉电阻。

    上拉电阻与下拉电阻可在管脚输入电压的情况下使用。

    因此在管脚为输入状态时,一般将管脚通过一电阻上拉至高电平或下拉至低电平作为引脚输入电压的默认值。其简化电路图如图2所示(假设默认的输入电压为高电平)。
    什么叫做输入状态?就是外部电路给p0.1施加的电压是高还是低!
    默认给他一个电平,一旦外部电路给他一个相反的电平,那么就能捕捉外部输入的状态!
    为什么加上拉电阻?
    集成电路的管脚设定为输入状态时,如果管脚悬空(图1),易受静电等外界干扰,可能会引起内部电路的不正常工作。这里电阻起到钳位的作用。
    在这里插入图片描述
    在这里插入图片描述
    当管脚P0.1悬空或接高电平时,其输入值为高电平,当管脚P0.1接低电平时,其输入值为低电平。此时电阻R1就是上拉电阻。
    试想,如果没有这个电阻,该电路可以正常运行吗?结果当然是否定的,如图3所示,由于外电路与集成电路共地,当外电路接入管脚P0.1为低电平时,会造成电源短路,所以上拉电阻在电路中还起到钳位与限流的作用。
    在这里插入图片描述
    同理,输入电压默认为低电平的情况如图4所示。此时R1为下拉电阻。
    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • 上下拉电阻介绍

    2017-08-23 15:55:32
    gpio type 中断,如果是高电平,我觉得肯定要使用下拉电阻,将电平钳制在低电平。 如果是低电平,我觉得肯定要使用上拉电阻,将...如果gpio中断内部使用了下拉电阻,如果外部在使用下拉电阻,会使pin脚的输入电阻变低

    上拉电阻定义:

      电源到元件间的叫上拉电阻,作用是平时使该脚为高电平地到元件间的叫下拉电阻,作用是平时使该脚为低电平;

      上拉是对器件注入电流,下拉是输出电流;弱强只是上拉电阻的阻值不同,没有什么严格区分;对于非集电极(或漏极)开路输出型电路(如普通门电路)提升电流和电压的能力是有限的,上拉电阻的功能主要是为集电极开路输出型电路输出电流通道。


    上拉电阻作用:

    1. 提高电压准位:a.当TTL电路驱动COMS电路时,如果TTL电路输出的高电平低于COMS电路的最低高电平(一般为3.5V), 这时就需要在TTL的输出端接上拉电阻,以提高输出高电平的值。b.OC门电路必须加上拉电阻,以提高输出的搞电平值。

    2. 加大输出引脚的驱动能力,有的单片机管脚上也常使用上拉电阻。

    3. N/A pin防静电、防干扰:在COMS芯片上,为了防止静电造成损坏,不用的管脚不能悬空,一般接上拉电阻产生降低输入阻抗, 提供泄荷通路。同时管脚悬空就比较容易接受外界的电磁干扰。

    4. 电阻匹配,抑制反射波干扰:长线传输中电阻不匹配容易引起反射波干扰,加上下拉电阻是电阻匹配,有效的抑制反射波干扰。

    5. 预设空间状态/缺省电位:在一些 CMOS 输入端接上或下拉电阻是为了预设缺省电位. 当你不用这些引脚的时候, 这些输入端下拉接 0 或上拉接 1。在I2C总线等总线上,空闲时的状态是由上下拉电阻获得;

    6. 提高芯片输入信号的噪声容限:输入端如果是高阻状态,或者高阻抗输入端处于悬空状态,此时需要加上拉或下拉,以免收到随机电平而影响电路工作。同样如果输出 端处于被动状态,需要加上拉或下拉,如输出端仅仅是一个三极管的集电极。从而提高芯片输入信号的噪声容限增强抗干扰能力。


    拉电阻阻值的选择原则:

    1. 从节约功耗及芯片的灌电流能力考虑应当足够大;电阻大,电流小。
    2. 从确保足够的驱动电流考虑应当足够小;电阻小,电流大。
    3. 对于高速电路,过大的上拉电阻可能边沿变平缓。


    上下拉电阻与gpio

      gpio type 中断,如果是高电平触发,我觉得要使用下拉电阻,将电平钳制在低电平。 如果是低电平触发,我觉得要使用上拉电阻,将电平钳制在高电平;

      上拉电阻(或者下拉电阻)不能太大,也不能太小,应该被设计成一个适当的值,让电路可以正常的工作。上拉(或者下拉)可能是chip内,也可能是chip外的;

      如果gpio中断内部使用了下拉电阻,如果外部在使用下拉电阻,会使pin脚的输入电阻变低,有可能高电平信号拉不起来。

    展开全文
  • stm32的每个I/O口都可以作为中断输入,要把I/O口设置为外部中断输入,必须将I/O口设置为上拉/下拉输入 或 浮空输入(但浮空的时候外部一定要带上拉或下拉电阻,否则可能导致 中断不停的触发),干扰大时,上拉/下拉...

      stm32的每个I/O口都可以作为中断输入,要把I/O口设置为外部中断输入,必须将I/O口设置为上拉/下拉输入 或 浮空输入(但浮空的时候外部一定要带上拉或下拉电阻,否则可能导致 中断不停的触发),干扰大时,上拉/下拉输入模式也建议使用外部上拉/下拉电阻。

    1.设置外部中断 的步骤

    ①初始化I/O口为输入

      参见 stm32寄存器版学习笔记01 GPIO口的配置

    ②开启I/O口复用时钟, 设置I/O口与中断线的映射关系

      这一步在函数void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM) 中已经封装好可直接调用。(有详细说明 在第2点)

      关于I/O口时钟复用

        APB2外设时钟使能寄存器(RCC_APB2ENR)

    0位 I/O复用时钟使能

      Eg:RCC->APB2ENR|=0x01;//使能io复用时钟(已封装在Ex_NVIC_Config函数中)

    ③开启与该I/O口相对的线上中断/事件,设置触发条件

      stm32可以配置成上升沿触发、下降沿触发或任意电平变化触发。

      这一步封装在函数void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM) 中,可以直接调用。(有详细说明 在第2点)

    typedef struct
    {
      __IO uint32_t IMR;         //中断屏蔽寄存器
      __IO uint32_t EMR;         //事件屏蔽寄存器
      __IO uint32_t RTSR;        //上升沿触发选择寄存器
      __IO uint32_t FTSR;        //下降沿触发选择寄存器
      __IO uint32_t SWIER;       //软件中断事件寄存器
      __IO uint32_t PR;          //挂起寄存器
    } EXTI_TypeDef;

      Eg:Ex_NVIC_Config(GPIO_A,0,RTIR); //设置PA0上升沿触发

             Ex_NVIC_Config(GPIO _C,13,FTIR);//设置PC13下降沿触发

         可以同时设置上升沿触发和下降沿触发,即任意电平变化触发

     

    ④配置中断分组(NVIC),并使能中断

      只有配置了NVIC的设置并开启才能被执行,否则不执行到中断服务函数中去。

      这一步封装在函数void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group) 里面可以直接调用。 (在第3点 详细介绍)

      EG:MY_NVIC_Init(2,2,EXTI0_IRQn,2); //抢占2,子优先级2,组2

         MY_NVIC_Init(2,1,EXTI9_5_IRQn,2); //抢占2,子优先级1,组2

    注意:stm32的外部中断0-4都有单独的中断服务函数,但是从5开始就没有单独的服务函数了,而是多个中断共用一个服务函数,比如外部中断5-9的中断服务函数为void EXTI9_5_IRQHandler(void),外部中断10-15的中断服务函数为void EXTI15_10_IRQHandler(void).

             每一位对应中断 from stm32f10x.h

    ⑤编写中断服务函数

      Eg://外部中断9~5服务程序

        void EXTI9_5_IRQHandler(void)
        {
          //add your code
          EXTI->PR=1<<5; //清除LINE5上的中断标志位
        }

    2. 关于void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM)函数

     1 //外部中断配置函数
     2 //只针对GPIOA~G;不包括PVD,RTC和USB唤醒这三个
     3 //参数:
     4 //GPIOx:0~6,代表GPIOA~G
     5 //BITx:需要使能的位;
     6 //TRIM:触发模式,1,下升沿;2,上降沿;3,任意电平触发
     7 //该函数一次只能配置1个IO口,多个IO口,需多次调用
     8 //该函数会自动开启对应中断,以及屏蔽线           
     9 void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM) 
    10 {
    11     u8 EXTADDR;
    12     u8 EXTOFFSET;
    13     EXTADDR=BITx/4;//得到中断寄存器组的编号
    14     EXTOFFSET=(BITx%4)*4; 
    15     RCC->APB2ENR|=0x01;//使能io复用时钟             
    16     AFIO->EXTICR[EXTADDR]&=~(0x000F<<EXTOFFSET);//清除原来设置!!!
    17     AFIO->EXTICR[EXTADDR]|=GPIOx<<EXTOFFSET;//EXTI.BITx映射到GPIOx.BITx 
    18     //自动设置
    19     EXTI->IMR|=1<<BITx;//  开启line BITx上的中断
    20     //EXTI->EMR|=1<<BITx;//不屏蔽line BITx上的事件 (如果不屏蔽这句,在硬件上是可以的,但是在软件仿真的时候无法进入中断!)
    21      if(TRIM&0x01)EXTI->FTSR|=1<<BITx;//line BITx上事件下降沿触发
    22     if(TRIM&0x02)EXTI->RTSR|=1<<BITx;//line BITx上事件上升降沿触发
    23 }     

     

    ① EXTADDR 为计算的中段寄存器组号。AFIO->EXTICR[EXTADDR]。

        EXTOFFSET 为偏移地址,就是设置配置寄存器的第几位。

      外部中断配置寄存器1(AFIO_EXTICR1)

     

      外部中断配置寄存器2(AFIO_EXTICR2)

      外部中断配置寄存器3(AFIO_EXTICR3)

      外部中断配置寄存器4(AFIO_EXTICR4)

     

    ②中断屏蔽寄存器(EXTI_IMR)

      Eg:EXTI->IMR|=1<<BITx;// 开启line BITx上的中断

    关于 line x

      

     

     

     

     

     

     

     

     

      事件屏蔽寄存器(EXTI_EMR)

     

      上升沿触发选择寄存器(EXTI_RTSR)

     

      下降沿触发选择寄存器(EXTI_FTSR)

    Eg://TRIM:触发模式,1,下升沿;2,上降沿;3,任意电平触发

    if(TRIM&0x01)EXTI->FTSR|=1<<BITx;//line BITx上事件下降沿触发
    if(TRIM&0x02)EXTI->RTSR|=1<<BITx;//line BITx上事件上升降沿触发

    TRIM = 3,即同时设置上升沿和下降沿触发,即任意电平变化触发。

      软件中断事件寄存器(EXTI_SWIER)

     

      挂起寄存器(EXTI_PR)

     

    3. 关于void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group) 函数

     1 //设置向量表偏移地址
     2 //NVIC_VectTab:基址
     3 //Offset:偏移量             
     4 void MY_NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset)     
     5 {             
     6     SCB->VTOR = NVIC_VectTab|(Offset & (u32)0x1FFFFF80);//设置NVIC的向量表偏移寄存器
     7     //用于标识向量表是在CODE区还是在RAM区
     8 }
     9 //设置NVIC分组
    10 //NVIC_Group:NVIC分组 0~4 总共5组            
    11 void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)     
    12 { 
    13     u32 temp,temp1;      
    14     temp1=(~NVIC_Group)&0x07;//取后三位
    15     temp1<<=8;
    16     temp=SCB->AIRCR;  //读取先前的设置
    17     temp&=0X0000F8FF; //清空先前分组
    18     temp|=0X05FA0000; //写入钥匙
    19     temp|=temp1;       
    20     SCB->AIRCR=temp;  //设置分组                                 
    21 }
    22 //设置NVIC 
    23 //NVIC_PreemptionPriority:抢占优先级
    24 //NVIC_SubPriority       :响应优先级
    25 //NVIC_Channel           :中断编号
    26 //NVIC_Group             :中断分组 0~4
    27 //注意优先级不能超过设定的组的范围!否则会有意想不到的错误
    28 //组划分:
    29 //组0:0位抢占优先级,4位响应优先级
    30 //组1:1位抢占优先级,3位响应优先级
    31 //组2:2位抢占优先级,2位响应优先级
    32 //组3:3位抢占优先级,1位响应优先级
    33 //组4:4位抢占优先级,0位响应优先级
    34 //NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先       
    35 void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)     
    36 { 
    37     u32 temp;    
    38     MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
    39     temp=NVIC_PreemptionPriority<<(4-NVIC_Group);      
    40     temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
    41     temp&=0xf;//取低四位  
    42     NVIC->ISER[NVIC_Channel/32]|=(1<<NVIC_Channel%32);//使能中断位(要清除的话,相反操作就OK) 
    43     NVIC->IP[NVIC_Channel]|=temp<<4;//设置响应优先级和抢断优先级                                    
    44 } 

     

      在Cortex-M3内核支持256个中断(16个内核中断,240外部中断),并且具有256级的可编程中断设置。stm32并没有使用Cortex-M3内核全部配设。stm32有84个中断(16个内核中断,68可屏蔽中断),具有16级可编程的中断优先级。68可屏蔽中断在stm32f103系列上只有60个。

     1 /* memory mapping struct for Nested Vectored Interrupt Controller (NVIC) */
     2 typedef struct
     3 {
     4  
     5   __IO uint32_t ISER[8];                      /*!< Interrupt Set Enable Register            */
     6        uint32_t RESERVED0[24];
     7   __IO uint32_t ICER[8];                      /*!< Interrupt Clear Enable Register          */
     8        uint32_t RSERVED1[24];
     9   __IO uint32_t ISPR[8];                      /*!< Interrupt Set Pending Register           */
    10        uint32_t RESERVED2[24];
    11   __IO uint32_t ICPR[8];                      /*!< Interrupt Clear Pending Register         */
    12        uint32_t RESERVED3[24];
    13   __IO uint32_t IABR[8];                      /*!< Interrupt Active bit Register            */
    14        uint32_t RESERVED4[56];
    15   __IO uint8_t  IP[240];                      /*!< Interrupt Priority Register, 8Bit wide   */
    16        uint32_t RESERVED5[644];
    17   __O  uint32_t STIR;                         /*!< Software Trigger Interrupt Register      */
    18  
    19 }  NVIC_Type;

    中断的使能与除能

    ISER[8]:Interrupt Set-Enable Registers 中断使能寄存器  

      Cortex-M3内核支持256个中断,8个32位寄存器控制。stm32只用了前68位。ISER[0]的bit0~31对于中断0~31,ISER[1]的bit0~31对于中断32~63,ISER[2]的bit0~3对应中断64~67;要使能某个中断,必须设置相应的ISER位为1,是该中断被使能。

      1 typedef enum IRQn
      2 {
      3 /******  Cortex-M3 Processor Exceptions Numbers ***************************************************/
      4   NonMaskableInt_IRQn         = -14,    /*!< 2 Non Maskable Interrupt                             */
      5   MemoryManagement_IRQn       = -12,    /*!< 4 Cortex-M3 Memory Management Interrupt              */
      6   BusFault_IRQn               = -11,    /*!< 5 Cortex-M3 Bus Fault Interrupt                      */
      7   UsageFault_IRQn             = -10,    /*!< 6 Cortex-M3 Usage Fault Interrupt                    */
      8   SVCall_IRQn                 = -5,     /*!< 11 Cortex-M3 SV Call Interrupt                       */
      9   DebugMonitor_IRQn           = -4,     /*!< 12 Cortex-M3 Debug Monitor Interrupt                 */
     10   PendSV_IRQn                 = -2,     /*!< 14 Cortex-M3 Pend SV Interrupt                       */
     11   SysTick_IRQn                = -1,     /*!< 15 Cortex-M3 System Tick Interrupt                   */
     12 
     13 /******  STM32 specific Interrupt Numbers *********************************************************/
     14   WWDG_IRQn                   = 0,      /*!< Window WatchDog Interrupt                            */
     15   PVD_IRQn                    = 1,      /*!< PVD through EXTI Line detection Interrupt            */
     16   TAMPER_IRQn                 = 2,      /*!< Tamper Interrupt                                     */
     17   RTC_IRQn                    = 3,      /*!< RTC global Interrupt                                 */
     18   FLASH_IRQn                  = 4,      /*!< FLASH global Interrupt                               */
     19   RCC_IRQn                    = 5,      /*!< RCC global Interrupt                                 */
     20   EXTI0_IRQn                  = 6,      /*!< EXTI Line0 Interrupt                                 */
     21   EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                 */
     22   EXTI2_IRQn                  = 8,      /*!< EXTI Line2 Interrupt                                 */
     23   EXTI3_IRQn                  = 9,      /*!< EXTI Line3 Interrupt                                 */
     24   EXTI4_IRQn                  = 10,     /*!< EXTI Line4 Interrupt                                 */
     25   DMA1_Channel1_IRQn          = 11,     /*!< DMA1 Channel 1 global Interrupt                      */
     26   DMA1_Channel2_IRQn          = 12,     /*!< DMA1 Channel 2 global Interrupt                      */
     27   DMA1_Channel3_IRQn          = 13,     /*!< DMA1 Channel 3 global Interrupt                      */
     28   DMA1_Channel4_IRQn          = 14,     /*!< DMA1 Channel 4 global Interrupt                      */
     29   DMA1_Channel5_IRQn          = 15,     /*!< DMA1 Channel 5 global Interrupt                      */
     30   DMA1_Channel6_IRQn          = 16,     /*!< DMA1 Channel 6 global Interrupt                      */
     31   DMA1_Channel7_IRQn          = 17,     /*!< DMA1 Channel 7 global Interrupt                      */
     32 
     33 #ifdef STM32F10X_LD
     34   ADC1_2_IRQn                 = 18,     /*!< ADC1 and ADC2 global Interrupt                       */
     35   USB_HP_CAN1_TX_IRQn         = 19,     /*!< USB Device High Priority or CAN1 TX Interrupts       */
     36   USB_LP_CAN1_RX0_IRQn        = 20,     /*!< USB Device Low Priority or CAN1 RX0 Interrupts       */
     37   CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                   */
     38   CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                   */
     39   EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                        */
     40   TIM1_BRK_IRQn               = 24,     /*!< TIM1 Break Interrupt                                 */
     41   TIM1_UP_IRQn                = 25,     /*!< TIM1 Update Interrupt                                */
     42   TIM1_TRG_COM_IRQn           = 26,     /*!< TIM1 Trigger and Commutation Interrupt               */
     43   TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */
     44   TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */
     45   TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */
     46   I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                 */
     47   I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                 */
     48   SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                */
     49   USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */
     50   USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */
     51   EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */
     52   RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */
     53   USBWakeUp_IRQn              = 42      /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */    
     54 #endif /* STM32F10X_LD */  
     55 
     56 #ifdef STM32F10X_LD_VL
     57   ADC1_IRQn                   = 18,     /*!< ADC1 global Interrupt                                */
     58   EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                        */
     59   TIM1_BRK_TIM15_IRQn         = 24,     /*!< TIM1 Break and TIM15 Interrupts                      */
     60   TIM1_UP_TIM16_IRQn          = 25,     /*!< TIM1 Update and TIM16 Interrupts                     */
     61   TIM1_TRG_COM_TIM17_IRQn     = 26,     /*!< TIM1 Trigger and Commutation and TIM17 Interrupt     */
     62   TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */
     63   TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */
     64   TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */
     65   I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                 */
     66   I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                 */
     67   SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                */
     68   USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */
     69   USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */
     70   EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */
     71   RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */
     72   CEC_IRQn                    = 42,     /*!< HDMI-CEC Interrupt                                   */
     73   TIM6_DAC_IRQn               = 54,     /*!< TIM6 and DAC underrun Interrupt                      */
     74   TIM7_IRQn                   = 55      /*!< TIM7 Interrupt                                       */       
     75 #endif /* STM32F10X_LD_VL */
     76 
     77 #ifdef STM32F10X_MD
     78   ADC1_2_IRQn                 = 18,     /*!< ADC1 and ADC2 global Interrupt                       */
     79   USB_HP_CAN1_TX_IRQn         = 19,     /*!< USB Device High Priority or CAN1 TX Interrupts       */
     80   USB_LP_CAN1_RX0_IRQn        = 20,     /*!< USB Device Low Priority or CAN1 RX0 Interrupts       */
     81   CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                   */
     82   CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                   */
     83   EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                        */
     84   TIM1_BRK_IRQn               = 24,     /*!< TIM1 Break Interrupt                                 */
     85   TIM1_UP_IRQn                = 25,     /*!< TIM1 Update Interrupt                                */
     86   TIM1_TRG_COM_IRQn           = 26,     /*!< TIM1 Trigger and Commutation Interrupt               */
     87   TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */
     88   TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */
     89   TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */
     90   TIM4_IRQn                   = 30,     /*!< TIM4 global Interrupt                                */
     91   I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                 */
     92   I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                 */
     93   I2C2_EV_IRQn                = 33,     /*!< I2C2 Event Interrupt                                 */
     94   I2C2_ER_IRQn                = 34,     /*!< I2C2 Error Interrupt                                 */
     95   SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                */
     96   SPI2_IRQn                   = 36,     /*!< SPI2 global Interrupt                                */
     97   USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */
     98   USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */
     99   USART3_IRQn                 = 39,     /*!< USART3 global Interrupt                              */
    100   EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */
    101   RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */
    102   USBWakeUp_IRQn              = 42      /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */  
    103 #endif /* STM32F10X_MD */  
    104 
    105 #ifdef STM32F10X_MD_VL
    106   ADC1_IRQn                   = 18,     /*!< ADC1 global Interrupt                                */
    107   EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                        */
    108   TIM1_BRK_TIM15_IRQn         = 24,     /*!< TIM1 Break and TIM15 Interrupts                      */
    109   TIM1_UP_TIM16_IRQn          = 25,     /*!< TIM1 Update and TIM16 Interrupts                     */
    110   TIM1_TRG_COM_TIM17_IRQn     = 26,     /*!< TIM1 Trigger and Commutation and TIM17 Interrupt     */
    111   TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */
    112   TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */
    113   TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */
    114   TIM4_IRQn                   = 30,     /*!< TIM4 global Interrupt                                */
    115   I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                 */
    116   I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                 */
    117   I2C2_EV_IRQn                = 33,     /*!< I2C2 Event Interrupt                                 */
    118   I2C2_ER_IRQn                = 34,     /*!< I2C2 Error Interrupt                                 */
    119   SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                */
    120   SPI2_IRQn                   = 36,     /*!< SPI2 global Interrupt                                */
    121   USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */
    122   USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */
    123   USART3_IRQn                 = 39,     /*!< USART3 global Interrupt                              */
    124   EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */
    125   RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */
    126   CEC_IRQn                    = 42,     /*!< HDMI-CEC Interrupt                                   */
    127   TIM6_DAC_IRQn               = 54,     /*!< TIM6 and DAC underrun Interrupt                      */
    128   TIM7_IRQn                   = 55      /*!< TIM7 Interrupt                                       */       
    129 #endif /* STM32F10X_MD_VL */
    130 
    131 #ifdef STM32F10X_HD
    132   ADC1_2_IRQn                 = 18,     /*!< ADC1 and ADC2 global Interrupt                       */
    133   USB_HP_CAN1_TX_IRQn         = 19,     /*!< USB Device High Priority or CAN1 TX Interrupts       */
    134   USB_LP_CAN1_RX0_IRQn        = 20,     /*!< USB Device Low Priority or CAN1 RX0 Interrupts       */
    135   CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                   */
    136   CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                   */
    137   EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                        */
    138   TIM1_BRK_IRQn               = 24,     /*!< TIM1 Break Interrupt                                 */
    139   TIM1_UP_IRQn                = 25,     /*!< TIM1 Update Interrupt                                */
    140   TIM1_TRG_COM_IRQn           = 26,     /*!< TIM1 Trigger and Commutation Interrupt               */
    141   TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */
    142   TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */
    143   TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */
    144   TIM4_IRQn                   = 30,     /*!< TIM4 global Interrupt                                */
    145   I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                 */
    146   I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                 */
    147   I2C2_EV_IRQn                = 33,     /*!< I2C2 Event Interrupt                                 */
    148   I2C2_ER_IRQn                = 34,     /*!< I2C2 Error Interrupt                                 */
    149   SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                */
    150   SPI2_IRQn                   = 36,     /*!< SPI2 global Interrupt                                */
    151   USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */
    152   USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */
    153   USART3_IRQn                 = 39,     /*!< USART3 global Interrupt                              */
    154   EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */
    155   RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */
    156   USBWakeUp_IRQn              = 42,     /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */
    157   TIM8_BRK_IRQn               = 43,     /*!< TIM8 Break Interrupt                                 */
    158   TIM8_UP_IRQn                = 44,     /*!< TIM8 Update Interrupt                                */
    159   TIM8_TRG_COM_IRQn           = 45,     /*!< TIM8 Trigger and Commutation Interrupt               */
    160   TIM8_CC_IRQn                = 46,     /*!< TIM8 Capture Compare Interrupt                       */
    161   ADC3_IRQn                   = 47,     /*!< ADC3 global Interrupt                                */
    162   FSMC_IRQn                   = 48,     /*!< FSMC global Interrupt                                */
    163   SDIO_IRQn                   = 49,     /*!< SDIO global Interrupt                                */
    164   TIM5_IRQn                   = 50,     /*!< TIM5 global Interrupt                                */
    165   SPI3_IRQn                   = 51,     /*!< SPI3 global Interrupt                                */
    166   UART4_IRQn                  = 52,     /*!< UART4 global Interrupt                               */
    167   UART5_IRQn                  = 53,     /*!< UART5 global Interrupt                               */
    168   TIM6_IRQn                   = 54,     /*!< TIM6 global Interrupt                                */
    169   TIM7_IRQn                   = 55,     /*!< TIM7 global Interrupt                                */
    170   DMA2_Channel1_IRQn          = 56,     /*!< DMA2 Channel 1 global Interrupt                      */
    171   DMA2_Channel2_IRQn          = 57,     /*!< DMA2 Channel 2 global Interrupt                      */
    172   DMA2_Channel3_IRQn          = 58,     /*!< DMA2 Channel 3 global Interrupt                      */
    173   DMA2_Channel4_5_IRQn        = 59      /*!< DMA2 Channel 4 and Channel 5 global Interrupt        */
    174 #endif /* STM32F10X_HD */  
    175 
    176 #ifdef STM32F10X_HD_VL
    177   ADC1_IRQn                   = 18,     /*!< ADC1 global Interrupt                                */
    178   EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                        */
    179   TIM1_BRK_TIM15_IRQn         = 24,     /*!< TIM1 Break and TIM15 Interrupts                      */
    180   TIM1_UP_TIM16_IRQn          = 25,     /*!< TIM1 Update and TIM16 Interrupts                     */
    181   TIM1_TRG_COM_TIM17_IRQn     = 26,     /*!< TIM1 Trigger and Commutation and TIM17 Interrupt     */
    182   TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */
    183   TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */
    184   TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */
    185   TIM4_IRQn                   = 30,     /*!< TIM4 global Interrupt                                */
    186   I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                 */
    187   I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                 */
    188   I2C2_EV_IRQn                = 33,     /*!< I2C2 Event Interrupt                                 */
    189   I2C2_ER_IRQn                = 34,     /*!< I2C2 Error Interrupt                                 */
    190   SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                */
    191   SPI2_IRQn                   = 36,     /*!< SPI2 global Interrupt                                */
    192   USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */
    193   USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */
    194   USART3_IRQn                 = 39,     /*!< USART3 global Interrupt                              */
    195   EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */
    196   RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */
    197   CEC_IRQn                    = 42,     /*!< HDMI-CEC Interrupt                                   */
    198   TIM12_IRQn                  = 43,     /*!< TIM12 global Interrupt                               */
    199   TIM13_IRQn                  = 44,     /*!< TIM13 global Interrupt                               */
    200   TIM14_IRQn                  = 45,     /*!< TIM14 global Interrupt                               */
    201   TIM5_IRQn                   = 50,     /*!< TIM5 global Interrupt                                */
    202   SPI3_IRQn                   = 51,     /*!< SPI3 global Interrupt                                */
    203   UART4_IRQn                  = 52,     /*!< UART4 global Interrupt                               */
    204   UART5_IRQn                  = 53,     /*!< UART5 global Interrupt                               */  
    205   TIM6_DAC_IRQn               = 54,     /*!< TIM6 and DAC underrun Interrupt                      */
    206   TIM7_IRQn                   = 55,     /*!< TIM7 Interrupt                                       */  
    207   DMA2_Channel1_IRQn          = 56,     /*!< DMA2 Channel 1 global Interrupt                      */
    208   DMA2_Channel2_IRQn          = 57,     /*!< DMA2 Channel 2 global Interrupt                      */
    209   DMA2_Channel3_IRQn          = 58,     /*!< DMA2 Channel 3 global Interrupt                      */
    210   DMA2_Channel4_5_IRQn        = 59,     /*!< DMA2 Channel 4 and Channel 5 global Interrupt        */
    211   DMA2_Channel5_IRQn          = 60      /*!< DMA2 Channel 5 global Interrupt (DMA2 Channel 5 is 
    212                                              mapped at position 60 only if the MISC_REMAP bit in 
    213                                              the AFIO_MAPR2 register is set)                      */       
    214 #endif /* STM32F10X_HD_VL */
    215 
    216 #ifdef STM32F10X_XL
    217   ADC1_2_IRQn                 = 18,     /*!< ADC1 and ADC2 global Interrupt                       */
    218   USB_HP_CAN1_TX_IRQn         = 19,     /*!< USB Device High Priority or CAN1 TX Interrupts       */
    219   USB_LP_CAN1_RX0_IRQn        = 20,     /*!< USB Device Low Priority or CAN1 RX0 Interrupts       */
    220   CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                   */
    221   CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                   */
    222   EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                        */
    223   TIM1_BRK_TIM9_IRQn          = 24,     /*!< TIM1 Break Interrupt and TIM9 global Interrupt       */
    224   TIM1_UP_TIM10_IRQn          = 25,     /*!< TIM1 Update Interrupt and TIM10 global Interrupt     */
    225   TIM1_TRG_COM_TIM11_IRQn     = 26,     /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */
    226   TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */
    227   TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */
    228   TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */
    229   TIM4_IRQn                   = 30,     /*!< TIM4 global Interrupt                                */
    230   I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                 */
    231   I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                 */
    232   I2C2_EV_IRQn                = 33,     /*!< I2C2 Event Interrupt                                 */
    233   I2C2_ER_IRQn                = 34,     /*!< I2C2 Error Interrupt                                 */
    234   SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                */
    235   SPI2_IRQn                   = 36,     /*!< SPI2 global Interrupt                                */
    236   USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */
    237   USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */
    238   USART3_IRQn                 = 39,     /*!< USART3 global Interrupt                              */
    239   EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */
    240   RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */
    241   USBWakeUp_IRQn              = 42,     /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */
    242   TIM8_BRK_TIM12_IRQn         = 43,     /*!< TIM8 Break Interrupt and TIM12 global Interrupt      */
    243   TIM8_UP_TIM13_IRQn          = 44,     /*!< TIM8 Update Interrupt and TIM13 global Interrupt     */
    244   TIM8_TRG_COM_TIM14_IRQn     = 45,     /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */
    245   TIM8_CC_IRQn                = 46,     /*!< TIM8 Capture Compare Interrupt                       */
    246   ADC3_IRQn                   = 47,     /*!< ADC3 global Interrupt                                */
    247   FSMC_IRQn                   = 48,     /*!< FSMC global Interrupt                                */
    248   SDIO_IRQn                   = 49,     /*!< SDIO global Interrupt                                */
    249   TIM5_IRQn                   = 50,     /*!< TIM5 global Interrupt                                */
    250   SPI3_IRQn                   = 51,     /*!< SPI3 global Interrupt                                */
    251   UART4_IRQn                  = 52,     /*!< UART4 global Interrupt                               */
    252   UART5_IRQn                  = 53,     /*!< UART5 global Interrupt                               */
    253   TIM6_IRQn                   = 54,     /*!< TIM6 global Interrupt                                */
    254   TIM7_IRQn                   = 55,     /*!< TIM7 global Interrupt                                */
    255   DMA2_Channel1_IRQn          = 56,     /*!< DMA2 Channel 1 global Interrupt                      */
    256   DMA2_Channel2_IRQn          = 57,     /*!< DMA2 Channel 2 global Interrupt                      */
    257   DMA2_Channel3_IRQn          = 58,     /*!< DMA2 Channel 3 global Interrupt                      */
    258   DMA2_Channel4_5_IRQn        = 59      /*!< DMA2 Channel 4 and Channel 5 global Interrupt        */
    259 #endif /* STM32F10X_XL */  
    260 
    261 #ifdef STM32F10X_CL
    262   ADC1_2_IRQn                 = 18,     /*!< ADC1 and ADC2 global Interrupt                       */
    263   CAN1_TX_IRQn                = 19,     /*!< USB Device High Priority or CAN1 TX Interrupts       */
    264   CAN1_RX0_IRQn               = 20,     /*!< USB Device Low Priority or CAN1 RX0 Interrupts       */
    265   CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                   */
    266   CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                   */
    267   EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                        */
    268   TIM1_BRK_IRQn               = 24,     /*!< TIM1 Break Interrupt                                 */
    269   TIM1_UP_IRQn                = 25,     /*!< TIM1 Update Interrupt                                */
    270   TIM1_TRG_COM_IRQn           = 26,     /*!< TIM1 Trigger and Commutation Interrupt               */
    271   TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */
    272   TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */
    273   TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */
    274   TIM4_IRQn                   = 30,     /*!< TIM4 global Interrupt                                */
    275   I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                 */
    276   I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                 */
    277   I2C2_EV_IRQn                = 33,     /*!< I2C2 Event Interrupt                                 */
    278   I2C2_ER_IRQn                = 34,     /*!< I2C2 Error Interrupt                                 */
    279   SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                */
    280   SPI2_IRQn                   = 36,     /*!< SPI2 global Interrupt                                */
    281   USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */
    282   USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */
    283   USART3_IRQn                 = 39,     /*!< USART3 global Interrupt                              */
    284   EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */
    285   RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */
    286   OTG_FS_WKUP_IRQn            = 42,     /*!< USB OTG FS WakeUp from suspend through EXTI Line Interrupt */
    287   TIM5_IRQn                   = 50,     /*!< TIM5 global Interrupt                                */
    288   SPI3_IRQn                   = 51,     /*!< SPI3 global Interrupt                                */
    289   UART4_IRQn                  = 52,     /*!< UART4 global Interrupt                               */
    290   UART5_IRQn                  = 53,     /*!< UART5 global Interrupt                               */
    291   TIM6_IRQn                   = 54,     /*!< TIM6 global Interrupt                                */
    292   TIM7_IRQn                   = 55,     /*!< TIM7 global Interrupt                                */
    293   DMA2_Channel1_IRQn          = 56,     /*!< DMA2 Channel 1 global Interrupt                      */
    294   DMA2_Channel2_IRQn          = 57,     /*!< DMA2 Channel 2 global Interrupt                      */
    295   DMA2_Channel3_IRQn          = 58,     /*!< DMA2 Channel 3 global Interrupt                      */
    296   DMA2_Channel4_IRQn          = 59,     /*!< DMA2 Channel 4 global Interrupt                      */
    297   DMA2_Channel5_IRQn          = 60,     /*!< DMA2 Channel 5 global Interrupt                      */
    298   ETH_IRQn                    = 61,     /*!< Ethernet global Interrupt                            */
    299   ETH_WKUP_IRQn               = 62,     /*!< Ethernet Wakeup through EXTI line Interrupt          */
    300   CAN2_TX_IRQn                = 63,     /*!< CAN2 TX Interrupt                                    */
    301   CAN2_RX0_IRQn               = 64,     /*!< CAN2 RX0 Interrupt                                   */
    302   CAN2_RX1_IRQn               = 65,     /*!< CAN2 RX1 Interrupt                                   */
    303   CAN2_SCE_IRQn               = 66,     /*!< CAN2 SCE Interrupt                                   */
    304   OTG_FS_IRQn                 = 67      /*!< USB OTG FS global Interrupt                          */
    305 #endif /* STM32F10X_CL */     
    306 } IRQn_Type;
    每一位对应中断 from stm32f10x.h

    ICER[8]: Interrupt Clear-Enable Registers 中断除能寄存器

      专门设置一个ICER来清除中断位,而不是向ISER写0来清除,是因为NVIC的这些寄存器都是写1有效,写0无效。

     

    中断的悬起与解悬

     

    ISPR[8]: Interrupt Set-Pending Registers 中断挂起控制寄存器
      通过置1可以将正在进行的中断挂起,而执行同级,或更高级别的中断,写0无效。

    ICPR[8]: Interrupt Clear-Pending Registers 中断解挂控制寄存器

      通过置1可以将挂起的中断解挂,写0无效。

     

    IABR[8]: Interrupt Active Bit Registers 中断激活标志位寄存器

      对应位代表和ISER一样,如果为1,代表中断正在被执行。只读寄存器,通过读取它知道当前在执行的中断是哪个。中断执行完由硬件清0。

    IP[240]: Interrupt Priority Registers 中断优先级控制寄存器

      IP[67]~IP[0]分别对应中断67~0,每个可屏蔽中断占用8bit的高4位。这4位分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。而这两个优先级各站几个位根据SCB->AIRCR中的中断分组设置来决定。

     

      Eg:组设置为3,那么此时所有68个中断的每个中断的中断优先寄存器的高4位中最高3位是抢占优先级,低1位是响应优先级。每个中断可以设置抢占优先级0~7,响应优先级为0或1。数值越小,优先级越高。

     

    高优先级的抢占优先级是可以打断正在进行的低优先级中断的;而抢占优先级相同的中断,高优先级的响应中断不可以打断低响应优先级的中断。

     1 //设置NVIC分组
     2 //NVIC_Group:NVIC分组 0~4 总共5组            
     3 void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)     
     4 { 
     5     u32 temp,temp1;      
     6     temp1=(~NVIC_Group)&0x07;//取后三位
     7     temp1<<=8;
     8     temp=SCB->AIRCR;  //读取先前的设置
     9     temp&=0X0000F8FF; //清空先前分组
    10     temp|=0X05FA0000; //写入钥匙
    11     temp|=temp1;       
    12     SCB->AIRCR=temp;  //设置分组                                 
    13 }
    设置NVIC分组

     

     1 //设置NVIC 
     2 //NVIC_PreemptionPriority:抢占优先级
     3 //NVIC_SubPriority       :响应优先级
     4 //NVIC_Channel           :中断编号
     5 //NVIC_Group             :中断分组 0~4
     6 //注意优先级不能超过设定的组的范围!否则会有意想不到的错误
     7 //组划分:
     8 //组0:0位抢占优先级,4位响应优先级
     9 //组1:1位抢占优先级,3位响应优先级
    10 //组2:2位抢占优先级,2位响应优先级
    11 //组3:3位抢占优先级,1位响应优先级
    12 //组4:4位抢占优先级,0位响应优先级
    13 //NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先       
    14 void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)     
    15 { 
    16     u32 temp;    
    17     MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
    18     temp=NVIC_PreemptionPriority<<(4-NVIC_Group);      
    19     temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
    20     temp&=0xf;//取低四位  
    21     NVIC->ISER[NVIC_Channel/32]|=(1<<NVIC_Channel%32);//使能中断位(要清除的话,相反操作就OK) 
    22     NVIC->IP[NVIC_Channel]|=temp<<4;//设置响应优先级和抢断优先级                                    
    23 } 
    设置NVIC MY_NVIC_Init

      根据中断分组情况来设置 中断优先级控制寄存器IP 其高四位。

      用MY_NVIC_PriorityGroupConfig函数分组

      开启中断,在ISER相应位置1

     

    4.外部中断的应用

     

     1 //key--->led 外部中断
     2 //外部中断0服务程序
     3 void EXTI0_IRQHandler(void)
     4 {
     5     delay_ms(10);    //消抖
     6     if(WK_UP==1)    //WK_UP按键 
     7     {
     8         LED0=!LED0;
     9         LED1=!LED1;    
    10     }         
    11     EXTI->PR=1<<0;  //清除LINE0上的中断标志位  
    12 }
    13 //外部中断9~5服务程序
    14 void EXTI9_5_IRQHandler(void)
    15 {            
    16     delay_ms(10);   //消抖             
    17     if(KEY0==0)        //按键0
    18     {
    19         LED0=!LED0;
    20     }
    21      EXTI->PR=1<<5;     //清除LINE5上的中断标志位  
    22 }
    23 //外部中断15~10服务程序
    24 void EXTI15_10_IRQHandler(void)
    25 {            
    26     delay_ms(10);   //消抖             
    27     if(KEY1==0)        //按键1
    28     {
    29         LED1=!LED1;
    30     }
    31      EXTI->PR=1<<15; //清除LINE15上的中断标志位  
    32 }
    33 //外部中断初始化程序
    34 //初始化PA0,PC5,PA15为中断输入.
    35 void EXTI_Init(void)
    36 {
    37     KEY_Init();
    38     Ex_NVIC_Config(GPIO_A,0,RTIR);         //上升沿触发
    39     Ex_NVIC_Config(GPIO_C,5,FTIR);        //下降沿触发
    40     Ex_NVIC_Config(GPIO_A,15,FTIR);        //下降沿触发
    41 
    42     MY_NVIC_Init(2,2,EXTI0_IRQn,2);        //抢占2,子优先级2,组2
    43     MY_NVIC_Init(2,1,EXTI9_5_IRQn,2);      //抢占2,子优先级1,组2
    44     MY_NVIC_Init(2,0,EXTI15_10_IRQn,2);    //抢占2,子优先级0,组2       
    45 }

     

    转载于:https://www.cnblogs.com/kuotian/p/5527054.html

    展开全文
  • 实际上5529还有 上拉/下拉电阻使能寄存器PXREN 虽然到现在还不知道怎么用,只是在中断的时候用到过,当IO口做中断输入时,需要检测上升沿或者下降沿,这时就要将端口配置为输入,然后使能中断,选择触发方式,通常...
  • stm32学习笔记4(外部中断实验)

    千次阅读 2018-08-02 17:29:56
    这一步设置要作为外部中断输入的IO口状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要带上拉或下拉电阻。 2、开启IO口复用时钟,设置IO口与中断线的映射关系。(系统时钟设置:Stm32_...
  • STM32外部中断实验

    2016-08-17 17:30:08
    把I/O口作为外部中断输入,需要进行以下步骤: 1 初始化I/O口为输入。 可以设置为上拉/下拉输入,也可以设置为悬浮输入,但是设置悬浮输入时,记得带上上拉/下拉电阻。 2 开启I/O口复用时钟,设置I/O口与中断线的...
  • 基础实验——外部中断定义中断上升沿,下降沿上,下拉电阻例程:按钮控制LED 虽然能实现 IO 口输入输出功能,但代码是一直在检测 IO 输入口的变化,因此效率不高,特别是在一些特定的场合,比如某个按键,可能 1 ...
  • 为什么要使用中断? 外部中断是单片机实时地处理外部事件的一种内部机制。当外部事件发生后,单片机判断外部事件是否符合条件,如果符合外部中断条件,则停止CPU...然后设置端口为输入,并且下拉电阻,因为我们用3...
  • 如果上拉寄存器使能,无论引脚功能寄存器如何设置(输入、输出、数据、中断等),对应引脚输出高电平。 上拉是一个电阻接到一个电压,其实就是增强IO的驱动能力。 下拉寄存器 下拉就是一个电阻接到地,保证IO口是低...
  • 如果上拉寄存器使能,无论引脚功能寄存器如何设置(输入,输出,数据,中断等),对应引脚输出高电平。  可见对应于S3C2410的GPB-BPH口内部有上拉电阻寄存器,当相应的上拉电阻使能时,对应的I/O引脚悬空时,...
  • (1)如下图放置元件并配置供电网(STM32 F103C6),注意需要有下拉电阻。 二、CUBEMAX IDE配置 (1)RCC配置 (2)在引脚图上配置PB0/PB1为输入模式,PB2为输出模式。 (3)generate code后,打开main.c或者其他...
  • 如果上拉寄存器使能,无论引脚功能寄存器如何设置(输入,输出,数据,中断等),对应引脚输出高电平。 可见对应于S3C2410的GPB-BPH口内部有上拉电阻寄存器,当相应的上拉电阻使能时,对应的I/O引脚悬空时,表现出高...
  • 【MSP430】—{MSP430单片机输入/...4、上拉/下拉电阻使能寄存器PxREN 5、输出驱动强度寄存器PxDS 6、功能选择寄存器PxSEL 7、中断使能寄存器PxIE 8、中断触发边沿选择寄存器PxIES 9、中断标志寄存器PxIFG 四、端口P3~P1
  • RPI.GPIO Python使用手册

    2018-12-21 12:55:25
    RPiGPIO模块基本使用 ... 上拉或者下拉电阻 测试输入轮询 中断与边沿检测 线程回调 开关去抖 GPIO 输出 设置RPiGPIO 设置为高电平输出 设置低电平输出 同时设置多个通道的输出 ...
  • 1.2如何理解中断悬浮输入?略。。。 1.3如何理解上拉输入?(下拉同) 引脚上不确定的电平信号通过一个上拉电阻到高电平 1.4如何理解中断上拉输入?略。。。 1.2.1如何理解推挽输出? 常用的输出方式推挽结构...
  • 如果按键使用上拉电阻则设置I/O口为上拉电阻,如果按键使用的是下拉电阻则设置I/O口味下拉电阻。 外部中断按键检测的I/O口设置 将按键对应的I/O口设置为EXTI模式,并打开外部中断。 如果按键使用上拉电阻则设置I/O...
  • Stm32外围模块编程初始化步骤

    千次阅读 2014-06-18 11:55:22
    这一步设置你要作为外部中断输入的 IO 口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要带上拉,或者下拉电阻。否则可能导致中断不停的触发。在干扰较大的地方,就算使用了上拉/...
  • 1.原理图GPIO和门电路

    2017-07-07 20:30:44
    vcc -上拉电阻-npn三极管-地 简单的反相电路/ 地-下拉电阻-pnp三极管-3.3v 反相 对于输入引脚 上拉电阻确定 电平状态 中断  配置相关引脚功能为中断,1 具备输入功能 2打断处理器  协议类  ...
  • STM32 考试习题及答案 一填空题 1当 STM32 的 I/O 端口配置为输入时 输出缓冲器 被禁止 施密特触发输 入 被激活根据输入配置 (上拉下拉或浮动 )的不同该引脚的 弱上拉和下拉 电阻 被连接出现在 I/O 脚上的数据在每个...
  • STM32 考试习题及答案 一填空题 1当STM32 的I/O 端口配置为输入时 输出缓冲器 被禁止 施密特触发输 入 被激活根据输入配置(上拉下拉或浮动) 的不同该引脚的 弱上拉和下拉 电阻 被连接出现在I/O 脚上的数据在每个APB2...
  • RPI.GPIO使用手册

    千次阅读 2017-03-25 12:27:53
    上拉或者下拉电阻 测试输入轮询 中断与边沿检测 线程回调 开关去抖 GPIO 输出 设置RPiGPIO 设置为高电平输出 设置低电平输出 同时设置多个通道的输出 清空 PWM脉冲宽度调制 1
  • msp430知识

    2016-07-19 23:17:00
    msp430知识 IO口 数字输入/输出端口有下列特性:□每个输入/输出位都可以独立编程。□允许任意组合输入、输出。□P1和P2所有8个位都可以分别设置为中断。...□可以分别设置上拉或下拉电阻。 在介绍...
  • 树莓派GPIO RPi.GPIO

    万次阅读 2016-04-03 08:50:54
    树莓派 raspberry pi GPIO python树莓派 raspberry pi GPIO ...上拉或者下拉电阻 测试输入轮询 中断与边沿检测 线程回调 开关去抖 GPIO 输出 设置RPiGPIO 设置为高电平输出 设置低电平输出 同时设置多个通道的输出 清空
  • Pin.PULL_DOWN 是否接入下拉电阻 Pin.PULL_UP 是否接入上拉电阻 Pin.IQR_RISNG 信号上升触发中断 Pin.IQR_FALLING 信号下降触发中断 Pin.WAKE_HIGH 从高电平唤醒 Pin.WAKE_LOW 从低电平唤醒 Pi...

空空如也

空空如也

1 2 3
收藏数 49
精华内容 19
关键字:

中断输入下拉电阻