打印
[STM32F1]

DMA传送AD值的问题

[复制链接]
1198|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangch_sh|  楼主 | 2014-7-18 16:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DMA, AD, ADC, dc, ni
我想用DMA传送两路AD转换的值,用DMA1,传送PA0(ADC123_IN0)和PB0(ADC12_IN8)的采样值。
可是只传送一路是对的。改成传送两路就不对了。请大神指教,谢谢!
附程序。
/****************************************************************************
* 名    称:void ADC_Configuration(void)
* 功    能:ADC 配置函数
* 入口参数:无
* 出口参数:无
* 说    明:
* 调用方法:
****************************************************************************/
void ADC_Configuration(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
    //设置AD模拟输入端口为输入 1路AD 规则通道
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
   GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Enable DMA clock */
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
   /* Enable ADC1 and GPIOC clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE);
   /* DMA channel1 configuration ----------------------------------------------*/
//使能DMA
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;               //DMA通道1的地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue;             //DMA传送地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                 //传送方向
DMA_InitStructure.DMA_BufferSize = 2;                    //传送内存大小,100个16位
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                //传送内存地址递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  //ADC1转换的数据是16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;    //传送的目的地址是16位宽度
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;         //循环
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
   


//使能DMA通道1
DMA_Cmd(DMA1_Channel1, ENABLE);
  
  
//ADC配置
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1工作在独立模式
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数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 2;               //规定了顺序进行规则转换的ADC通道的数目。这个数目的取值范围是1到16
ADC_Init(ADC1, &ADC_InitStructure);

/* ADC1 regular channels configuration [规则模式通道配置]*/
//ADC1 规则通道配置
   ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);   //通道0采样时间 55.5周期
   ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 2, ADC_SampleTime_55Cycles5);   //通道8采样时间 55.5周期
//使能ADC1 DMA
ADC_DMACmd(ADC1, ENABLE);
//使能ADC1
ADC_Cmd(ADC1, ENABLE);

// 初始化ADC1校准寄存器
ADC_ResetCalibration(ADC1);
//检测ADC1校准寄存器初始化是否完成
while(ADC_GetResetCalibrationStatus(ADC1));

//开始校准ADC1
ADC_StartCalibration(ADC1);
//检测是否完成校准
while(ADC_GetCalibrationStatus(ADC1));

//ADC1转换启动
ADC_SoftwareStartConvCmd(ADC1, ENABLE);  
}
沙发
wangch_sh|  楼主 | 2014-7-18 17:07 | 只看该作者
高手支招啊!

使用特权

评论回复
板凳
mmuuss586| | 2014-7-18 18:33 | 只看该作者
http://www.amobbs.com/thread-5479408-1-1.html
你先看下这个帖子吧;
有空我再去试下,写一段程序看看;

使用特权

评论回复
地板
wangch_sh|  楼主 | 2014-7-18 19:06 | 只看该作者
谢谢,我先看看。

使用特权

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

本版积分规则

个人签名:为江山踏坏了乌骓马,为社稷拉断了宝雕弓。

318

主题

2817

帖子

5

粉丝