主要内容:ADC采集完后的快速稳定转存
双缓存下次ADC数据采集相关笔记(二)写一写
原型:C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。
应用
volatile uint16_t adc_buff[ADC_SIZE]; /* 存放ADC采集的数据 */
volatile uint16_t adc_cache_buff[ADC_SIZE]; /* 存放ADC采集数据的缓存 */
volatile uint8_t AdcConvEnd = 0; /* ADC转换完毕标志位 */
//ADC初始化
MX_ADC1_Init();
MX_TIM3_Init(); // 用于ADC采集触发
//开始采集
HAL_TIM_Base_Start(&htim3);
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buff, ADC_SIZE);
//存满操作
if (AdcConvEnd == 1)
{
memcpy((void*)adc_cache_buff, (const void*)adc_buff, ADC_SIZE*(sizeof(uint16_t)));
AdcConvEnd = 0;
HAL_TIM_Base_Start(&htim3); /* 开启定时器3 */
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buff, ADC_SIZE); /* 开启ADC_DMA传输 */
}
//回调函数
//HAL_ADC_ConvCpltCallback
//DMA转换完数据中断回调函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if (hadc == (&hadc1))
{
AdcConvEnd = 1;
HAL_TIM_Base_Stop(&htim3); /* 关闭TIM3,采集停止 */
}
}
//ADC配置
ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma_adc1;
/* ADC1 init function */
void MX_ADC1_Init(void)
{
/* USER CODE BEGIN ADC1_Init 0 */<