芯片:GD32F350 运行在8M
目标:每10ms读取三个adc通道,并且通过DMA传输
流程
1.配置DMA传输
2.配置ADC模式和通道
3.配置定时器定时触发
4.中断函数和获取足够数据后进行数据处理
说明:本次使用ADC的定时扫描模式,由定时器触发ADC采集转换
ADC扫描模式预先设定好读取的通道,比如ch4 ch5 ch8,当触发adc时候就会连续采集三个通道的数据,通过dma传输到内存,过程(触发->4->5->8->触发->4->5->8->触发->4->5->8->触发)
注意是触发一次即转换三个通道的数据,而不是触发一次转换一个通道
1.配置DMA传输
//adc 的dma是否传输完成标志位
bool flag_DMA_ADC_accomplish = FALSE;
//dma缓冲区
uint16_t battery_ADC_value_arry[ADC_VALUE_ARRY_SIZE] = {
0};
/* 使能dma时钟 */
rcu_periph_clock_enable(RCU_DMA);
/* dma初始化结构体 */
dma_parameter_struct dma_data_parameter;
/* 复位DAM通道 */
dma_deinit(DMA_CH0);
//ADC_RDATA是读取adc数据的寄存器
dma_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA);
dma_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
//battery_ADC_value_arry 是存储adc数据的内存数组
dma_data_parameter.memory_addr = (uint32_t)(&battery_ADC_value_arry);
dma_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT;
//从外设到内存
dma_data_parameter.direction = DMA_PERIPHERAL_TO_MEMORY;
//这里的150是设置dma搬运数据的个数即3个通道共读取150个数据,每个通道读取50个,完成后会触发中断
dma_data_parameter.number = 150;
dma_data_parameter.priority = DMA_PRIORITY_HIGH;
dma_init(DMA_CH0, &dma_data_parameter);
dma_circulation_enable(DMA_CH0);
//设置dma中断优先级
nvic_irq_enable(DMA_Channel0_IRQn, 0,