【GD32】GD32 DMA+ADC多通道扫描

芯片: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, 
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值