STM32 外部上升沿触发ADC采集

基于STM32 实现外部上升沿触发ADC采集
PB11 上升沿 → EXTI Line 11 Event → ADC 采集
STM32F103 的 ADC 外部触发源中有一个 ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO,它就是 EXTI Line 11 的事件信号,正好对应 PB11。

完整代码实现

#include "stm32f10x.h"

// 全局变量存放 ADC 转换结果
volatile uint16_t ADC_ConvertedValue = 0;

void PB11_Trigger_ADC_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    EXTI_InitTypeDef EXTI_InitStruct;
    ADC_InitTypeDef ADC_InitStruct;

    // ========== 1. 使能时钟 ==========
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB 
                         | RCC_APB2Periph_AFIO 
                         | RCC_APB2Periph_ADC1, ENABLE);

    // ========== 2. 配置 PB11 ==========
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;   // 下拉输入
    GPIO_Init(GPIOB, &GPIO_InitStruct);

    // ========== 3. 配置 EXTI Line 11(Event 模式)==========
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource11);

    EXTI_InitStruct.EXTI_Line    = EXTI_Line11;
    EXTI_InitStruct.EXTI_Mode    = EXTI_Mode_Event;       // ← Event 模式,不进入中断
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;   // ← 上升沿触发
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStruct);

    // ========== 4. 配置 ADC ==========
    ADC_InitStruct.ADC_Mode               = ADC_Mode_Independent;
    ADC_InitStruct.ADC_ScanConvMode       = DISABLE;
    ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStruct.ADC_ExternalTrigConv   = ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO; // ← EXTI 11 触发
    ADC_InitStruct.ADC_DataAlign          = ADC_DataAlign_Right;
    ADC_InitStruct.ADC_NbrOfChannel       = 1;
    ADC_Init(ADC1, &ADC_InitStruct);

    // ========== 5. 配置 ADC 通道 ==========
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);

    // ========== 6. 使能 ADC 外部触发 ==========
    ADC_ExternalTrigConvCmd(ADC1, ENABLE);

    // ========== 中断和模拟看门狗的配置(如果有需要) ==========

    // ========== 7. 使能 ADC ==========
    ADC_Cmd(ADC1, ENABLE);

    // ========== 8. ADC 校准 ==========
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));
}

// ADC 转换完成中断(可选)
void ADC1_2_IRQHandler(void)
{
    if(ADC_GetITStatus(ADC1, ADC_IT_EOC) != RESET)``
    {
        ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
        ADC_ConvertedValue = ADC_GetConversionValue(ADC1);
    }
}

int main(void)
{
    PB11_Trigger_ADC_Config();

    while(1)
    {
        // 方式一:查询 EOC 标志(无需 NVIC)
        if(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) != RESET)
        {
            ADC_ConvertedValue = ADC_GetConversionValue(ADC1);
        }

        // 方式二:用 EOC 中断(需开启 NVIC)
        // 需要在配置中增加 ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
    }
}
posted @ 2026-05-28 21:06  Yang先生丶  阅读(44)  评论(0)    收藏  举报