GD32E103RB AD无法正常工作,无法启动

[复制链接]
388|16
 楼主 | 2019-1-24 23:35 | 显示全部楼层 |阅读模式
       本人参考STM32参考书籍编写AD程序。使用PC4作为AD1的第14路输入,只采一路,软件启动。但发现程序运行到函数while( !adc_flag_get(ADC1,ADC_FLAG_EOC));无法出死循环,应该是AD没有启动。请各位大侠帮忙看一下程序那里没有配对。
uint16_t ADC_sam = 0;
void  PWM_GPIO_init()
{
  gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_8);
gpio_init(GPIOB,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_13);
  gpio_init(GPIOC,GPIO_MODE_AIN,GPIO_OSPEED_50MHZ,GPIO_PIN_4);
}

void RCU_init()
{
  rcu_periph_clock_enable(RCU_TIMER0);
        rcu_periph_clock_enable(RCU_GPIOA);
        rcu_periph_clock_enable(RCU_GPIOB);
  rcu_periph_clock_enable(RCU_AF);
        rcu_periph_clock_enable(RCU_ADC1);
        rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV4);
}

void ADC_int()
{
   adc_deinit(ADC1);
   adc_mode_config(ADC_MODE_FREE);
   adc_data_alignment_config(ADC1,ADC_DATAALIGN_RIGHT);
         adc_channel_length_config(ADC1,ADC_REGULAR_CHANNEL,1);
         adc_resolution_config(ADC1,ADC_RESOLUTION_12B);
         adc_special_function_config(ADC1,ADC_SCAN_MODE,DISABLE);
         adc_special_function_config(ADC1,ADC_CONTINUOUS_MODE,DISABLE);
         adc_external_trigger_config(ADC1,ADC_REGULAR_CHANNEL,DISABLE);
        adc_discontinuous_mode_config(ADC1,ADC_REGULAR_CHANNEL,1);
         adc_regular_channel_config(ADC1,1,ADC_CHANNEL_14,ADC_SAMPLETIME_7POINT5);
   adc_enable(ADC1);
        // adc_calibration_enable (ADC1);

}

uint16_t  GET_ADC(void)
{
   adc_software_trigger_enable(ADC1,ADC_REGULAR_CHANNEL);
         while( !adc_flag_get(ADC1,ADC_FLAG_EOC));
         return adc_regular_data_read(ADC1);
}

int main(void)
{
       
        RCU_init();
  PWM_GPIO_init();
        ADC_int();

        while(1)
        {
           ADC_sam = GET_ADC();
       
        }

}

| 2019-1-26 17:43 | 显示全部楼层
时钟怎么设置的啊
 楼主 | 2019-1-28 11:23 | 显示全部楼层

RCU里面就是时钟配置。其他都是系统默认设置
 楼主 | 2019-1-28 11:27 | 显示全部楼层
我通过设置adc_external_trigger_source_config(ADC1,ADC_REGULAR_CHANNEL,ADC0_1_EXTTRIG_REGULAR_NONE);
adc_external_trigger_config(ADC1,ADC_REGULAR_CHANNEL,ENABLE);
使得adc_regular_data_read(ADC1)的返回值会不断刷新,但结果始终不对。接近为0.不随输入电压变化而变化,急求解决办法?
| 2019-1-30 09:09 | 显示全部楼层
xiaobai032 发表于 2019-1-28 11:27
我通过设置adc_external_trigger_source_config(ADC1,ADC_REGULAR_CHANNEL,ADC0_1_EXTTRIG_REGULAR_NONE);
...

这个注入组和规则组  我之前也学了半天 , 建议先看编程手册里讲解。 4个规则,你用哪一个 ,然后对照,应该是5页左右的内容。可以出山
| 2019-1-30 23:30 | 显示全部楼层
参考STM32,干啥
| 2019-2-1 14:45 | 显示全部楼层
xiaobai032 发表于 2019-1-28 11:23
RCU里面就是时钟配置。其他都是系统默认设置

哦哦 那我好好看看
 楼主 | 2019-2-14 21:43 | 显示全部楼层
lvben5d 发表于 2019-1-30 09:09
这个注入组和规则组  我之前也学了半天 , 建议先看编程手册里讲解。 4个规则,你用哪一个 ,然后对照, ...

我已经解决了。adc_regular_channel_config(ADC1,1,ADC_CHANNEL_14,ADC_SAMPLETIME_7POINT5);将1变为0就可以了。因为规则组组序号是从零开始的。adc_channel_length_config(ADC1,ADC_REGULAR_CHANNEL,1);规则组的个数1就是1.这个需认真读库函数,当时没注意。
 楼主 | 2019-2-14 21:47 | 显示全部楼层
我已经解决了。adc_regular_channel_config(ADC1,1,ADC_CHANNEL_14,ADC_SAMPLETIME_7POINT5);将1变为0就可以了。因为规则组组序号是从零开始的。adc_channel_length_config(ADC1,ADC_REGULAR_CHANNEL,1);规则组的个数1就是1.这个需认真读库函数,当时没注意。
| 2019-2-15 07:51 | 显示全部楼层
本帖最后由 lvben5d 于 2019-2-15 07:55 编辑
xiaobai032 发表于 2019-2-14 21:47
我已经解决了。adc_regular_channel_config(ADC1,1,ADC_CHANNEL_14,ADC_SAMPLETIME_7POINT5);将1变为0就可 ...

哈哈 其实是个最小的错误   GD32里 void adc_regular_channel_config(uint32_t adc_periph , uint8_t rank , uint8_t adc_channel , uint32_t sample_time)                                                       rank从0开始     0 1 2
而STM32那边下标喜欢从1开始, STM32F103的库里void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)   这个Rank是must be between 1 to 16.    1 2 3

PS:  GD32所有器件的库函数外设索引均从0开始, 跟STM32从1开始不一样,这个是比较容易混淆的! 尤其是从STM32切换GD32过来的。 而且函数形参的位置也可能有调换,避免专利冲突。
| 2019-2-17 13:44 | 显示全部楼层
这个重点要注意GPIO的设计的
| 2019-2-17 13:45 | 显示全部楼层
还有adc相关模块的设计的也要重视的
| 2019-2-17 21:54 | 显示全部楼层
这个很明显的是ADC的没有启动起来的哈
| 2019-2-17 23:30 | 显示全部楼层
看程序设计的大没看出啥毛病的
| 2019-2-17 23:30 | 显示全部楼层
这个需要根据MCU的模块设计的查看相关寄存器的是否正确配置的
| 2019-2-18 23:14 | 显示全部楼层
不管怎样,基本的寄存器的配置的要注意的
| 2019-2-24 22:24 | 显示全部楼层
最主要的是看下adc的时钟的是否正常
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

快速回复 返回顶部 返回列表