打印

谁配置过,双ADC慢速交替采集模式,指点下

[复制链接]
2153|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aaaxmaaa007|  楼主 | 2013-3-12 10:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ADC, DMA, DM, ST, ni
谁配置过,双ADC慢速交替采集模式,指点下
ADC_InitTypeDef ADC_InitStructure;

    ADC_DeInit(ADC1);
    ADC_DeInit(ADC2);
    DMA_DeInit(DMA1_Channel1);
    //ADC1 configuration
    ADC_InitStructure.ADC_Mode = ADC_Mode_SlowInterl;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1, &ADC_InitStructure);
    //ADC1 regular channel14 configuration
    ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_13Cycles5);

    //Enable ADC1 DMA
    ADC_DMACmd(ADC1, ENABLE);

    //ADC2 configuration
    ADC_InitStructure.ADC_Mode = ADC_Mode_SlowInterl;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 1;
    ADC_Init(ADC2, &ADC_InitStructure);

    //ADC2 regular channel14 configuration
    ADC_RegularChannelConfig(ADC2, ADC_Channel_10, 1, ADC_SampleTime_13Cycles5);

    // Enable ADC2 external trigger conversion
    ADC_ExternalTrigConvCmd(ADC2, ENABLE);

    //DMA Config
    DMA_InitTypeDef DMA_InitStructure;
    //DMA1 channel1 configuration
    DMA_DeInit(DMA1_Channel1);
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC_Adc->DR;//(uint32)ADC1_DR_Address;
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)pCap_Line_Buf;//(uint32)&adc_data0[0];
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize = ROW_LENGTH;
    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_InitStructure.DMA_Mode = DMA_Mode_Normal;//连续触发
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);
    //Enable DMA1 channel1
    DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);
    //DMA_Cmd(DMA1_Channel1, ENABLE);

    //Enable ADC1 DMA
    ADC_DMACmd(ADC1, ENABLE);

    //Enable ADC1
    ADC_Cmd(ADC1, ENABLE);
    Delay_1ms(1);

    //Enable ADC1 reset calibaration register
    ADC_ResetCalibration(ADC1);
    //Check the end of ADC1 reset calibration register
    while(ADC_GetResetCalibrationStatus(ADC1));

    //Start ADC1 calibaration
    ADC_StartCalibration(ADC1);
    //Check the end of ADC1 calibration
    while(ADC_GetCalibrationStatus(ADC1));

    //Enable ADC2
    ADC_Cmd(ADC2, ENABLE);
    Delay_1ms(1);

    //Enable ADC2 reset calibaration register
    ADC_ResetCalibration(ADC2);
    //Check the end of ADC2 reset calibration register
    while(ADC_GetResetCalibrationStatus(ADC2));

    //Start ADC2 calibaration
    ADC_StartCalibration(ADC2);
    //Check the end of ADC2 calibration
    while(ADC_GetCalibrationStatus(ADC2));

    //Start ADC1 Software Conversion
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);

这是我配置的慢速交替模式,手册上说这个模式下不能设置CONT位, 故我这样配置:ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;  但在实际的采集中,每次好像只进行了一次adc转化,手册上说28个时钟周期后启动新的ADC2,不知道我配置的好像没有自动启动。
哪位大神了解的,指点下,谢谢了!
沙发
aaaxmaaa007|  楼主 | 2013-3-12 10:56 | 只看该作者
没人知道么?

使用特权

评论回复
板凳
香水城| | 2013-3-12 11:54 | 只看该作者
ST官网上有ADC各种模式的应用文档和对应例程,LZ有参考过吗?

AN3116 ADC模式及其应用

例程项目

使用特权

评论回复
地板
aaaxmaaa007|  楼主 | 2013-3-12 13:56 | 只看该作者
香水城 发表于 2013-3-12 11:54
ST官网上有ADC各种模式的应用文档和对应例程,LZ有参考过吗?

AN3116 ADC模式及其应用

谢谢版主,我好好看下

使用特权

评论回复
5
aaaxmaaa007|  楼主 | 2013-3-12 15:13 | 只看该作者
香水城 发表于 2013-3-12 11:54
ST官网上有ADC各种模式的应用文档和对应例程,LZ有参考过吗?

AN3116 ADC模式及其应用

版主,我按着例程上的配置,
int main(void)
{
  /* System clocks configuration ---------------------------------------------*/
  RCC_Configuration();

  /* GPIO configuration ------------------------------------------------------*/
  GPIO_Configuration();

  /* DMA1 channel1 configuration ----------------------------------------------*/
  DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_DualConvertedValueTab;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = BufferLenght;
  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_InitStructure.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);

  /* Enable DMA1 Channel1: the DLA should be enabled in dual mode even if the
  DMA is not used */
  DMA_Cmd(DMA1_Channel1, ENABLE);
  
  /* ADC1 configuration ------------------------------------------------------*/
  ADC_InitStructure.ADC_Mode = ADC_Mode_SlowInterl;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfChannel = 1;
  ADC_Init(ADC1, &ADC_InitStructure);

  /* ADC1 regular channels configuration */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_1Cycles5);   

  /* ADC2 configuration ------------------------------------------------------*/
  ADC_InitStructure.ADC_Mode = ADC_Mode_SlowInterl;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfChannel = 1;
  ADC_Init(ADC2, &ADC_InitStructure);
  
  /* ADC2 regular channels configuration */
  ADC_RegularChannelConfig(ADC2, ADC_Channel_11, 1, ADC_SampleTime_1Cycles5);
  
  /* Enable ADC2 external trigger conversion */
  ADC_ExternalTrigConvCmd(ADC2, ENABLE);
  
  /* Enable ADC1 DMA: it should be enabled in dual mode even if the DMA is not used */
  ADC_DMACmd(ADC1, ENABLE);
  
  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);

  /* Enable ADC1 reset calibaration register */   
  ADC_ResetCalibration(ADC1);
  
  /* Check the end of ADC1 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC1));

  /* Start ADC1 calibaration */
  ADC_StartCalibration(ADC1);
  
  /* Check the end of ADC1 calibration */
  while(ADC_GetCalibrationStatus(ADC1));

  /* Enable ADC2 */
  ADC_Cmd(ADC2, ENABLE);

  /* Enable ADC2 reset calibaration register */   
  ADC_ResetCalibration(ADC2);
  
  /* Check the end of ADC2 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC2));

  /* Start ADC2 calibaration */
  ADC_StartCalibration(ADC2);
  
  /* Check the end of ADC2 calibration */
  while(ADC_GetCalibrationStatus(ADC2));

  /* Start ADC1 Software Conversion */
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);

  /* Test on Channel 1 DMA1_FLAG_TC flag */
  while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));
  
  /* Clear Channel 1 DMA1_FLAG_TC flag */
  DMA_ClearFlag(DMA1_FLAG_TC1);       

死在这个循环里, while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));请问下是什么情况?

使用特权

评论回复
6
aaaxmaaa007|  楼主 | 2013-3-12 15:39 | 只看该作者
补充下,我的ADC频率配置的是36Mhz的,远高于14Mhz的极限,是不是这个有影响呢,现在貌似DMA没起到作用,一直没进入DMA传输完的中断!

使用特权

评论回复
7
香水城| | 2013-3-12 16:16 | 只看该作者
aaaxmaaa007 发表于 2013-3-12 15:39
补充下,我的ADC频率配置的是36Mhz的,远高于14Mhz的极限,是不是这个有影响呢,现在貌似DMA没起到作用,一 ...

“ADC频率配置的是36MHz “,真是吓死个人哦。你都知道远高于14MHz的极限了,啥叫”极限“

使用特权

评论回复
8
aaaxmaaa007|  楼主 | 2013-3-12 16:37 | 只看该作者
香水城 发表于 2013-3-12 16:16
“ADC频率配置的是36MHz “,真是吓死个人哦。你都知道远高于14MHz的极限了,啥叫”极限“ ...

呵呵,我错了, 那我想问下您,DMA进不去中断,大概是什么原因引起的?

使用特权

评论回复
9
aaaxmaaa007|  楼主 | 2013-3-12 20:19 | 只看该作者
香水城 发表于 2013-3-12 16:16
“ADC频率配置的是36MHz “,真是吓死个人哦。你都知道远高于14MHz的极限了,啥叫”极限“ ...

香主,坐等你的指教诶

使用特权

评论回复
10
aaaxmaaa007|  楼主 | 2013-3-13 10:28 | 只看该作者
????????

使用特权

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

本版积分规则

11

主题

66

帖子

0

粉丝