当前位置: 首页 > article >正文

STM32 第17章 EXIT--外部中断/事件控制器

时间:2024.10.23

参考资料:《零死角玩转STM32》“EXTI-外部中断/事件控制器”

STM32里每一个GPIO都能产生中断,中断的产生体现在GPIO的电平的变化,电平的变化需要一个外设来管理,最终传给NVIC(内核里的嵌套中断控制器)来处理。

一、学习内容

1、EXTI功能框图+EXTI初始化结构体

1.1EXTI简介

EXTI:

External interrupt/event controller,外部中断/事件控制器

管理控制器的20个中断/事件线。每个中断/事件线都对应一个边沿检测器,可以实现输入信号的上升沿或下降沿的检测。EXTI可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。

EXTI两大功能:

产生中断;产生事件

1.2EXIT功能框图

1.2.1输入线
1.输入线总共有多少,具体是哪一些?

输入线一共20条(20个中断/事件输入线),这些输入线可以通过寄存器设置为任意一个GPIO,也可以是一些外设的事件。输入线一般是存在电平变化的信号。

EXTI0至EXTI15用于GPIO,通过编程控制可以实现任意一个GPIO作为EXTI的输入源。

EXTI19针对的是互联型的单片机,即105和107系列的,103系列的没有这个输入线。

2.通过配置哪个寄存器来选择?

参考手册-8.4.3-8.4.6外部中断配置寄存器1-4(AFIO_EXTICR1-4)

 3.用函数如何选择具体的输入线?

stm32f10x_gpio.h里的对应功能的函数

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);

 详细功能说明:

/**
  * @brief  Selects the GPIO pin used as EXTI Line.
  * @param  GPIO_PortSource: selects the GPIO port to be used as source for EXTI lines.
  *   This parameter can be GPIO_PortSourceGPIOx where x can be (A..G).
  * @param  GPIO_PinSource: specifies the EXTI line to be configured.
  *   This parameter can be GPIO_PinSourcex where x can be (0..15).
  * @retval None
  */
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
{
  uint32_t tmp = 0x00;
  /* Check the parameters */
  assert_param(IS_GPIO_EXTI_PORT_SOURCE(GPIO_PortSource));
  assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));
  
  tmp = ((uint32_t)0x0F) << (0x04 * (GPIO_PinSource & (uint8_t)0x03));
  AFIO->EXTICR[GPIO_PinSource >> 0x02] &= ~tmp;
  AFIO->EXTICR[GPIO_PinSource >> 0x02] |= (((uint32_t)GPIO_PortSource) << (0x04 * (GPIO_PinSource & (uint8_t)0x03)));
}
1.2.2EXTI初始化结构体EXTI_InitTypeDef

1.EXTI_Line:用于产生中断/事件线

2.EXTI_Mode:EXTI模式(中断/事件)

3.EXTI_Trigger:触发(上/下/上下)

4.EXTI_LineCmd:使能或者失能(IMR/EMR)

在stm32f10x_exti.h里找到结构体

/** 
  * @brief  EXTI Init Structure definition  
  */

typedef struct
{
  uint32_t EXTI_Line;               /*!< Specifies the EXTI lines to be enabled or disabled.
                                         This parameter can be any combination of @ref EXTI_Lines */
   
  EXTIMode_TypeDef EXTI_Mode;       /*!< Specifies the mode for the EXTI lines.
                                         This parameter can be a value of @ref EXTIMode_TypeDef */

  EXTITrigger_TypeDef EXTI_Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines.
                                         This parameter can be a value of @ref EXTIMode_TypeDef */

  FunctionalState EXTI_LineCmd;     /*!< Specifies the new state of the selected EXTI lines.
                                         This parameter can be set either to ENABLE or DISABLE */ 
}EXTI_InitTypeDef;
1.EXTI_Line:用于产生中断/事件线

/** @defgroup EXTI_Exported_Constants
  * @{
  */

/** @defgroup EXTI_Lines 
  * @{
  */

#define EXTI_Line0       ((uint32_t)0x00001)  /*!< External interrupt line 0 */
#define EXTI_Line1       ((uint32_t)0x00002)  /*!< External interrupt line 1 */
#define EXTI_Line2       ((uint32_t)0x00004)  /*!< External interrupt line 2 */
#define EXTI_Line3       ((uint32_t)0x00008)  /*!< External interrupt line 3 */
#define EXTI_Line4       ((uint32_t)0x00010)  /*!< External interrupt line 4 */
#define EXTI_Line5       ((uint32_t)0x00020)  /*!< External interrupt line 5 */
#define EXTI_Line6       ((uint32_t)0x00040)  /*!< External interrupt line 6 */
#define EXTI_Line7       ((uint32_t)0x00080)  /*!< External interrupt line 7 */
#define EXTI_Line8       ((uint32_t)0x00100)  /*!< External interrupt line 8 */
#define EXTI_Line9       ((uint32_t)0x00200)  /*!< External interrupt line 9 */
#define EXTI_Line10      ((uint32_t)0x00400)  /*!< External interrupt line 10 */
#define EXTI_Line11      ((uint32_t)0x00800)  /*!< External interrupt line 11 */
#define EXTI_Line12      ((uint32_t)0x01000)  /*!< External interrupt line 12 */
#define EXTI_Line13      ((uint32_t)0x02000)  /*!< External interrupt line 13 */
#define EXTI_Line14      ((uint32_t)0x04000)  /*!< External interrupt line 14 */
#define EXTI_Line15      ((uint32_t)0x08000)  /*!< External interrupt line 15 */
#define EXTI_Line16      ((uint32_t)0x10000)  /*!< External interrupt line 16 Connected to the PVD Output */
#define EXTI_Line17      ((uint32_t)0x20000)  /*!< External interrupt line 17 Connected to the RTC Alarm event */
#define EXTI_Line18      ((uint32_t)0x40000)  /*!< External interrupt line 18 Connected to the USB Device/USB OTG FS
                                                   Wakeup from suspend event */                                    
#define EXTI_Line19      ((uint32_t)0x80000)  /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */
                                          
#define IS_EXTI_LINE(LINE) ((((LINE) & (uint32_t)0xFFF00000) == 0x00) && ((LINE) != (uint16_t)0x00))
#define IS_GET_EXTI_LINE(LINE) (((LINE) == EXTI_Line0) || ((LINE) == EXTI_Line1) || \
                            ((LINE) == EXTI_Line2) || ((LINE) == EXTI_Line3) || \
                            ((LINE) == EXTI_Line4) || ((LINE) == EXTI_Line5) || \
                            ((LINE) == EXTI_Line6) || ((LINE) == EXTI_Line7) || \
                            ((LINE) == EXTI_Line8) || ((LINE) == EXTI_Line9) || \
                            ((LINE) == EXTI_Line10) || ((LINE) == EXTI_Line11) || \
                            ((LINE) == EXTI_Line12) || ((LINE) == EXTI_Line13) || \
                            ((LINE) == EXTI_Line14) || ((LINE) == EXTI_Line15) || \
                            ((LINE) == EXTI_Line16) || ((LINE) == EXTI_Line17) || \
                            ((LINE) == EXTI_Line18) || ((LINE) == EXTI_Line19))

                    
/**
  * @}
  */

/**
  * @}
  */

/** @defgroup EXTI_Exported_Macros
  * @{
  */

/**
  * @}
  */

 EXTI_Line初始化对应的是向下图的哪个位写1,而不是选择总线

2.EXTI_Mode:EXTI模式(中断/事件)
/** 
  * @brief  EXTI mode enumeration  
  */

typedef enum
{
  EXTI_Mode_Interrupt = 0x00,
  EXTI_Mode_Event = 0x04
}EXTIMode_TypeDef;

#define IS_EXTI_MODE(MODE) (((MODE) == EXTI_Mode_Interrupt) || ((MODE) == EXTI_Mode_Event))
3.EXTI_Trigger:触发(上/下/上下)
/** 
  * @brief  EXTI Trigger enumeration  
  */

typedef enum
{
  EXTI_Trigger_Rising = 0x08,
  EXTI_Trigger_Falling = 0x0C,  
  EXTI_Trigger_Rising_Falling = 0x10
}EXTITrigger_TypeDef;

#define IS_EXTI_TRIGGER(TRIGGER) (((TRIGGER) == EXTI_Trigger_Rising) || \
                                  ((TRIGGER) == EXTI_Trigger_Falling) || \
                                  ((TRIGGER) == EXTI_Trigger_Rising_Falling))
4.EXTI_LineCmd:使能或者失能(IMR/EMR)

2、GPIO外部中断代码

2.1 实验设计

1. PA0连接到EXTI用于产生中断,PA0的电平变化通过按键来控制

2产生一次中断,LED反转一次


http://www.kler.cn/a/373773.html

相关文章:

  • 深度学习(八) TensorFlow、PyTorch、Keras框架大比拼(8/10)
  • 【SQL】SQL函数
  • 波兰喜嘎嘎
  • Linux 开机自动挂载硬盘
  • TDengine 数据订阅 vs. InfluxDB 数据订阅:谁更胜一筹?
  • HTML5新增属性
  • 【福建医科大学附属第一医院-注册安全分析报告】
  • nvm 版本管理工具
  • 【Python爬虫实战】网络爬虫的完整指南:基础、工作原理与实战
  • 成都云腾五洲科技“智联引擎”服务平台已发布
  • 明达云:赋能化工园区,智绘安全高效新蓝图
  • 道路安全员题库分享
  • Kafka 与传统 MQ 消息系统之间有三个关键区别?
  • MFC的SendMessage与PostMessage的区别
  • 「Mac畅玩鸿蒙与硬件3」鸿蒙开发环境配置篇3 - DevEco Studio 插件安装与配置
  • C++ | Leetcode C++题解之第516题最长回文子序列
  • 常用的关键特性
  • 心觉:抄袭是一种智慧
  • SM单元 硬件
  • 力扣227:基本计算器II
  • Java语言的Springboot框架+云快充协议1.5+充电桩系统+新能源汽车充电桩系统
  • 派生类重载的delete操作符调用时可以动态绑定吗
  • 创建一个基于SSM框架的药品商超管理系统
  • springboot响应文件流文件给浏览器+前端下载
  • redis详细教程(3.hash和set类型)
  • [TypeError]: type ‘AbstractProvider‘ is not subscriptable