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

stm32 外部中断实现

外部中断是 STM32 中非常重要的功能,它允许外设信号在满足特定条件(如上升沿、下降沿或任意电平变化)时打断 CPU 当前正在执行的任务,转而执行预先编写好的中断服务程序。以下是使用 STM32 标准库实现外部中断的一般步骤:

  1. 使能 GPIO 和 AFIO 时钟:GPIO 用于连接外部信号源,AFIO(复用功能 IO)用于将 GPIO 引脚映射到外部中断线上。
  2. 配置 GPIO 引脚:将 GPIO 引脚配置为输入模式。
  3. 配置外部中断线:选择要使用的外部中断线,并将其连接到对应的 GPIO 引脚。
  4. 配置中断触发方式:可以选择上升沿触发、下降沿触发或双边沿触发。
  5. 使能外部中断线:使能所选的外部中断线。
  6. 配置 NVIC(嵌套向量中断控制器):设置中断优先级,使能对应的中断通道。
  7. 编写中断服务函数:当中断发生时,CPU 会自动跳转到该函数执行。

代码示例

下面是一个使用 STM32F10x 标准库实现外部中断的示例代码,假设使用 PA0 引脚作为外部中断输入,下降沿触发:

#include "stm32f10x.h"

// 外部中断初始化函数
void EXTI_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    // 使能GPIOA和AFIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

    // 配置PA0为浮空输入
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 将PA0连接到EXTI0
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);

    // 配置EXTI0
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

    // 配置NVIC
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

// 外部中断0服务函数
void EXTI0_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line0) != RESET)
    {
        // 在这里添加中断处理代码
        // 例如控制LED闪烁
        GPIO_SetBits(GPIOC, GPIO_Pin_13); // 点亮LED
        for (int i = 0; i < 1000000; i++); // 简单延时
        GPIO_ResetBits(GPIOC, GPIO_Pin_13); // 熄灭LED

        // 清除中断标志位
        EXTI_ClearITPendingBit(EXTI_Line0);
    }
}

int main(void)
{
    // 使能GPIOC时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

    // 配置PC13为推挽输出
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    // 初始化外部中断
    EXTI_Configuration();

    while (1)
    {
        // 主循环可以执行其他任务
    }
}

复杂应用场景

按键消抖与多按键识别

在实际应用中,按键按下时会产生机械抖动,可能会导致多次触发中断。可以在中断服务函数中添加延时消抖处理,确保只有一次有效触发。同时,如果有多个按键连接到不同的 GPIO 引脚,可以通过判断不同的外部中断线来识别不同的按键。

电机控制与位置检测

在电机控制中,外部中断可以用于检测电机的位置传感器信号。例如,使用编码器作为位置传感器,当编码器输出脉冲信号时,触发外部中断。在中断服务函数中,可以读取编码器的计数值,从而精确控制电机的位置和速度。

通信协议解析

在通信协议解析中,外部中断可以用于检测通信信号的起始位或同步信号。当检测到特定的信号时,触发外部中断,在中断服务函数中开始解析通信数据,提高通信的实时性和准确性。

原文地址:https://blog.csdn.net/weixin_58038206/article/details/146497639
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/600518.html

相关文章:

  • 深入剖析Java虚拟机(JVM):从零开始掌握Java核心引擎
  • 【象形柱状图】——1
  • TCP传输---计算机网络
  • WebSocket 的错误处理与断线重连
  • 26考研——图_图的基本概念(6)
  • Apache Spark - 用于大规模数据分析的统一引擎
  • QuecPython 网络协议之TCP/UDP协议最祥解析
  • 【stm32】用从模式控制器 完成PWM的测量
  • GZCTF平台搭建及题目上传
  • 麦谷科技-前端面经
  • CMS漏洞-WordPress篇
  • 面试康复训练-SQL语句
  • 在什么情况下使用<script setup>语法糖更好
  • 框架基本知识总结 Day17
  • 【TCP】三次握手,四次挥手详解--UDP和TCP协议详解
  • 社群经济4.0时代:开源链动模式与AI技术驱动的电商生态重构
  • Unity 开发休闲手游:M_Studio 实战指南,源码课件全解析
  • Java Spring Cloud应用全栈性能优化指南
  • 25. 策略模式
  • 前缀和算法:从暴力遍历到高效查询的蜕变(C++实现)