写一段定时器触发stm32的ADC转换的程序,不使用HAL库
时间: 2023-06-11 08:06:06 浏览: 82
以下是一个简单的定时器触发STM32的ADC转换的程序,不使用HAL库:
```c
#include "stm32f4xx.h"
#define ADC_VALUE_MAX 4095 // ADC最大值
void init_adc(void);
void init_timer(void);
int main(void)
{
init_adc(); // 初始化ADC
init_timer(); // 初始化定时器
while (1)
{
// 等待ADC转换完成
while (!(ADC1->SR & ADC_SR_EOC));
uint16_t adc_value = ADC1->DR & ADC_DR_DATA; // 读取ADC转换结果
uint16_t voltage = adc_value * 3300 / ADC_VALUE_MAX; // 将ADC值转换为电压值
}
}
void init_adc(void)
{
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // 启用ADC时钟
ADC1->CR2 |= ADC_CR2_ADON; // 启用ADC
ADC1->CR2 |= ADC_CR2_EXTEN_0; // 选择定时器触发
ADC1->CR2 |= ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_1; // 选择定时器为TIM2 TRGO事件
ADC1->SQR1 |= ADC_SQR1_L_0; // 选择一个ADC通道进行转换
ADC1->SQR3 |= ADC_SQR3_SQ1_0 | ADC_SQR3_SQ1_1 | ADC_SQR3_SQ1_2; // 选择ADC通道为IN3
}
void init_timer(void)
{
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // 启用定时器时钟
TIM2->PSC = 84 - 1; // 设置预分频器,将定时器时钟分频为84MHz/84=1MHz
TIM2->ARR = 1000 - 1; // 设置自动重载值,将定时器计数器在1ms时重新加载
TIM2->CR2 |= TIM_CR2_MMS_1; // 选择TRGO事件作为触发源
TIM2->CR1 |= TIM_CR1_CEN; // 启用定时器
}
```
该程序使用定时器TIM2触发ADC进行转换。在main函数中,程序等待ADC转换完成,然后读取ADC转换结果,并将其转换为电压值。init_adc函数配置ADC的转换参数,包括选择定时器触发、选择转换通道等。init_timer函数配置定时器TIM2的参数,包括设置预分频器、自动重载值、选择TRGO事件触发源等。
阅读全文