打印

STM32转DG32 ADC-DMA问题

[复制链接]
1110|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zfczfc0|  楼主 | 2020-10-27 19:04 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
ADC, DMA, ni, IO
本帖最后由 zfczfc0 于 2020-10-28 15:19 编辑

     总的来说,直接在ST的工程上调试DG32的平台。发现在ADC-DMA多路采集时出现了:PA1(ADC1_IN1)采的ADC的值始终没有变化,我用的是DG32F103C8T6,大神求解答[img][/img]
static void ADCx_GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
       
        // 打开 ADC IO端口时钟
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO,ENABLE);
        // 配置 ADC IO 引脚模式
        GPIO_InitStructure.GPIO_Pin =         ADC_CHECK2_Port | ADC_CHECK3_Port |
                                                                                                                                        ADC_CHECK4_Port| ADC_CHECK5_Port | ADC_CHECK6_Port |
                                                                                                                                        ADC_CHECK7_Port| ADC_CHECK8_Port | ADC_CHECK9_Port;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);       
       
        GPIO_InitStructure.GPIO_Pin =         ADC_CHECK1_Port | ADC_CHECK10_Port;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_Init(GPIOB, &GPIO_InitStructure);               
}

static void ADCx_Mode_Config(void)
{
        DMA_InitTypeDef DMA_InitStructure;
        ADC_InitTypeDef ADC_InitStructure;
       
        // 打开DMA时钟
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
        // 打开ADC时钟
        RCC_APB2PeriphClockCmd ( RCC_APB2Periph_ADC1, ENABLE );
       
        // 复位DMA控制器
        DMA_DeInit(DMA1_Channel1);
       
        // 配置 DMA 初始化结构体
        // 外设基址为:ADC 数据寄存器地址
        DMA_InitStructure.DMA_PeripheralBaseAddr = ( u32 ) ( & ( ADC1->DR ) );
       
        // 存储器地址
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)g_ADCValueBuffer;
       
        // 数据源来自外设
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
       
        // 缓冲区大小,应该等于数据目的地的大小
        DMA_InitStructure.DMA_BufferSize = DMA_TRANSFER_NUM;
       
        // 外设寄存器只有一个,地址不用递增
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

        // 存储器地址递增
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
       
        // 外设数据大小为半字,即两个字节
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
       
        // 内存数据大小也为半字,跟外设数据大小相同
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
       
        // 循环传输模式
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;       

        // DMA 传输通道优先级为高,当使用一个DMA通道时,优先级设置不影响
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
       
        // 禁止存储器到存储器模式,因为是从外设到存储器
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
       
        // 初始化DMA
        DMA_Init(DMA1_Channel1, &DMA_InitStructure);
       
        // 使能 DMA 通道
        DMA_Cmd(DMA1_Channel1 , ENABLE);
       
        // ADC 模式配置
        // 只使用一个ADC,属于单模式
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
       
        // 扫描模式
        ADC_InitStructure.ADC_ScanConvMode = ENABLE ;

        // 连续转换模式
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

        // 不用外部触发转换,软件开启即可
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

        // 转换结果右对齐
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
       
        // 转换通道个数
        ADC_InitStructure.ADC_NbrOfChannel = DMA_TRANSFER_NUM;       
               
        // 初始化ADC
        ADC_Init(ADC1, &ADC_InitStructure);
       
        // 配置ADC时钟N狿CLK2的8分频,即9MHz
        RCC_ADCCLKConfig(RCC_PCLK2_Div8);
       
        // 配置ADC 通道的转换顺序和采样时间
        ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 1, ADC_SampleTime_55Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 2, ADC_SampleTime_55Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 3, ADC_SampleTime_55Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5);
        //ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 4, ADC_SampleTime_55Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 5, ADC_SampleTime_55Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 6, ADC_SampleTime_55Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 7, ADC_SampleTime_55Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_Vrefint, 8, ADC_SampleTime_55Cycles5);
        // 使能ADC DMA 请求
        ADC_DMACmd(ADC1, ENABLE);
       
        // 开启ADC ,并开始转换
        ADC_Cmd(ADC1, ENABLE);
        for(uint16_t i =0; i < 0x100; i++);             //gd32  使能ADC后需要有20us的延时
        // 初始化ADC 校准寄存器  
        ADC_ResetCalibration(ADC1);
        // 等待校准寄存器初始化完成
        while(ADC_GetResetCalibrationStatus(ADC1));
       
        // ADC开始校准
        ADC_StartCalibration(ADC1);
        // 等待校准完成
        while(ADC_GetCalibrationStatus(ADC1));
       
        // 由于没有采用外部触发,所以使用软件触发ADC转换
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

截图1.png (200.51 KB )

初始化

初始化

图片1.png (18.46 KB )

浮空1.7,但是有一路始终是1.5

浮空1.7,但是有一路始终是1.5

使用特权

评论回复
评论
zfczfc0 2020-10-27 19:12 回复TA
正常浮空是1.74V左右,但是有一路始终时1.53V左右。我自己又去单独用DG32在加一个工程,可以正确的采集。很疑惑??? 
沙发
sonicll| | 2020-10-28 10:28 | 只看该作者
你为什么要采集浮空值?浮空值不同芯片不同pin脚都不一样,没有什么意义。ADC采样靠的是外部输入信号给内部采样电容充电,没有外部输入信号的话,ADC采样值没有意义

使用特权

评论回复
评论
sonicll 2020-10-28 15:21 回复TA
@zfczfc0 :你把代码重新贴一下吧,原图根本看不清楚 
zfczfc0 2020-10-28 15:16 回复TA
项目需要检测高、低、浮空三种状态。但是不管我给高还是低,他始终就是1.5V,知道啥问题吗? 
板凳
sonicll| | 2020-10-28 15:33 | 只看该作者
代码大体上没有问题,检查一下PA1是否配置了模拟模式,DMA传输数量,ADC序列长度是否正确,还有芯片焊接有没有问题

使用特权

评论回复
地板
zfczfc0|  楼主 | 2020-10-28 17:16 | 只看该作者
sonicll 发表于 2020-10-28 15:33
代码大体上没有问题,检查一下PA1是否配置了模拟模式,DMA传输数量,ADC序列长度是否正确,还有芯片焊接有 ...

配置错了

使用特权

评论回复
评论
zfczfc0 2020-12-25 14:31 回复TA
@BFriday :就上面的代码可以用的 
BFriday 2020-12-16 10:10 回复TA
大哥,解决后的代码可以发一下吗 
5
jiangyongabc| | 2020-12-16 21:00 | 只看该作者
程序不能直接拿过来用啊

使用特权

评论回复
6
250211597pl| | 2020-12-24 08:18 | 只看该作者
最近也在为STM32的片子发愁,不得不转GD32楼主可否方便提供一个转GD32后的工程模板?不需要您的其他项目的源代码。。

使用特权

评论回复
7
zfczfc0|  楼主 | 2020-12-25 14:27 | 只看该作者
250211597pl 发表于 2020-12-24 08:18
最近也在为STM32的片子发愁,不得不转GD32楼主可否方便提供一个转GD32后的工程模板?不需要您的其他项目的 ...

STM32F103C8T6和GD32C8T6  这两个是pintopin的,ST的程序可以直接下到GD的芯片上的。只是可能会改很小的已部分。比如ADC这里加一个延时就行了

使用特权

评论回复
8
250211597pl| | 2020-12-26 11:17 | 只看该作者
zfczfc0 发表于 2020-12-25 14:27
STM32F103C8T6和GD32C8T6  这两个是pintopin的,ST的程序可以直接下到GD的芯片上的。只是可能会改很小的 ...

这几年用ST心累啊...前连年用stms003f3量产,结果价格从1快多飙到三块多,最后转了新塘PIN TO PIN的,中间这两年不死心又用STM32,和STM8S105这情况今年又不得不转。。。。

使用特权

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

本版积分规则

2

主题

17

帖子

1

粉丝