首先我们需要一个定时器,它会产生一个定时中断。比如我们使用TIM2。
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秒,你可以根据需求调整 Prescaler
和 Period
,实现更短或更长的时间间隔。
接下来要让ADC通过定时器触发。我们配置ADC为外部触发模式。
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();
}
}
我们同样可以通过DMA来将ADC采集到的数据自动搬运到内存中。
c复制编辑HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_BUFFER_SIZE);
在初始化完成后,启动定时器和ADC的触发。
c复制编辑HAL_TIM_Base_Start(&htim2); // 启动定时器
HAL_ADC_Start(&hadc1); // 启动ADC
定时器开始计时后,每经过1秒(或者你设置的周期),它就会触发ADC进行采样。
和之前一样,可以使用中断回调来处理采样到的数据:
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 删除。