You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32F4下EXTI软件事件脉冲的生成检测及标准库实现问询

STM32F4 EXTI软件脉冲生成与检测实现

一、确认脉冲来自EXTI SWIER寄存器的方法

  • 硬件验证:用示波器接入对应EXTI引脚,调用触发函数后观察是否有符合预期的脉冲波形。
  • 软件寄存器校验:触发SWIER后,读取EXTI_PR(挂起寄存器)对应位,若该位置1,说明软件触发事件已成功生成;若配置了中断/事件回调,进入对应处理函数也可直接证明脉冲来自SWIER触发。

二、脉冲检测/替代指示方式

  • 硬件直观指示:将EXTI引脚连接LED,脉冲触发时通过翻转LED状态快速确认(如电平翻转一次代表一个脉冲)。
  • 软件日志输出:在中断/事件回调函数中通过串口打印调试信息(如"SWIER pulse triggered!"),通过串口助手查看触发记录。
  • 寄存器轮询检测:定时读取EXTI_PR寄存器,检查对应位是否置1,以此判断脉冲是否产生。

三、标准库EXTI软件事件模式配置代码

以EXTI线0对应PA0引脚为例,包含事件/中断模式配置:

#include "stm32f4xx.h"

void EXTI_SoftwareEvent_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    EXTI_InitTypeDef EXTI_InitStruct;
    NVIC_InitTypeDef NVIC_InitStruct;

    // 使能GPIOA和SYSCFG时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

    // 配置PA0为浮空输入(EXTI线0绑定引脚)
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    // 映射EXTI线0到PA0引脚
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);

    // 配置EXTI软件事件模式
    EXTI_InitStruct.EXTI_Line = EXTI_Line0;
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Event; // 事件模式(无中断触发,可联动DMA)
    // 若需中断模式,改为EXTI_Mode_Interrupt
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; // 软件触发默认上升沿
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStruct);

    // 若使用中断模式,配置NVIC
    NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
}

// 触发EXTI线0软件脉冲
void Trigger_Software_Pulse(void)
{
    EXTI->SWIER |= EXTI_SWIER_SWIER0; // 设置SWIER对应位生成软件事件
}

四、脉冲检测/指示实现代码

1. 中断回调指示(LED翻转)

// 提前配置LED引脚(PB5为例)
void LED_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOB, &GPIO_InitStruct);
}

// EXTI0中断服务函数
void EXTI0_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line0) != RESET)
    {
        GPIO_ToggleBits(GPIOB, GPIO_Pin_5); // 翻转LED指示脉冲触发
        EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断挂起位
    }
}

2. 软件轮询检测脉冲

// 查询EXTI_FLAG判断脉冲是否生成
uint8_t Check_Software_Pulse(void)
{
    if(EXTI_GetFlagStatus(EXTI_Line0) != RESET)
    {
        EXTI_ClearFlag(EXTI_Line0);
        return 1; // 检测到脉冲
    }
    return 0; // 未检测到
}

// 主循环示例
int main(void)
{
    LED_Config();
    EXTI_SoftwareEvent_Config();
    
    while(1)
    {
        Trigger_Software_Pulse(); // 每1秒触发一次脉冲
        Delay(1000); // 自定义延时函数(需自行实现)
        
        if(Check_Software_Pulse())
        {
            GPIO_ToggleBits(GPIOB, GPIO_Pin_5);
        }
    }
}

内容的提问来源于stack exchange,提问作者Leon Liang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:00:15