OpenEdv-开源电子网

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

STM32F767 ,TIM 启动AD ,DMA数据传输,AD 采进来的数据总是前面6个数据为0?

[复制链接]

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2015-9-16
在线时间
39 小时
发表于 2016-11-9 20:03:23 | 显示全部楼层 |阅读模式
1金钱

最佳答案

查看完整内容[请看2#楼]

已解决,DMA优先级不能太高,中等就可以了,代码已验证可以
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2015-9-16
在线时间
39 小时
 楼主| 发表于 2016-11-9 20:03:24 | 显示全部楼层
已解决,DMA优先级不能太高,中等就可以了,代码已验证可以
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2015-9-16
在线时间
39 小时
 楼主| 发表于 2016-11-9 20:07:35 | 显示全部楼层
本帖最后由 swallow_sw 于 2016-11-11 20:16 编辑

/*AD配置*/
void MY_ADC_Init(void)
{
          ADC_ChannelConfTypeDef ADC1_Channel_Config;
    ADC1_Handler.Instance=ADC1;
    ADC1_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4;  
    ADC1_Handler.Init.Resolution=ADC_RESOLUTION_12B;            
    ADC1_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT;            
    ADC1_Handler.Init.ScanConvMode=ENABLE;                                                                                
    ADC1_Handler.Init.EOCSelection=DISABLE;                     
    ADC1_Handler.Init.ContinuousConvMode=ENABLE;               
    ADC1_Handler.Init.NbrOfConversion=1;                        
    ADC1_Handler.Init.DiscontinuousConvMode=DISABLE;            
    ADC1_Handler.Init.NbrOfDiscConversion=0;                     
    ADC1_Handler.Init.ExternalTrigConv=ADC_EXTERNALTRIGCONV_T2_TRGO;      
    ADC1_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_RISING;
    ADC1_Handler.Init.DMAContinuousRequests=ENABLE;            
        
                HAL_ADC_DeInit(&ADC1_Handler);  
    HAL_ADC_Init(&ADC1_Handler);                                 
        
          //ADC  channel
          ADC1_Channel_Config.Channel = ADC_CHANNEL_5;
                ADC1_Channel_Config.Rank    = 1;
          ADC1_Channel_Config.SamplingTime  = ADC_TWOSAMPLINGDELAY_6CYCLES;//ADC_SAMPLETIME_3CYCLES;  //ADC_TWOSAMPLINGDELAY_5CYCLES; //
          HAL_ADC_ConfigChannel(&ADC1_Handler, &ADC1_Channel_Config);
                  
                HAL_ADC_Start(&ADC1_Handler);

}


void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
    GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_ADC1_CLK_ENABLE();         
    __HAL_RCC_GPIOA_CLK_ENABLE();                        
        
    GPIO_Initure.Pin=GPIO_PIN_5;            //PA5
    GPIO_Initure.Mode=GPIO_MODE_ANALOG;     
    GPIO_Initure.Pull=GPIO_NOPULL;         
                GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}

/*DMA配置*/
void ADC_DMA_Open(uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
{
    //DMA config        
          ADC_DMA_Config(SrcAddress,DstAddress,DataLength);        
        
         //ADC
          HAL_ADC_Start_DMA(&ADC1_Handler,&DstAddress, DataLength);
        
          //enable Timer         
         HAL_TIM_Base_Start_IT(&TIM2_Handler);
         HAL_TIM_Base_Start(&TIM2_Handler);
        
}

void ADC_DMA_Close()
{
    //Timer
          HAL_TIM_Base_Stop(&TIM2_Handler);
          HAL_TIM_Base_Stop_IT(&TIM2_Handler);
        
        //DMA
          HAL_ADC_Stop_DMA(&ADC1_Handler);

        //ADC
          HAL_ADC_Stop(&ADC1_Handler);
}

void ADC_DMA_Config(uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
{
                if((u32)DMA2_Stream0>(u32)DMA2)
        {
        __HAL_RCC_DMA2_CLK_ENABLE();
        }else
        {
        __HAL_RCC_DMA1_CLK_ENABLE();
        }
   
    __HAL_LINKDMA(&ADC1_Handler,DMA_Handle,ADC1DMA_Handler);   
   
    //Tx DMA????
    ADC1DMA_Handler.Instance      =DMA2_Stream0;                  
    ADC1DMA_Handler.Init.Channel  =DMA_CHANNEL_0;                  
    ADC1DMA_Handler.Init.Direction=DMA_PERIPH_TO_MEMORY;            
    ADC1DMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE;                 
    ADC1DMA_Handler.Init.MemInc=DMA_MINC_ENABLE;                     
    ADC1DMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_WORD;   
    ADC1DMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_WORD;      
    ADC1DMA_Handler.Init.Mode=DMA_NORMAL;                                                                              
    ADC1DMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM;               
    ADC1DMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              
    ADC1DMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;     
    ADC1DMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE;               
    ADC1DMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;            
         
    /* Configure DMA Stream source address */
    ADC1DMA_Handler.Instance->PAR  = SrcAddress;
    ADC1DMA_Handler.Instance->M0AR = DstAddress;
                ADC1DMA_Handler.Instance->NDTR = DataLength;
      
    HAL_DMA_Init(&ADC1DMA_Handler);

                HAL_DMA_Start (&ADC1DMA_Handler,SrcAddress,DstAddress,DataLength);
               
}/*TIM*/
void TIM2_Init(u16 arr,u16 psc)
{  
    TIM2_Handler.Instance=TIM2;                        
    TIM2_Handler.Init.Prescaler=psc;                     
    TIM2_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;   
    TIM2_Handler.Init.Period=arr;                        
    TIM2_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_Base_Init(&TIM2_Handler);

    HAL_TIM_Base_Start_IT(&TIM2_Handler);  
}


void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
    if(htim->Instance==TIM2)
        {
                __HAL_RCC_TIM2_CLK_ENABLE();           
                HAL_NVIC_SetPriority(TIM2_IRQn,1,3);   
                HAL_NVIC_EnableIRQ(TIM2_IRQn);            
        }  
}

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-11-9 22:17:56 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 02:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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