打印
[研电赛技术支持]

GD32F303 ADC DMA 软件触发

[复制链接]
4188|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
EDAStarer|  楼主 | 2020-7-8 10:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
怎样实现GD32F303 的ADC(DMA) 软件触发。需要哪个函数来控制哪个信号来触发ADC

使用特权

评论回复
沙发
sonicll| | 2020-7-8 11:15 | 只看该作者
官方固件库里的example里就有一个软件触发ADC,使用DMA的例子

使用特权

评论回复
板凳
EDAStarer|  楼主 | 2020-7-8 13:28 | 只看该作者
sonicll 发表于 2020-7-8 11:15
官方固件库里的example里就有一个软件触发ADC,使用DMA的例子

while(1){
        /* delay 1s */
        delay_1ms(1000);
        /* ADC software trigger enable */
        adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);      
    }

使用特权

评论回复
地板
EDAStarer|  楼主 | 2020-7-8 13:29 | 只看该作者
sonicll 发表于 2020-7-8 11:15
官方固件库里的example里就有一个软件触发ADC,使用DMA的例子

是用 adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL)吗

使用特权

评论回复
5
aoyi| | 2020-8-3 18:21 | 只看该作者
还没有用过dma啊

使用特权

评论回复
6
drer| | 2020-8-3 18:21 | 只看该作者
有相关的库函数?

使用特权

评论回复
7
gwsan| | 2020-8-3 18:22 | 只看该作者
是怎么样启动的吧 楼主想问的是

使用特权

评论回复
8
kxsi| | 2020-8-3 18:22 | 只看该作者
有官方例程的

使用特权

评论回复
9
nawu| | 2020-8-3 18:22 | 只看该作者
能发一下例程连接吗

使用特权

评论回复
10
小景报到| | 2021-6-21 23:45 | 只看该作者
#include "gd32f10x.h"
#include "systick.h"
#include <stdio.h>
#include "gd32f10x_eval.h"

//#define BOARD_ADC_CHANNEL           ADC_CHANNEL_13
//#define ADC_GPIO_PORT               GPIOC
//#define ADC_GPIO_PIN                GPIO_PIN_3

uint16_t adc_value[8];

void rcu_config(void);
void gpio_config(void);
void dma_config(void);
void adc_config(void);

/*!
    \brief      main function
    \param[in]  none
    \param[out] none
    \retval     none
*/

int main(void)
{
    /* system clocks configuration */
    rcu_config();
    /* systick configuration */
    systick_config();  
    /* GPIO configuration */
    gpio_config();
    /* DMA configuration */
    dma_config();
        /* configure COM port */
    gd_eval_com_init(EVAL_COM0);
    /* ADC configuration */
    adc_config();
  
    while(1){
                        delay_1ms(1000);
                        printf("\r\n //*******************************//");
                        printf("\r\n PA2 regular channel data = %04d", adc_value[0]);
                        printf("\r\n PC5 regular channel data = %04d", adc_value[1]);
                        printf("\r\n PC4 regular channel data = %04d", adc_value[2]);
                        printf("\r\n PA3 regular channel data = %04d\r\n", adc_value[3]);
                        printf("\r\n PC0 regular channel data = %04d", adc_value[4]);
                        printf("\r\n PA1 regular channel data = %04d", adc_value[5]);
                        printf("\r\n PA0 regular channel data = %04d", adc_value[6]);
                        printf("\r\n PC1 regular channel data = %04d\r\n", adc_value[7]);
                       
                       
    }
}

/*!
    \brief      configure the different system clocks
    \param[in]  none
    \param[out] none
    \retval     none
*/
void rcu_config(void)
{
    /* enable GPIOA clock */
                rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_GPIOC);
    /* enable ADC clock */
    rcu_periph_clock_enable(RCU_ADC0);
    /* enable DMA0 clock */
    rcu_periph_clock_enable(RCU_DMA0);
    /* config ADC clock */
    rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8);
}

/*!
    \brief      configure the GPIO peripheral
    \param[in]  none
    \param[out] none
    \retval     none
*/
void gpio_config(void)
{
    /* config the GPIO as analog mode */
    gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
    gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_5);
    gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_4);
    gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_3);
                gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
    gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_1);
    gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
    gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_1);

}

/*!
    \brief      configure the DMA peripheral
    \param[in]  none
    \param[out] none
    \retval     none
*/
void dma_config(void)
{
    /* ADC_DMA_channel configuration */
    dma_parameter_struct dma_data_parameter;
   
    /* ADC DMA_channel configuration */
    dma_deinit(DMA0, DMA_CH0);
   
    /* initialize DMA single data mode */
    dma_data_parameter.periph_addr  = (uint32_t)(&ADC_RDATA(ADC0));
    dma_data_parameter.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;
    dma_data_parameter.memory_addr  = (uint32_t)(&adc_value);
    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;
    dma_data_parameter.number       = 8;
    dma_data_parameter.priority     = DMA_PRIORITY_HIGH;
    dma_init(DMA0, DMA_CH0, &dma_data_parameter);
    dma_circulation_enable(DMA0, DMA_CH0);
  
    /* enable DMA channel */
    dma_channel_enable(DMA0, DMA_CH0);
}

/*!
    \brief      configure the ADC peripheral
    \param[in]  none
    \param[out] none
    \retval     none
*/
void adc_config(void)
{
    /* reset ADC */
    adc_deinit(ADC0);
    /* ADC mode config */
    adc_mode_config(ADC_MODE_FREE);
    /* ADC contineous function enable */
    adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE,ENABLE );
    /* ADC scan mode disable */
    adc_special_function_config(ADC0, ADC_SCAN_MODE, DISABLE);
    /* ADC data alignment config */
    adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
    /* ADC channel length config */
    adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 8);

    /* ADC regular channel config */
    /* ADC regular channel config */
    adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_2, ADC_SAMPLETIME_239POINT5);
    adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_15, ADC_SAMPLETIME_239POINT5);
    adc_regular_channel_config(ADC0, 2, ADC_CHANNEL_14, ADC_SAMPLETIME_239POINT5);
    adc_regular_channel_config(ADC0, 3, ADC_CHANNEL_3, ADC_SAMPLETIME_239POINT5);
        adc_regular_channel_config(ADC0, 4, ADC_CHANNEL_10, ADC_SAMPLETIME_239POINT5);
    adc_regular_channel_config(ADC0, 5, ADC_CHANNEL_1, ADC_SAMPLETIME_239POINT5);
    adc_regular_channel_config(ADC0, 6, ADC_CHANNEL_0, ADC_SAMPLETIME_239POINT5);
    adc_regular_channel_config(ADC0, 7, ADC_CHANNEL_11, ADC_SAMPLETIME_239POINT5);
    /* ADC trigger config */
    adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
    adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);
   
    /* enable ADC interface */
    adc_enable(ADC0);
    delay_1ms(1);
    /* ADC calibration and reset calibration */
    adc_calibration_enable(ADC0);

    /* ADC DMA function enable */
    adc_dma_mode_enable(ADC0);
    /* ADC software trigger enable */
    adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
}

/* retarget the C library printf function to the USART */
int fputc(int ch, FILE *f)
{
    usart_data_transmit(EVAL_COM0, (uint8_t)ch);
    while(RESET == usart_flag_get(EVAL_COM0, USART_FLAG_TBE));
    return ch;
}

使用特权

评论回复
11
QQ2224043166| | 2021-12-9 19:01 | 只看该作者
adc_software_trigger_enable()

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

52

帖子

0

粉丝