打印

楼主,我能不能用DMA实现这个功能

[复制链接]
1957|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jinjing999|  楼主 | 2009-4-21 15:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用双路AD同步采集,采集后的数据通过DMA传送的一个32位数组空间内,采集100次,100次后AD采样自动从从数组的开始位置存放。

是不数不能实现这个功能啊?
我怎么做不出来啊,我的数据只能采集16个,而且数据好像不是按我的要求去转换不同的通道
沙发
香水城| | 2009-4-21 15:27 | 只看该作者

需要用DMA实现这个功能

ADC触发DMA,同时设置DMA为循环模式。

使用特权

评论回复
板凳
jinjing999|  楼主 | 2009-4-21 15:35 | 只看该作者

我仿真结果可是16个数据,没有中断

 DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_RegularConvertedValueTab;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = 100;//ADC_number;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;//DMA_MemoryDataSize_HalfWord;
  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);

使用特权

评论回复
地板
香水城| | 2009-4-21 16:14 | 只看该作者

请使用芯片仿真

使用特权

评论回复
5
jinjing999|  楼主 | 2009-4-21 17:09 | 只看该作者

我用的芯片仿真结果是

这个数组里的数据
这个数据怎么是断层的,一部分有采集数据,一部分没有采集数据

使用特权

评论回复
6
jinjing999|  楼主 | 2009-4-21 17:10 | 只看该作者

看看我的配置


  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); 
  TIM_TimeBaseStructure.TIM_Period = 0xFF;          
  TIM_TimeBaseStructure.TIM_Prescaler = 0x4;       
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;    
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; 
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                
  TIM_OCInitStructure.TIM_Pulse = 0x7F; 
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;         
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);
    

  /* DMA1 Channel1 Configuration ----------------------------------------------*/
  DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_RegularConvertedValueTab;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = 580;//ADC_number;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;//DMA_MemoryDataSize_HalfWord;
  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);
  
  /* Enable DMA1 channel1 */
  DMA_Cmd(DMA1_Channel1, ENABLE);

  /* ADC1 configuration ------------------------------------------------------*/
    ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;
      ADC_InitStructure.ADC_ScanConvMode = ENABLE;
      ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //DISABLE;
      ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
      ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
      //ADC_InitStructure.ADC_NbrOfChannel = 9;//装换9个通道
    ADC_InitStructure.ADC_NbrOfChannel = 1;//装换1个通道
      ADC_Init(ADC1, &ADC_InitStructure);
    ADC_Init(ADC2, &ADC_InitStructure);
    ADC_RegularChannelConfig(ADC2, ADC_Channel_11, 1, ADC_SampleTime_1Cycles5);

      ADC_RegularChannelConfig(ADC2, ADC_Channel_10, 1, ADC_SampleTime_1Cycles5);



  ADC_DMACmd(ADC1, ENABLE);

  /* Enable ADC1 external trigger */ 
  ADC_ExternalTrigConvCmd(ADC1, ENABLE);
  ADC_ExternalTrigConvCmd(ADC2, ENABLE);

  /* Enable ADC1 */
  
    ADC_Cmd(ADC1, ENABLE);                        // 使能ADC1
    ADC_ResetCalibration(ADC1);                    // 复位ADC1的校准寄存器
    while(ADC_GetResetCalibrationStatus(ADC1));    // 等待检测校准过程完成
    ADC_StartCalibration(ADC1);                    // 开始校准各个通道
    while(ADC_GetCalibrationStatus(ADC1));        // 等待校准过程完成

    ADC_Cmd(ADC2, ENABLE); //使能ADC
    ADC_ResetCalibration(ADC2);                    // 复位ADC2的校准寄存器
    while(ADC_GetResetCalibrationStatus(ADC2));    // 等待检测校准过程完成
    ADC_StartCalibration(ADC2);                    // 开始校准各个通道
    while(ADC_GetCalibrationStatus(ADC2));        // 等待校准过程完成



  TIM_Cmd(TIM1, ENABLE);
  TIM_CtrlPWMOutputs(TIM1, ENABLE); 

使用特权

评论回复
7
jinjing999|  楼主 | 2009-4-21 17:14 | 只看该作者

郁闷坏了,整料两天了

我就纳闷,我也读取DMA的计数值了,这个采集计数是0~580
可16~63是零
然后又15个数据,这个数据转换是正确的。
然后又80~125又是零
然后15个数据,这15个数据是正确的
再往下基本都是这个规律
是那我配置错料

使用特权

评论回复
8
香水城| | 2009-4-21 17:15 | 只看该作者

前几天有人报告过,这是一个软件工具的问题

这样看数组不能正确显示,但实际上数据在内存中。

使用特权

评论回复
9
jinjing999|  楼主 | 2009-4-21 17:18 | 只看该作者

使用特权

评论回复
10
jinjing999|  楼主 | 2009-4-21 17:20 | 只看该作者

谢谢楼主

我明天用串口把数据传出来看看

如果是KEIL仿真工具的事,那就没有关系了

使用特权

评论回复
11
McuIsp| | 2009-4-21 18:46 | 只看该作者

呵呵,仿真器我是用怕了。

还是用软仿真+硬ISP下载调试来的真实。

仿真器出个问题,会折腾掉你一两天。

使用特权

评论回复
12
jinjing999|  楼主 | 2009-4-22 15:38 | 只看该作者

数据通过串口发出来了,是仿真工具的问题

使用特权

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

本版积分规则

73

主题

363

帖子

1

粉丝