[mw_shl_code=c,true]#include "stm324x9i_evhal_adsample.h"
#include "stm32f439xx.h"
#include "stm32f4xx_hal_rcc.h"
#include "stm32f4xx_hal_gpio.h"
#include "stm32f4xx_hal_dma.h"
#include "stm32f4xx_hal_cortex.h"
/* Constant definitions */
#define NUM 11 // Number of ADC channels;
#define coef_a 0.5 // Useful coefficient for adFilter;
/* Initiliazes */
int pre_value = 0;
/* ADC handler declaration */
ADC_HandleTypeDef AdcHandle;
DMA_HandleTypeDef dma;
/* Defines varibles of channel configure */
ADC_ChannelConfTypeDef sConfig;
/* Fuctions for Initializing and configuring*/
HAL_StatusTypeDef GpioInit();
HAL_StatusTypeDef DmaInit();
HAL_StatusTypeDef AdcInit();
HAL_StatusTypeDef ChannelConfigure();
/* CallBack Fuction */
void transCompleteCallback(DMA_HandleTypeDef *hdma);
/* function prototypes */
uint16_t adFliter(uint16_t newValue);
uint16_t GetRealValue(adSamChan *asc);
/* Arrays used to get converted values */
static uint16_t adValue[NUM]; // Array to load values of adsample
static uint16_t fliterValue[NUM]; // Array to load values of fliter
//static uint16_t realValue[NUM]; // Array to load real value of each
/* AdSample Initializing */
HAL_StatusTypeDef AdSamInit()
{
/* RCC clock enable */
__HAL_RCC_DMA2_CLK_ENABLE(); // Enable DMA_2 Clock
__HAL_RCC_ADC1_CLK_ENABLE(); // Enable ADC1 Clock
/* Initializes Gpio */
GpioInit();
__HAL_DMA_DISABLE(&dma);
/* Initializes DMA */
DmaInit();
/*Configure NVIC for DMA transfer complete interrupts */
HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);
__HAL_DMA_ENABLE_IT(&dma,DMA_IT_TC);
__HAL_DMA_ENABLE(&dma);
/* Initializes ADC */
AdcInit();
/* Configures ADC Channels */
ChannelConfigure();
/*Enable ADC's DMA mode*/
AdcHandle.Instance->CR2 |= ADC_CR2_DMA;
/*Enable conversion*/
HAL_ADC_Start(&AdcHandle);
return HAL_OK;
}
HAL_StatusTypeDef GpioInit()
{
/*Configures GPIO*/
GPIO_InitTypeDef gpio;
gpio.Mode = GPIO_MODE_ANALOG; // Configures analog output
gpio.Speed = GPIO_SPEED_MEDIUM; // Configures GPIO speed
/*Configures GPIOA*/
__HAL_RCC_GPIOA_CLK_ENABLE(); // Enable GPIOB Clock
gpio.Pin = GPIO_PIN_0; // Configures ADC1_channel_0;
HAL_GPIO_Init(GPIOA,&gpio); // Initializes GPIOA
/*Configures GPIOB*/
__HAL_RCC_GPIOB_CLK_ENABLE(); // Enable GPIOB Clock
gpio.Pin = GPIO_PIN_0|GPIO_PIN_1; // Configure ADC1_channel_8,channel_9;
HAL_GPIO_Init(GPIOB,&gpio); // Initializes GPIOB
/*Configures GPIOC*/
__HAL_RCC_GPIOC_CLK_ENABLE(); // Enable GPIOC Clock
gpio.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5; // Configures ADC1 from channel_10 to channel_15
HAL_GPIO_Init(GPIOC,&gpio); // Initializes GPIOC
return HAL_OK;
}
HAL_StatusTypeDef DmaInit()
{
HAL_DMA_DeInit(&dma);
dma.Init.Channel = DMA_CHANNEL_0; // Select DMA channel_0
dma.Init.Direction = DMA_PERIPH_TO_MEMORY; // Select the direction of transmission
dma.Init.PeriphInc = DMA_PINC_DISABLE; // Keeping Periph data_address after each transmission
dma.Init.MemInc = DMA_MINC_ENABLE; // Retreating Memory data_address after each transmission
dma.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; // Set MemoryData HALFWPRD
dma.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; // Set PeriphData HALFWORD
dma.Init.Mode = DMA_CIRCULAR ; // Set conversion mode
dma.Init.Priority = DMA_PRIORITY_HIGH; // Set DMA Priority
dma.Instance = DMA2_Stream0; // Set base_address DM2_STream0
dma.Instance->NDTR = 11; // Set the number of datas transfered
dma.Instance->CR &= (uint32_t)(~DMA_SxCR_DBM); // clear DBM bit
dma.Instance->  AR = (uint32_t)&(ADC1->DR); // Set source address
dma.Instance->M0AR = (uint32_t)&adValue; // Set target address
dma.XferCpltCallback = transCompleteCallback;
HAL_DMA_Init(&dma); // Initializes DMA
return HAL_OK;
}
HAL_StatusTypeDef AdcInit()
{
HAL_ADC_DeInit(&AdcHandle);
AdcHandle.Instance= ADC1;
AdcHandle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV2; // Configures ADC ClockPrescaler
AdcHandle.Init.Resolution = ADC_RESOLUTION_12B; // Configures ADC Resolution
AdcHandle.Init.ScanConvMode = ENABLE; // Enable scan mode
AdcHandle.Init.ContinuousConvMode = ENABLE; // Enable ContinuousConvMode
AdcHandle.Init.DiscontinuousConvMode = DISABLE;
AdcHandle.Init.NbrOfDiscConversion = 0;
// AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
// AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1;
AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT; // Data justified right
AdcHandle.Init.NbrOfConversion = NUM; // Configure number of conversion
AdcHandle.Init.DMAContinuousRequests = ENABLE; // Enable DMA continuous requests
AdcHandle.Init.EOCSelection = DISABLE;
HAL_ADC_Init(&AdcHandle);
return HAL_OK;
}
HAL_StatusTypeDef ChannelConfigure()
{
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
sConfig.Offset = 0;
sConfig.Rank = 1;
sConfig.Channel =ADC_CHANNEL_0;
HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
sConfig.Rank = 2;
sConfig.Channel =ADC_CHANNEL_8;
HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
sConfig.Rank = 3;
sConfig.Channel =ADC_CHANNEL_9;
HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
sConfig.Rank = 4;
sConfig.Channel =ADC_CHANNEL_10;
HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
sConfig.Rank = 5;
sConfig.Channel =ADC_CHANNEL_11;
HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
sConfig.Rank = 6;
sConfig.Channel =ADC_CHANNEL_12;
HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
sConfig.Rank = 7;
sConfig.Channel =ADC_CHANNEL_13;
HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
sConfig.Rank = 8;
sConfig.Channel =ADC_CHANNEL_14;
HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
sConfig.Rank = 9;
sConfig.Channel =ADC_CHANNEL_15;
HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
/*Channel for temperture*/
sConfig.Rank = 10;
sConfig.Channel =ADC_CHANNEL_16;
HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
/*Channel for Vreinf*/
sConfig.Rank = 11;
sConfig.Channel =ADC_CHANNEL_17;
HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
return HAL_OK;
}
void transCompleteCallback(DMA_HandleTypeDef *hdma) // CallBack fuction of transfer complete
{
// AdcHandle.Instance->CR2 &= ~ADC_CR2_SWSTART;
for(int i =0;i <11;i++)
{
fliterValue = adValue;
fliterValue = adFliter(fliterValue);
}
}[/mw_shl_code]
上面的 F439的一段ADC+DMA 采样的程序,在DMA传输完成中断中,进行数据处理,现在是DMA只会进入一次中断,在中段函数内设置断点,一直下一步,跳出后无法再进入中断函数,因为DMA是循环模式,理论上传输中断函数是一直能够进入的,昨天调试的时候还好好的,不知道误动了哪些地方之后,请问代码中有哪些地方出错了吗?谢谢各位大哥,小弟感激不尽
|