打印

需要stm32f0系列的单片机程序下载到GD32E230中时ADC采样为0

[复制链接]
905|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
15125413637|  楼主 | 2020-11-13 09:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,想用stm32的程序下载到GD32中发现其他功能都没问题,但是ADC采样值一直为0,也百度修改过ADC的时钟,没有超过14M,也在ADC初始化后延时了,均采不到值,也使用过官方的固件库例程,程序编译没有问题,引脚也没有问题,但成功下载进板子以后没有效果出现,试了好几个程序都是这样,求解!!!!

使用特权

评论回复
沙发
ykwym| | 2020-11-13 15:02 | 只看该作者
2者的adc是不兼容的,e230的adc和stm32f103的adc是兼容的。

使用特权

评论回复
板凳
weifeng90| | 2020-11-13 15:50 | 只看该作者
两个MCU的ADC不是完全兼容的哦

使用特权

评论回复
地板
edyd| | 2020-11-16 17:50 | 只看该作者
来,E230的ADC,官方例程,增加了内部温度和参考电压采集,采用DMA方式传输
#include "adc.h"


uint16_t adc_value[3];

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


void adc_init(void)
{       
/* system clocks configuration */
        rcu_config();
        /* systick configuration */
        systick_config();  
        /* GPIO configuration */
        gpio_config();
        /* DMA configuration */
        dma_config();
        /* ADC configuration */
        adc_config();
       
}



/*!
    \brief      configure the different system clocks
    \param[in]  none
    \param[out] none
    \retval     none
*/
void rcu_config(void)
{
    /* enable GPIOC clock */
    rcu_periph_clock_enable(RCU_GPIOA);
    /* enable ADC clock */
    rcu_periph_clock_enable(RCU_ADC);
    /* enable DMA clock */
    rcu_periph_clock_enable(RCU_DMA);
    /* config ADC clock */
    rcu_adc_clock_config(RCU_ADCCK_APB2_DIV6);
}

/*!
    \brief      configure the GPIO peripheral
    \param[in]  none
    \param[out] none
    \retval     none
*/
void gpio_config(void)
{
    /* config the GPIO as analog mode */
    gpio_mode_set(ADC_GPIO_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, ADC_GPIO_PIN);
}

/*!
    \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(DMA_CH0);
   
    /* initialize DMA single data mode */
    dma_data_parameter.periph_addr  = (uint32_t)(&ADC_RDATA);
    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       = 3U;
    dma_data_parameter.priority     = DMA_PRIORITY_HIGH;
    dma_init(DMA_CH0, &dma_data_parameter);

    dma_circulation_enable(DMA_CH0);
  
    /* enable DMA channel */
    dma_channel_enable(DMA_CH0);
}

/*!
    \brief      configure the ADC peripheral
    \param[in]  none
    \param[out] none
    \retval     none
*/
void adc_config(void)
{
    /* ADC contineous function enable */
    //adc_special_function_config(ADC_CONTINUOUS_MODE, ENABLE);
          adc_special_function_config(ADC_SCAN_MODE, ENABLE);
          adc_tempsensor_vrefint_enable();
    /* ADC trigger config */
    adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_NONE);

    /* ADC data alignment config */
    adc_data_alignment_config(ADC_DATAALIGN_RIGHT);
       
       
       
       
    /* ADC channel length config */
    adc_channel_length_config(ADC_REGULAR_CHANNEL, 3U);

    /* ADC regular channel config */
    adc_regular_channel_config(0U, BOARD_ADC_CHANNEL, ADC_SAMPLETIME_239POINT5);
   
        /*添加ref和temp通道*/
            /* ADC temperature sensor channel config */
    adc_regular_channel_config(1U, ADC_CHANNEL_16, ADC_SAMPLETIME_239POINT5);
    /* ADC internal reference voltage channel config */
    adc_regular_channel_config(2U, ADC_CHANNEL_17, ADC_SAMPLETIME_239POINT5);
       
          adc_external_trigger_config(ADC_REGULAR_CHANNEL, ENABLE);
       
    /* enable ADC interface */
    adc_enable();
    delay_1ms(1U);
    /* ADC calibration and reset calibration */
    adc_calibration_enable();

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

使用特权

评论回复
5
edyd| | 2020-11-16 17:52 | 只看该作者
本帖最后由 edyd 于 2020-11-16 21:39 编辑

ADC.h内容:
#include "gd32e23x.h"
#include "systick.h"

#define BOARD_ADC_CHANNEL          ADC_CHANNEL_6 //PA6上 adcin6
#define ADC_GPIO_PORT              GPIOA
#define ADC_GPIO_PIN               GPIO_PIN_6


extern uint16_t adc_value[3];

void adc_init(void);   //ADC初始化





while(1)之前调用 adc_init();之后用的时候使用一句:adc_software_trigger_enable(ADC_REGULAR_CHANNEL);//启动单片机内部ADC (用一次会采集一次,需要循环采集可根据需要启动)       DMA中断会自动更新采集到的数据,根据你的需要去读取就行了。

使用特权

评论回复
6
清溪| | 2020-11-19 21:51 | 只看该作者
GD32E230和 STM32F0 的 ADC 设计不同,但和 STM32F103 配置相同。若要将STM32F0的ADC程序在GD32E230 MCU上跑,需要将STM32F0xx标准库中的 stm32f0xx_adc.h 和 stm32f0xx_adc.c 文件内代码替换为 STM32F10x 标准库中stm32f10x_adc.h 和 stm32f10x_adc.c 里的代码,修改 stm32f0xx.h 中的 ADC 寄存器结构体。

使用特权

评论回复
7
liangshuang95| | 2020-11-20 07:46 | 只看该作者
GD和ST的ADC外设不兼容吧!

使用特权

评论回复
8
嵌入小菜菜| | 2020-11-20 08:16 | 只看该作者
你直接用,当然不行了,一定不行的。怎么可能性的呢?

使用特权

评论回复
9
清溪| | 2020-11-20 20:32 | 只看该作者
具体移植步骤如下:
(1) 将 stm32f10x_adc.c 中的代码复制到 stm32f0xx_adc.c 中替换原始内容,将两个头文件声明改回 0xx 的头文件声明,stm32f0xx_adc.h 和stm32f0xx_rcc.h;
  (2)   将替换后的 stm32f0xx_adc.c 中 void ADC_DeInit(ADC_TypeDef* ADCx)函数内除 ADC1外的代码删除;
(3) 将 stm32f10x_adc.h 中的代码复制到 stm32f0xx_adc.h 中替换原始内容,头文件声明改回 0xx 的头文件声明;
(4) 将 stm32f10x.h 中的 ADC 寄存器结构体 ADC_TypeDef 复制到 stm32f0xx.h 中替换原有的 ADC_TypeDef;
(5)若ADC功能程序卡在while(ADC_GetResetCalibrationStatus(ADC1)),尝试使能下时钟: RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

使用特权

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

本版积分规则

7

主题

22

帖子

0

粉丝