野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4021|回复: 0

ADC+DMA实验串口无输出,不清楚问题出在哪里

[复制链接]
发表于 2023-3-5 20:11:33 | 显示全部楼层 |阅读模式
单独的DMA和ADC实验都是正常的,加在一起后,串口无法打印数据。

uint16_t AD_Value[4]={0,0,0,0};

void AD_Init(void)
{
//开启adc时钟,使能GPIOA
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE );
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE );
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
       
//预分频,主频72M,adc最高14M
        RCC_ADCCLKConfig(RCC_PCLK2_Div8);

        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入模式,防止干扰,ADC专属模式
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC,&GPIO_InitStructure);

        ADC_InitTypeDef ADC_InitStructure;
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE ;//连续转换还是单次转换,单次转换
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐,高4位为0
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//外部触发源,该处使用软件触发,则无外部触发
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式,一个ADC转换
        ADC_InitStructure.ADC_NbrOfChannel = 1;//扫描模式下,使用的通道数
        ADC_InitStructure.ADC_ScanConvMode = ENABLE ;//扫描转换模式,非扫描

//规则化通道,16通道,但只有一位数据可读,避免数据覆盖,使用DMA转运数据
//通道0,序列1,55.5转换时间
        ADC_RegularChannelConfig(ADC1,ADC_Channel_11,1,ADC_SampleTime_55Cycles5);

        ADC_Init(ADC1,&ADC_InitStructure);

       

        DMA_InitTypeDef DMA_InitStructure;       
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR ;//外设起始地址
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设数据宽度,设置为半字节模式
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设是否自增,数组,需要自增传输下一个存储空间,失能为同一存储空间
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)AD_Value;//存储起始地址
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//存储数据宽度
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储是否自增
        DMA_InitStructure.DMA_BufferSize = 1;//传输计数器
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//传输方向,外设到存储
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//硬件触发还是软件触发
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//是否使用自动重装
        DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//       
       
        DMA_Init(DMA1_Channel1,&DMA_InitStructure);

        DMA_Cmd(DMA1_Channel1,ENABLE);//使能DMA


        ADC_DMACmd(ADC1,ENABLE);
        ADC_Cmd(ADC1,ENABLE);

//开启转换,要求校准
        ADC_ResetCalibration(ADC1);//复位校准
        while(ADC_GetResetCalibrationStatus(ADC1) == SET );//
        ADC_StartCalibration(ADC1);
        while(ADC_GetCalibrationStatus(ADC1) == SET);
       
}

void AD_GetValue(void)
{

        DMA_Cmd(DMA1_Channel1,DISABLE);//失能DMA
        DMA_SetCurrDataCounter(DMA1_Channel1,4);
        DMA_Cmd(DMA1_Channel1,ENABLE);
        ADC_SoftwareStartConvCmd(ADC1,ENABLE);

        while(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET );
        DMA_ClearFlag(DMA1_FLAG_TC1);

}


extern uint16_t AD_Value[4];

int main(void)
{
       
        Serial_Init();
        AD_Init();

        while(1)
{
        AD_GetValue();
        printf("%c",AD_Value[0]);
}
}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-27 04:05 , Processed in 0.031546 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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