你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32外部中断原理和配置代码经验分享

[复制链接]
攻城狮Melo 发布时间:2023-11-4 18:51
本文介绍了STM32基于标准外设库的外部中断配置,以及基于参考手册如何更加寄存器配置外部中断

9 |6 }1 t6 x6 u! k" K' ^5 I% M# S
2 STM32的外部中断
下图来自《STM32参考手册》,从整个架构图可以知道,外部中断的功能可以配置六个寄存器;
    中断屏蔽寄存器(EXTI_IMR)
    事件屏蔽寄存器(EXTI_EMR)
    上升沿触发选择寄存器(EXTI_RTSR)
    下降沿触发选择寄存器(EXTI_FTSR)
    软件中断事件寄存器(EXTI_SWIER)
    挂起寄存器(EXTI_PR)
: U# P& k7 P6 e( K3 D: a% S$ X
微信图片_20231104185050.png

& |' O) U/ [8 W" F6 ]% f
    EXTI支持配置20个中断和事件屏蔽位;
    GPIO端口以下图的方式连接到16个外部中断/事件线上;EXTI_Line0 — EXTI_Line15;
    EXTI_Line16 连接到PVD输出 ;
    EXTI_Line17连接到RTC闹钟事件;
    EXTI_Line18连接到USB唤醒事件;
    EXTI_Line19连接到以太网唤醒事件(只适用于互联型产品);
* S; X( w! y* ]. p% G( f. ]* x
GPIO的映射关系图如下所示;
8 [' l9 {+ r' @+ y! I. h# W' F
微信图片_20231104185043.png

! y& U/ q6 N$ j8 q9 ?: y8 d: V
3 中断服务函数的映射关系

, r$ A7 t  X/ y$ M( T  Q
微信图片_20231104185040.png

  n1 ~" P8 {& J  h
4 外部中断的配置
宏定义,抽象一下接口,方便后面修改;
#define Z_GPIO_PIN    GPIO_Pin_5
#define Z_GPIO_PORT   GPIOE
#define Z_PortSource  GPIO_PortSourceGPIOE
#define Z_PinSource   GPIO_PinSource5
#define Z_Line        EXTI_Line5
#define Z_IRQ         EXTI9_5_IRQn
* d1 b1 U! _- j  s
GPIO的配置;这里GPIO的输入模式可以配置为浮空输入(GPIO_Mode_IN_FLOATING),上拉输入(GPIO_Mode_IPU)或者下拉输入(GPIO_Mode_IPD),具体如下图所示;

* f$ g9 T5 S, z# H# |
微信图片_20231104185033.png
& `( y' z; _4 V
GPIO的配置代码如下;
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = Z_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(Z_GPIO_PORT, &GPIO_InitStructure);

4 m% W4 n- d7 [$ c
不要忘记外设总线时钟的配置;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |
  RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF |
    RCC_APB2Periph_GPIOG, ENABLE);

9 ~6 \0 s& y# T& a0 ~( D! ?$ d, {, E
EXTI的配置,EXTI_Trigger这里支持三种模式;
    EXTI_Trigger_Rising 上升沿触发;
    EXTI_Trigger_Falling 下降沿触发;
    EXTI_Trigger_Rising_Falling 上升沿和下降沿都可以触发;
GPIO_EXTILineConfig(Z_PortSource, Z_PinSource);
EXTI_InitStructure.EXTI_Line = Z_Line;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

' v' B% j. S: z) r
NVIC的配置
NVIC_InitStructure.NVIC_IRQChannel = Z_IRQ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
& n; `- G) U$ y0 c6 u) \. ?: m( v
中断服务函数
void EXTI9_5_IRQHandler(void)
{
     //中断服务函数
}
以上就完成了检测下降沿信号的GPIOE5的外部中断;
也参考官方DEMO,
STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\EXTI\EXTI_Config。

7 F( T" M8 O! H& L
5 寄存器的操作
以下摘自**《STM32参考手册》**
产生产生中断的步骤,必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器,同时在**中断屏蔽寄存器(EXTI_IMR)的相应位写1允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置1。在挂起寄存器(EXTI_PR)的对应位写1,将清除该中断请求。
产生事件的步骤:必须先配置好并使能事件线。根据需要的边沿检测通过设置2个触发寄存器,同时在中断屏蔽寄存器(EXTI_IMR)**的相应位写1允许事件请求。当事件线上发生了需要的边沿时,将产生一个事件请求脉冲,对应的挂起位不被置1。通过在软件中断/事件寄存器写1,也可以通过软件产生中断/事件请求。
    中断屏蔽寄存器(EXTI_IMR)
    事件屏蔽寄存器(EXTI_EMR)
    上升沿触发选择寄存器(EXTI_RTSR)
    下降沿触发选择寄存器(EXTI_FTSR)
    软件中断事件寄存器(EXTI_SWIER)
    挂起寄存器(EXTI_PR)
IMR如下图所示,其他几个类似;
5 j1 g- [! i2 ]* c: @* N2 I) h
微信图片_20231104185031.png

/ B0 }! z( t# |4 |
5.1 硬件中断选择
通过下面的过程来配置20个线路做为中断源:
    配置20个中断线的屏蔽位(EXTI_IMR)
    配置所选中断线的触发选择位(EXTI_RTSR和EXTI_FTSR);
    配置对应到外部中断控制器(EXTI)的NVIC中断通道的使能和屏蔽位,使得20个中断线中的请求可以被正确地响应。

( e8 E& |0 r  I1 Z' P9 E* N% W( X
5.2 硬件事件选择
通过下面的过程,可以配置20个线路为事件源
    配置20个事件线的屏蔽位(EXTI_EMR)
    配置事件线的触发选择位(EXTI_RTSR和EXTI_FTSR)
. f9 V$ g/ ^& ?4 N) z
5.3 软件中断/事件的选择
20个线路可以被配置成软件中断/事件线。下面是产生软件中断的过程:
    配置20个中断/事件线屏蔽位(EXTI_IMR, EXTI_EMR)
    设置软件中断寄存器的请求位(EXTI_SWIER)

# c& p! G) y9 \( r# V* a; N; l
6 总结
本文参考stm32手册对于外部中断的概念以及配置进行了介绍,本人能力有限,难免存在错误和纰漏,请大佬不吝赐教。

( x/ K- V+ L% u( V( f0 e转载自:硬件攻城狮: c  C! u  V0 C& }$ j5 [6 G
如有侵权请联系删除
/ m; R; e( C+ z2 r6 n" q4 }! U6 ?
! s% D4 M7 J& e+ E
0 \6 ?8 g, y# o7 q, A: E0 m4 ^1 N$ Z
赞 收藏 评论0 发布时间:2023-11-4 18:51

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版