OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2965|回复: 2

DMA,采集adc,多通道,数码管闪烁厉害,关了dma就正常了?

[复制链接]

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2012-9-16
在线时间
21 小时
发表于 2016-1-15 15:38:34 | 显示全部楼层 |阅读模式
1金钱
int main(void)
{               
    u16 i,t;


        delay_init();                     //延时函数初始化          
        NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        LED_Init();       
        LCD_Init();                     //LED端口初始化
        IIC_Init();  
        //TIM3_Int_Init(1249,35);//1Mhz的计数频率,计数到5000为500ms          Tout= ((arr+1)*(psc+1))/72=?us
        //TIM3_Int_Init(224,199);//1Mhz的计数频率,计数到2499为250ms          Tout= ((arr+1)*(psc+1))/72=?us
        TIM4_Int_Init(249,719);//1Mhz的计数频率,计数到5000为500ms          Tout= ((arr+1)*(psc+1))/72=?us
        GPIO_Configuration();
   // USART1_Configuration();
    Adcbydma_Init( )         ;
    USART2_Configuration();
        delay_ms(1000);
        LED1=0;
        LED2=0;
        LED3=0;
        LED4=0;

/**********测试程序******************************************/
        A_data=AT24CXX_ReadLenByte(10,1);
        A_data++;
    AT24CXX_WriteOneByte(10,A_data);                //指定地址写入一个字节  
/********************************************************/

        Data_Reset();

           while(1)
        {         
       
                delay_ms(2);

/******测试程序*****111111111111***********/
                if(++test>100)                  
                  { F_data++;test=0;
                        if(F_data>1000)F_data=0;
                  }

                 display_switch();         //显示程序 U A P L F        2015.1.5
             KEY_Scan()        ; //键盘扫描   2015.1.6
                if(times>150)
            {
                L_data=          (long)        ( cc*0.128+2.67 );
             U_data=(long)(         aa-87-70);
                A_data=         (long)         (bb*0.077+2.0);       
                times=0;
                }
                if(USART_RX_STA ==1 )
                  
        }          
}         
void Adcbydma_Init(void)
{
          GPIO_InitTypeDef GPIO_InitStructure;
          ADC_InitTypeDef ADC_InitStructure;
          DMA_InitTypeDef DMA_InitStructure;
          NVIC_InitTypeDef NVIC_InitStructure;
          TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;


          /* Configure one bit for preemption priority */
           #if defined (VECT_TAB_RAM)
          /* Set the Vector Table base location at 0x20000000 */
          NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
      #elif defined(VECT_TAB_FLASH_IAP)
          NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);
      #else  /* VECT_TAB_FLASH  */
          /* Set the Vector Table base location at 0x08000000 */                        
          NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
          #endif



          /* Configure the NVIC Preemption Priority Bits */  
          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
       
          /* Enable the RTC Interrupt */
          NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn ;                               
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
          NVIC_Init(&NVIC_InitStructure);

               
          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
               
                /* Time Base configuration */
          TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);  

                TIM_TimeBaseStructure.TIM_Prescaler = 1;        
                TIM_TimeBaseStructure.TIM_Period = 22499;           
       
                TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;     
                TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
                TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
               
                TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_Update);
                TIM_Cmd(TIM3,ENABLE);
                TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);



         /* Enable ADC1 and GPIOA clock */
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
          RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);


          /* Configure PA.01 (ADC Channel1) as analog input -------------------------*/
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
          GPIO_Init(GPIOC, &GPIO_InitStructure);


               
          /* DMA channel1 configuration ----------------------------------------------*/
          DMA_DeInit(DMA1_Channel1);
          DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
          DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCConvertedValue;
          DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
          DMA_InitStructure.DMA_BufferSize = 32*3+3;
          DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
          DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
          DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
          DMA_InitStructure.DMA_MemoryDataSize = 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);
       
          DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE); //开传输完中断
          
          /* Enable DMA channel1 */
          DMA_Cmd(DMA1_Channel1, ENABLE);
       
          RCC_ADCCLKConfig(RCC_PCLK2_Div6);
            /* ADC1 configuration ------------------------------------------------------*/
          ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
          ADC_InitStructure.ADC_ScanConvMode = ENABLE;
          ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
          ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T3_TRGO ;//ADC_ExternalTrigConv_None;
          ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
          ADC_InitStructure.ADC_NbrOfChannel = 3;
          ADC_Init(ADC1, &ADC_InitStructure);
          /* ADC1 regular channels configuration */
          ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_41Cycles5);   
          ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_41Cycles5);
           ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_41Cycles5);
          /* Enable ADC1 DMA */
          ADC_DMACmd(ADC1, ENABLE);
       
          /* Enable ADC1 */
          ADC_Cmd(ADC1, ENABLE);
          /* Enable Vrefint channel17 */
          //ADC_TempSensorVrefintCmd(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));
            /* Start ADC1 Software Conversion */
       
       
                /* Enable ADC1 EOC  interrupts */
               
               
        //        ADC_ITConfig(ADC1, ADC_IT_EOC ,ENABLE);
       
       
          ADC_SoftwareStartConvCmd(ADC1, ENABLE);
       
          /* Test on DMA1 channel1 transfer complete flag */

}

一个主程序, 一个初始化dma中断,



数码管管脚

数码管管脚

数码管接线图

数码管接线图
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-1-15 15:51:36 | 显示全部楼层
DMA+ADC的速度可能太快了,传输完成中断频繁打断主循环。
回复

使用道具 举报

1

主题

1

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2015-6-6
在线时间
7 小时
发表于 2016-1-15 16:03:14 | 显示全部楼层
可能是DMA中断中处理的数据太多,影响了其他程序执行,可以测试一下,把DMA中断中的程序注销掉只留下清除中断标志位的语句,看数码管还会不会闪烁,如果不会问题就找到了,建议数码管刷新用定时器处理,DMA数据用查询方式处理。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 18:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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