打印
[STM32F0]

改了程序使用TIM3触发OK

[复制链接]
1448|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aw50420181750|  楼主 | 2014-12-17 12:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 aw50420181750 于 2014-12-17 15:23 编辑

你好,最近正在使用STM32F0系列的IC,使用中有如下问题需要解决
AD 转换的通道为 6通道 AD0~AD4 与Temp 和Vref,采用循环模式DMA传送到数组,之前发现DMA传说过来错位,现已解决。
要是ADC一直自动转换则DMA占带宽,目前还没测试定时器触发转换,使用的是软件触发,希望触发一次转换6个通道,然后使用DMA中断来判断转换完毕,取出数据使用。
问题:使用单次转换,CONT = 0  DISCEN = 0(触发一次自动转换6个通道)  转换结束后在DMA中断中停止ADC。先清EOS ADC1->ISR |= 1<<3;后停止ADC1->CR |= 1<<2; 停是可以停,问题是再次启动时必须从新初始化ADC配置,少了ADC_DeInit(ADC1);依然不能从新启动。
使用循环转换的结果与单次转换结果相同,都是必须从新初始化ADC配置才能从新启动。如何才能正确的使用软件起停ADC功能,如果不能使用,那就只好用TIM触发ADC自动转换了。。
沙发
aw50420181750|  楼主 | 2014-12-17 13:24 | 只看该作者
可能我上面说的不清楚,现在使用ADC连续转换DMA输出数据正常, 怎么在连续转换模式或者不连续转换模式下,用软件来控制ADC启动停止(不使用从新初始化ADC方式)。

使用特权

评论回复
板凳
airwill| | 2014-12-17 21:37 | 只看该作者
ADC_CR 里有个 ADSTP 位是干这个事情的, 你可以测试一下用法.

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
aw50420181750 + 3
地板
aw50420181750|  楼主 | 2014-12-17 23:33 | 只看该作者
airwill 发表于 2014-12-17 21:37
ADC_CR 里有个 ADSTP 位是干这个事情的, 你可以测试一下用法.

程序里设置的就是ADSTP和ADSTART 这两个位来启动停止,停止倒是能停止,但是设置ADSTART位启动的时候就启动不了,要从新初始化ADC配置。这个初始化浪费不少时间。现在我改成T3_TRGO方式触发了,触发倒是能触发了,DMA死了再仔细调调程序看看那里的问题。多谢版主回复。

使用特权

评论回复
5
aw50420181750|  楼主 | 2014-12-18 00:10 | 只看该作者
好终于调试完成了,今天收工。TIM3_TRGO触发ADC转换用DMA中断输出数据。ST的官方例程真蛋疼,根本原因在于初始化顺序错误,看了官方例程就感觉照着这条路走到死胡同。DMA一定要放在最后配置,否则要么错位,要么就传输不了数据。结贴。

使用特权

评论回复
6
Wayner| | 2015-9-27 20:29 | 只看该作者
LZ你好!我的4路ADC程序一直调不通(测出来的数据一点都不对)。能帮看看吗?

使用特权

评论回复
7
Wayner| | 2015-9-27 20:37 | 只看该作者
void ADC1_GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
       
        /* Enable ADC1 and GPIOA clock */
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);   //RCC_AHBPeriph_GPIOA
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
       
        /* Configure PA.3~0  as analog input */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
       
        GPIO_Init(GPIOA, &GPIO_InitStructure);                                //
}

/**
  * @brief  ÅäÖÃADC1µÄ¹¤×÷ģʽΪMDAģʽ
  * @param  ÎÞ
  * @retval ÎÞ
  */
static void ADC1_Mode_Config(void)
{
        ADC_InitTypeDef     ADC_InitStructure;
  DMA_InitTypeDef     DMA_InitStructure;
        //NVIC_InitTypeDef    NVIC_InitStructure;
  
  /* ADC1 DeInit */  
  ADC_DeInit(ADC1);    //¸´Î»ADC,then release
  
  /* ADC1 Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  
  /* DMA1 clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);
  
  // DMA1 Channel1 Config
  DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_ConvertedValue;  //ÄÚ´æµØÖ·(Òª´«ÊäµÄ±äÁ¿µÄÖ¸Õë)

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //DMA·½Ïò(´ÓÍâÉèµ½ÄÚ´æ)   
  DMA_InitStructure.DMA_BufferSize = 4;   //3
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //ÍâÉèµØÖ·²»×ÔÔö
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;   //ÄÚ´æµØÖ·×ÔÔö
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //ÍâÉèÊý¾Ýµ¥Î»16bit
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;   //ÄÚ´æÊý¾Ýµ¥Î» 16bit
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  //DMAģʽ:Ñ­»·Ä£Ê½ DMA_Mode_Normal;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;  //ÓÅÏȼ¶:¸ß
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;   //½ûÖ¹ÄÚ´æµ½ÄÚ´æµÄ´«Êä
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);   //ÅäÖÃDMA1µÄ1ͨµÀ(ADC)
  
  /* DMA1 Channel1 enable */
  DMA_Cmd(DMA1_Channel1, ENABLE);    //Æô¶¯DMAͨµÀ   
  
  /* Enable ADC_DMA */
  //ADC_DMACmd(ADC1, ENABLE);    //ÒƵ½Ð£×¼ºóÃæÁË
  
  /* ADC DMA request in circular mode */
  ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
  /* Initialize ADC structure */
  ADC_StructInit(&ADC_InitStructure);
  
  /* Configure the ADC1 in continous mode withe a resolutuion equal to 12 bits  */
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;

  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;     //ENABLE
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Backward;  //Upward
  ADC_Init(ADC1, &ADC_InitStructure);
  
  //ADC_SampleTime_55_5Cycles
  ADC_ChannelConfig(ADC1, ADC_Channel_3 , ADC_SampleTime_239_5Cycles);
  ADC_ChannelConfig(ADC1, ADC_Channel_2 , ADC_SampleTime_239_5Cycles);
  ADC_ChannelConfig(ADC1, ADC_Channel_1 , ADC_SampleTime_239_5Cycles);
  ADC_ChannelConfig(ADC1, ADC_Channel_0 , ADC_SampleTime_239_5Cycles);   
  
  /* ADC Calibration */
  ADC_GetCalibrationFactor(ADC1);
  
  //ADC DMA ¿ªÆôÒ»¶¨·ÅÔÚADC1У׼ºóÃ棬·ñÔòͨµÀ»á»ìÂÒÁË
  ADC_DMACmd(ADC1, ENABLE);      //ÒƵ½ÕâÀï
  /* Enable ADC1 */
  //ADC_Cmd(ADC1, ENABLE);     
  
  /* Wait the ADCEN falg */
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
  
  /* ADC1 regular Software Start Conv */
  //ADC_StartOfConversion(ADC1);
}

/**
  * @brief  ADC1³õʼ»¯
  * @param  ÎÞ
  * @retval ÎÞ
  */
void ADC1_Init(void)
{
        ADC1_GPIO_Config();
        ADC1_Mode_Config();
}

void ADC1_Init(void);
extern __IO uint16_t ADC_ConvertedValue[4];
extern FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint32_t ADC_FLAG);
extern void ADC_StartOfConversion(ADC_TypeDef* ADCx);

int main(void)
{
        uint16_t i;
        uint32_t lngX;
       
        SystemInit();
        USART1_Config();
        ADC1_Init();
        while (1)
   {               
               
                if(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN))
                    ADC_Cmd(ADC1, ENABLE);
                while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY));
                  
    ADC_StartOfConversion(ADC1);
    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADSTART));   //CONT=0,
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOSEQ));   //ADC_ISR_EOSEQ
      
    //通过串口发送4个integer数据出去
    for(i=0; i<4; i++)
        UART_send_word(ADC_ConvertedValue);     //串口程序试了正常
   
    for(lngX=0x4fffff;lngX!=0;lngX--) __nop();     //延时   
   }
}

使用特权

评论回复
8
天灵灵地灵灵| | 2015-9-28 18:18 | 只看该作者
很给力啊,果然楼主牛叉,大神啊

使用特权

评论回复
9
android2| | 2015-9-28 19:21 | 只看该作者
DMA一定要放在最后配置,否则要么错位,要么就传输不了数据,这个学习了

使用特权

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

本版积分规则

7

主题

73

帖子

2

粉丝