STM32学习-45-[ADC]定时器触发

image
将定时器的从模式定时器配置为update模式后
TRGO连接ADC就能通过定时器触发ADC采样了

连接电路

image

初始化串口

void App_USART1_Init(void){
	// 初始化引脚
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);

	// 开启时钟
	RCC_ APB2PeriphClockCmd(RCC APB2Periph_USART1, ENABLE);

	// 配置串口参数
	USART_InitTypeDef USART_InitStruct = {0};
	USART_InitStruct.USART_BaudRate = 115200;
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStruct.USART_Mode = USART_Mode_Tx;
	USART_InitStruct.USART_Parity = USART_Parity_No;
	USART_InitStruct.USART_StopBits = USART_StopBits_1;
	USART_InitStruct.USART_WordLength = USART_WordLength_8b;
	USART_Init(USARTl, &USART_InitStruct);

	// 闭合串口总开关
	USART_Cmd(USART1, ENABLE);
}

配置定时器1的TRGO

void App_TIM1_Init(void){
	// 使能TIM1的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

	// 配置TIM1的时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct = {0};
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period = 999;
	TIM_TimeBaseInitStruct.TIM_Prescaler = 71;
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);

	// TRGO:Update
	TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update);

	// 开启定时器1的总开关
	TIM_Cmd(TIM1, ENABLE);
}

注入序列的编程接口

image

初始化ADC(注入系列)

void App_ADC_Init(void){
	// 初始化PA0引脚 模拟模式
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	GPIO InitStruct.GPIO Pin = GPIO_Pin_0;
	GPIO InitStruct.GPIO Mode = GPIO_Mode_AIN;
	GPIO_Init(GPIOA, &GPIO_InitStruct);

	// 配置ADC模块的时钟
	// 设置分频器的分频系数(6分频)
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	// 使能ADC1的时钟
	RCC_APB2PeriphCLockCmd(RCC_APB2Periph_ADC1, ENABLE);

	// 初始化ADC的基本参数
	ADC_InitTypeDef ADC_InitStruct;
	ADC_InitStruct.ADC_ContinuousConvMode = DISABLE; // 关闭连续模式
	ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; // 右对齐
	ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	// 常规序列的外部触发信号
	ADC_InitStruct.ADC_Mode = ADC_Mode_Independent; // 独立模式
	ADC_InitStruct.ADC_NbrOfChannel = 1; // 常规序列1个通道
	ADC_InitStruct.ADC_ScanConvMode = DISABLE;
	ADC_Init(ADCl,&ADC_InitStruct);

	// 配置注入序列
	ADC_InjectedSequencerLengthConfig(ADC1,1);
	ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_T1_TRGO);
	ADC_ExternalTrigConvCmd(ADC1, ENABLE);
	ADC_InjectedChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_13Cycles5);

	// 闭合ADC总开关
	ADC_Cmd(ADC1, ENABLE);
}

代码

#include "stm32f10x.h"

void App_USART1_Init(void);
void App_TIM1_Init(void);
void App_ADC_Init(void);

int main(void)
{
	App_USART1_Init();
	App_TIM1_Init(); 
	App_ADC_Init();

	while(1)
	{
		// 等待注入序列转换完成
		while(ADC_GetFlagStatus(ADC1, ADC_FLAG_JEOC) == RESET);

		// 读取转换的结果
		uint16_t jdr1 = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1);

		//3.清除JEOC标志位
		ADC_ClearFlag(ADC1, ADC_FLAG_JEOC);

		// 将结果转换成电压
		float voltags = dr * (3.3f / 4095); 

		// 之后根据电压的值做不同的处理就好了
	}
}

void App_USART1_Init(void){
	// 初始化引脚
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);

	// 开启时钟
	RCC_ APB2PeriphClockCmd(RCC APB2Periph_USART1, ENABLE);

	// 配置串口参数
	USART_InitTypeDef USART_InitStruct = {0};
	USART_InitStruct.USART_BaudRate = 115200;
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStruct.USART_Mode = USART_Mode_Tx;
	USART_InitStruct.USART_Parity = USART_Parity_No;
	USART_InitStruct.USART_StopBits = USART_StopBits_1;
	USART_InitStruct.USART_WordLength = USART_WordLength_8b;
	USART_Init(USARTl, &USART_InitStruct);

	// 闭合串口总开关
	USART_Cmd(USART1, ENABLE);
}

void App_TIM1_Init(void){
	// 使能TIM1的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

	// 配置TIM1的时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct = {0};
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period = 999;
	TIM_TimeBaseInitStruct.TIM_Prescaler = 71;
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);

	// TRGO:Update
	TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update);

	// 开启定时器1的总开关
	TIM_Cmd(TIM1, ENABLE);
}

void App_ADC_Init(void){
	// 初始化PA0引脚 模拟模式
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	GPIO InitStruct.GPIO Pin = GPIO_Pin_0;
	GPIO InitStruct.GPIO Mode = GPIO_Mode_AIN;
	GPIO_Init(GPIOA, &GPIO_InitStruct);

	// 配置ADC模块的时钟
	// 设置分频器的分频系数(6分频)
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	// 使能ADC1的时钟
	RCC_APB2PeriphCLockCmd(RCC_APB2Periph_ADC1, ENABLE);

	// 初始化ADC的基本参数
	ADC_InitTypeDef ADC_InitStruct;
	ADC_InitStruct.ADC_ContinuousConvMode = DISABLE; // 关闭连续模式
	ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; // 右对齐
	ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	// 常规序列的外部触发信号
	ADC_InitStruct.ADC_Mode = ADC_Mode_Independent; // 独立模式
	ADC_InitStruct.ADC_NbrOfChannel = 1; // 常规序列1个通道
	ADC_InitStruct.ADC_ScanConvMode = DISABLE;
	ADC_Init(ADCl,&ADC_InitStruct);

	// 配置注入序列
	ADC_InjectedSequencerLengthConfig(ADC1,1);
	ADC_ExternalTrigInjectedConfig(ADC1, ADC_ExternalTrigInjecConv_T1_TRGO);
	ADC_ExternalTrigInjectedConvCmd(ADC1, ENABLE);
	ADC_InjectedChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_13Cycles5);

	// 闭合ADC总开关
	ADC_Cmd(ADC1, ENABLE);
}
posted @ 2026-09-03 15:17  灵垚克府  阅读(8)  评论(0)    收藏  举报