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);
}
}

浙公网安备 33010602011771号