打印
[STM32F7]

stm32f7 adc dma 读到的数据为0?

[复制链接]
2560|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
whyil|  楼主 | 2017-8-23 19:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "dma.h"

#include "adc.h"

DMA_HandleTypeDef   ADC1_ch5_DMA_Handler;      //DMA句柄

//初始化DMA2
//这里的传输形式是固定的,这点要根据不同的情况来修改
//DMA_Streamx:DMA数据流,DMA1_Stream0~7/DMA2_Stream0~7
//chx:DMA通道选择,[url=home.php?mod=space&uid=144993]@ref[/url] DMA_channel DMA_CHANNEL_0~DMA_CHANNEL_7
void DMA2_ADC1_Ch0_Stream0_Init(void)
{
    __HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能  
     
    //DMA配置
    ADC1_ch5_DMA_Handler.Instance=DMA2_Stream0;                            //数据流0
    ADC1_ch5_DMA_Handler.Init.Channel=DMA_CHANNEL_0;                       //通道0
    ADC1_ch5_DMA_Handler.Init.Direction=DMA_PERIPH_TO_MEMORY ;             //外设到存储器
    ADC1_ch5_DMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE;                  //外设非增量模式
    ADC1_ch5_DMA_Handler.Init.MemInc=DMA_MINC_DISABLE;                     //存储器非增量模式
    ADC1_ch5_DMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD ;    //外设数据长度:32位
    ADC1_ch5_DMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_HALFWORD ;       //存储器数据长度:32位
    ADC1_ch5_DMA_Handler.Init.Mode=DMA_CIRCULAR;                            //循环模式
    ADC1_ch5_DMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级
    ADC1_ch5_DMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              
    ADC1_ch5_DMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      
    ADC1_ch5_DMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE;                 //存储器突发单次传输
    ADC1_ch5_DMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;              //外设突发单次传输
     
    HAL_DMA_Init(&ADC1_ch5_DMA_Handler);
     
    __HAL_LINKDMA(&ADC1_Handler,DMA_Handle,ADC1_ch5_DMA_Handler);    //将DMA与ADC1联系起来(发送DMA)
     
        /*##-4- Configure the NVIC for DMA #########################################*/
        /* NVIC configuration for DMA transfer complete interrupt */
        HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0);
        HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);  
}
#include "adc.h"

#include "dma.h"

ADC_HandleTypeDef ADC1_Handler; //ADC1 句柄


uint32_t ADC1_data; //缓冲


//adc 底层配置 时钟 IO
void HAL_ADC_MspInit (ADC_HandleTypeDef * hadc){
     
        GPIO_InitTypeDef GPIO_Initure;
     
        __HAL_RCC_ADC1_CLK_ENABLE();            //开启ADC1时钟
        __HAL_RCC_GPIOA_CLK_ENABLE();           //开启GPIOA时钟
     
        GPIO_Initure.Pin = GPIO_PIN_5;  //PA5
        GPIO_Initure.Mode = GPIO_MODE_ANALOG;   //模拟输入
        GPIO_Initure.Pull = GPIO_NOPULL;    //无上下拉
        HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化GPIO
}


//adc1 初始化
void adc1_init(void){
     
    ADC_ChannelConfTypeDef ADC1_Channel;    //ADC1通道配置
     
    ADC1_Handler.Instance = ADC1;   //ADC1
     
    ADC1_Handler.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;    //4分频
    ADC1_Handler.Init.Resolution = ADC_RESOLUTION_12B;  //12位模式
    ADC1_Handler.Init.ScanConvMode = DISABLE;   //单通道模式
    ADC1_Handler.Init.EOCSelection = DISABLE;   //关闭EOC中断
    ADC1_Handler.Init.ContinuousConvMode = ENABLE;  //开启连续转换
    ADC1_Handler.Init.DMAContinuousRequests = ENABLE;   //开启DMA
    ADC1_Handler.Init.NbrOfConversion = 1;  //规则通道数
    ADC1_Handler.Init.DiscontinuousConvMode = DISABLE;  //间断模式
    ADC1_Handler.Init.NbrOfDiscConversion =  0; //注入通道数
    ADC1_Handler.Init.ExternalTrigConv = ADC_SOFTWARE_START;    //软件触发
    ADC1_Handler.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; //软件触发
     
    HAL_ADC_Init (&ADC1_Handler);   //ADC1初始化
     
    //ADC通道配置
    ADC1_Channel.Channel = ADC_CHANNEL_5;   //通道5
    ADC1_Channel.Rank = 1;  //规则通道数
    ADC1_Channel.SamplingTime = ADC_SAMPLETIME_3CYCLES; //转换时间
    ADC1_Channel.Offset = 0;    //保留

    HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_Channel); //通道配置
     
//  HAL_ADC_Start(&ADC1_Handler);//开启ADC   

    HAL_ADC_Start_DMA(&ADC1_Handler,&ADC1_data,1);  //开启DMA传输
}
#include "main.h"

#include "sys.h"
#include "delay.h"
#include "usart.h"

#include "led.h"
#include "adc.h"
#include "dma.h"

#include <string.h>

//初始化
static void init(void){
     
    Cache_Enable();     //使能CPU的L1-Cache

    HAL_Init();             //初始化HAL库

  Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz
   
    delay_init(216);                //延时初始化
     
    uart_init(115200);              //串口初始化
     
    led_init(); //初始化led
     

    DMA2_ADC1_Ch0_Stream0_Init();   //初始化dma2
     
    adc1_init();    //初始化adc1
}


int main(void)
{
    init(); //初始化
     
  while (1)
  {
        delay_ms(1000);
         
        printf("adc1 ch5:%d\r\n",ADC1_data);
         
//      ADC1_data = 0;
    }
}
/**
  ******************************************************************************
  * [url=home.php?mod=space&uid=288409]@file[/url]    Templates/Src/stm32f7xx.c
  * [url=home.php?mod=space&uid=187600]@author[/url]  MCD Application Team
  * [url=home.php?mod=space&uid=895143]@version[/url] V1.0.0
  * [url=home.php?mod=space&uid=212281]@date[/url]    22-April-2016
  * @brief   Main Interrupt Service Routines.
  *          This file provides template for all exceptions handler and
  *          peripherals interrupt service routine.
  ******************************************************************************
  * @attention
  *
  * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *   1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *   2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f7xx_it.h"

#include "adc.h"
   
/** @addtogroup STM32F7xx_HAL_Examples
  * @{
  */

/** @addtogroup Templates
  * @{
  */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/

/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/******************************************************************************/
/*            Cortex-M7 Processor Exceptions Handlers                         */
/******************************************************************************/

/**
  * @brief   This function handles NMI exception.
  * @param  None
  * @retval None
  */
void NMI_Handler(void)
{
}

/**
  * @brief  This function handles Hard Fault exception.
  * @param  None
  * @retval None
  */
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}

/**
  * @brief  This function handles Memory Manage exception.
  * @param  None
  * @retval None
  */
void MemManage_Handler(void)
{
  /* Go to infinite loop when Memory Manage exception occurs */
  while (1)
  {
  }
}

/**
  * @brief  This function handles Bus Fault exception.
  * @param  None
  * @retval None
  */
void BusFault_Handler(void)
{
  /* Go to infinite loop when Bus Fault exception occurs */
  while (1)
  {
  }
}

/**
  * @brief  This function handles Usage Fault exception.
  * @param  None
  * @retval None
  */
void UsageFault_Handler(void)
{
  /* Go to infinite loop when Usage Fault exception occurs */
  while (1)
  {
  }
}

/**
  * @brief  This function handles SVCall exception.
  * @param  None
  * @retval None
  */
void SVC_Handler(void)
{
}

/**
  * @brief  This function handles Debug Monitor exception.
  * @param  None
  * @retval None
  */
void DebugMon_Handler(void)
{
}

/**
  * @brief  This function handles PendSVC exception.
  * @param  None
  * @retval None
  */
void PendSV_Handler(void)
{
}

/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
void SysTick_Handler(void)
{
  HAL_IncTick();
}

/******************************************************************************/
/*                 STM32F7xx Peripherals Interrupt Handlers                   */
/*  Add here the Interrupt Handler for the used peripheral(s) (PPP), for the  */
/*  available peripheral interrupt handler's name please refer to the startup */
/*  file (startup_stm32f7xx.s).                                               */
/******************************************************************************/


void DMA2_Stream0_IRQHandler(void)
{
  HAL_DMA_IRQHandler(ADC1_Handler.DMA_Handle);
}


/**
  * @brief  This function handles PPP interrupt request.
  * @param  None
  * @retval None
  */
/*void PPP_IRQHandler(void)
{
}*/


/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

我的ADC1 是连续转换通道5 debug的时候adc模块在转换数据也在变化  dma2的中断也触发了,但数据一直都是0

沙发
airwill| | 2017-8-23 20:10 | 只看该作者
adc模块在转换数据在变化, 已经验证  
dma2 的中断也有了
那出错的因素不多了, 还有地址有没有错误呢

使用特权

评论回复
板凳
whyil|  楼主 | 2017-8-23 20:22 | 只看该作者
airwill 发表于 2017-8-23 20:10
adc模块在转换数据在变化, 已经验证  
dma2 的中断也有了
那出错的因素不多了, 还有地址有没有错误呢 ...

地址没错,debug的时候也看了的

使用特权

评论回复
地板
aozima| | 2017-8-24 09:35 | 只看该作者
关注下是否cache不同步造成

使用特权

评论回复
5
whyil|  楼主 | 2017-8-24 11:28 | 只看该作者
aozima 发表于 2017-8-24 09:35
关注下是否cache不同步造成

是的就是这个问题,

我把stm32f7的cache关了就好了

使用特权

评论回复
6
feelhyq| | 2017-8-24 13:08 | 只看该作者
aozima 发表于 2017-8-24 09:35
关注下是否cache不同步造成

使用特权

评论回复
7
zhuotuzi| | 2017-8-24 16:35 | 只看该作者
看到楼主解决了问题,我也学会了。

使用特权

评论回复
8
zhuotuzi| | 2017-8-24 16:36 | 只看该作者
Cache_Enable();     //使能CPU的L1-Cache

使用特权

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

本版积分规则

19

主题

49

帖子

0

粉丝