#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
|