以下是我的cubemx配置图,我想做4M系统时钟配置10M采样频率,ADC用的时钟是锁相环2,配置140M。开启ADC电源后,单独使用ADC_start可以从寄存器读取ADC的值,但使用ADC_start_DMA这个就完全不运行,但是主循环里的串口打印一直有,求解(ADC4因为要配置IN16使用了不可完全设置ADC这个选项!)
在使用了下面开启电源并打开adc dma后,打印adc value的数据
HAL_PWREx_EnableVddA();
HAL_PWREx_EnableVddIO2();
if (HAL_ADCEx_Calibration_Start(&hadc4, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)
{
/* Calibration Error */
Error_Handler();
}
HAL_ADC_Start_DMA(&hadc4, (uint32_t *)&adc_Value, 16);
……
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc4), HAL_ADC_STATE_REG_EOC))
{
for (int i = 0; i < 50; i++)
printf("%d ", adc_Value[i]);
}
printf("\n");
打出来全是空格,表明ADC没转换完成。
顾名思义,就是由定时器设定时间,到点就启动ADC采样,这样可以精确控制采样率。
首先设置定时器的计时参数,这里设置为1s(可以不开启定时器中断):
ADC的设置中,要关闭连续转换模式,并且设置为定时器触发:
这里如果连续转换不关闭,会自动连续运行,不受定时器触发的控制。所以要disable。
最后,还要开启ADC中断。
设置好之后就可以生成工程代码了。
在keil中打开工程,重写ADC中断的回调函数,以指示ADC转换好:
main函数中添加如下代码,检测是否转换好,并读取AD值回传:
下载到板子运行,可以看到每1s输出一个ad值,说明实现了定时器触发adc转换的功能。
好了,这一节的内容基本讲完了。
欢迎关注我的公众号,可留言“资料”获取相关资料和软件: