首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >STM32实现定时器触发ADC的步骤

STM32实现定时器触发ADC的步骤

原创
作者头像
宾哥私房菜
发布2025-06-03 14:49:44
发布2025-06-03 14:49:44
64900
代码可运行
举报
文章被收录于专栏:stm32stm32
运行总次数:0
代码可运行

1. 配置定时器

首先我们需要一个定时器,它会产生一个定时中断。比如我们使用TIM2

代码语言:javascript
代码运行次数:0
运行
复制
c复制编辑void MX_TIM2_Init(void)
{
    TIM_ClockConfigTypeDef sClockSourceConfig = {0};
    TIM_MasterConfigTypeDef sMasterConfig = {0};

    htim2.Instance = TIM2;
    htim2.Init.Prescaler = 7199;          // 预分频,定时器时钟频率为72MHz
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = 9999;             // 定时器溢出周期,1秒钟
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
    if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
    {
        Error_Handler();
    }

    sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
    if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
    {
        Error_Handler();
    }

    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;  // 选择TRGO触发信号
    sMasterConfig.MasterInputTrigger = TIM_TS_ITR0;
    if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
    {
        Error_Handler();
    }

    // 启动定时器
    HAL_TIM_Base_Start(&htim2);
}

这个定时器的周期是1秒,你可以根据需求调整 PrescalerPeriod,实现更短或更长的时间间隔。


2. 配置ADC触发模式

接下来要让ADC通过定时器触发。我们配置ADC为外部触发模式

代码语言:javascript
代码运行次数:0
运行
复制
c复制编辑void MX_ADC1_Init(void)
{
    ADC_ChannelConfTypeDef sConfig = {0};

    hadc1.Instance = ADC1;
    hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;      // 单通道
    hadc1.Init.ContinuousConvMode = ENABLE;           // 连续采样
    hadc1.Init.DiscontinuousConvMode = DISABLE;
    hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T2_TRGO;  // 定时器TIM2溢出触发ADC
    hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    hadc1.Init.NbrOfConversion = 1;
    if (HAL_ADC_Init(&hadc1) != HAL_OK)
    {
        Error_Handler();
    }

    sConfig.Channel = ADC_CHANNEL_10;                 // 设置ADC通道
    sConfig.Rank = ADC_REGULAR_RANK_1;
    sConfig.SamplingTime = ADC_SAMPLETIME_28CYCLES_5;
    if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    {
        Error_Handler();
    }
}

3. 配置DMA(如果你需要DMA来搬运数据)

我们同样可以通过DMA来将ADC采集到的数据自动搬运到内存中。

代码语言:javascript
代码运行次数:0
运行
复制
c复制编辑HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_BUFFER_SIZE);

4. 启动定时器和ADC

在初始化完成后,启动定时器和ADC的触发。

代码语言:javascript
代码运行次数:0
运行
复制
c复制编辑HAL_TIM_Base_Start(&htim2);         // 启动定时器
HAL_ADC_Start(&hadc1);              // 启动ADC

定时器开始计时后,每经过1秒(或者你设置的周期),它就会触发ADC进行采样。


5. 处理ADC数据(回调函数)

和之前一样,可以使用中断回调来处理采样到的数据:

代码语言:javascript
代码运行次数:0
运行
复制
c复制编辑void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    if (hadc->Instance == ADC1)
    {
        // 处理adc_buffer中的数据
        Process_ADC_Data(&adc_buffer[0]);
    }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 配置定时器
  • 2. 配置ADC触发模式
  • 3. 配置DMA(如果你需要DMA来搬运数据)
  • 4. 启动定时器和ADC
  • 5. 处理ADC数据(回调函数)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档