adc.c
/************* DMA 多通道 ADC ***********************************/
ADC_HandleTypeDef hadc_nch;
DMA_HandleTypeDef hdma_nch_adc1;
uint8_t g_adc_dma_sta = 0;
void adc_nch_dma_init( uint32_t mar )
{
__HAL_RCC_DMA2_CLK_ENABLE() ;
__HAL_RCC_ADC1_CLK_ENABLE() ;
hdma_nch_adc1.Instance=DMA2_Stream4;
hdma_nch_adc1.Init.Channel=DMA_CHANNEL_0;
hdma_nch_adc1.Init.Direction=DMA_PERIPH_TO_MEMORY;
// hdma_nch_adc1.Init.FIFOMode=
// hdma_nch_adc1.Init.FIFOThreshold=
// hdma_nch_adc1.Init.MemBurst=
hdma_nch_adc1.Init.MemDataAlignment=DMA_PDATAALIGN_HALFWORD;
hdma_nch_adc1.Init.MemInc=DMA_MINC_ENABLE;
hdma_nch_adc1.Init.Mode=DMA_NORMAL;
// hdma_nch_adc1.Init.PeriphBurst=
hdma_nch_adc1.Init.PeriphDataAlignment=DMA_MDATAALIGN_HALFWORD;
hdma_nch_adc1.Init.PeriphInc=DMA_PINC_DISABLE;
hdma_nch_adc1.Init.Priority=DMA_PRIORITY_MEDIUM;
HAL_DMA_Init(&hdma_nch_adc1);
HAL_DMA_Start (&hdma_nch_adc1, (uint32_t)&ADC1->DR, mar, 0);
hadc_nch.DMA_Handle=&hdma_nch_adc1;
hadc_nch.Instance=ADC1;
hadc_nch.Init.ClockPrescaler= ADC_CLOCK_SYNC_PCLK_DIV2;
hadc_nch.Init.ContinuousConvMode=ENABLE ;
hadc_nch.Init.DataAlign=ADC_DATAALIGN_RIGHT;
hadc_nch.Init.DiscontinuousConvMode=DISABLE;
hadc_nch.Init.DMAContinuousRequests=ENABLE;
// hadc_nch.Init.EOCSelection=
hadc_nch.Init.ExternalTrigConv= ADC_SOFTWARE_START;
hadc_nch.Init.ExternalTrigConvEdge= ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc_nch.Init.NbrOfConversion=6;
hadc_nch.Init.NbrOfDiscConversion=0;
hadc_nch.Init.Resolution=ADC_RESOLUTION_12B;
hadc_nch.Init.ScanConvMode=ENABLE;
HAL_ADC_Init(&hadc_nch);
adc_nch_gpio_init( );
adc_nch_set(&hadc_nch, ADC_CHANNEL_0 ,1,ADC_SAMPLETIME_480CYCLES );
adc_nch_set(&hadc_nch, ADC_CHANNEL_1 ,2,ADC_SAMPLETIME_480CYCLES );
adc_nch_set(&hadc_nch, ADC_CHANNEL_2 ,3,ADC_SAMPLETIME_480CYCLES );
adc_nch_set(&hadc_nch, ADC_CHANNEL_3 ,4,ADC_SAMPLETIME_480CYCLES );
adc_nch_set(&hadc_nch, ADC_CHANNEL_4 ,5,ADC_SAMPLETIME_480CYCLES );
adc_nch_set(&hadc_nch, ADC_CHANNEL_5 ,6,ADC_SAMPLETIME_480CYCLES );
HAL_NVIC_SetPriority( DMA2_Stream4_IRQn , 3, 3);
HAL_NVIC_EnableIRQ(DMA2_Stream4_IRQn);
HAL_ADC_Start_DMA(&hadc_nch, &mar, 2);// 单个数据长度为2字节
__HAL_DMA_ENABLE_IT(&hdma_nch_adc1, DMA_IT_TC) ;
}
void adc_nch_gpio_init( void )
{
GPIO_InitTypeDef GPIO_Init;
__HAL_RCC_GPIOA_CLK_ENABLE() ;
GPIO_Init.Pin=GPIO_PIN_5|GPIO_PIN_4|GPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_1|GPIO_PIN_0;
GPIO_Init.Mode=GPIO_MODE_ANALOG;
GPIO_Init.Pull=GPIO_NOPULL;
GPIO_Init.Speed=GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_Init);//PA5
}
void adc_nch_set(ADC_HandleTypeDef* hadc, uint32_t ch ,uint32_t rank,uint32_t stime )
{
ADC_ChannelConfTypeDef sConfig;
sConfig.Channel=ch;
sConfig.Rank=rank;
sConfig.SamplingTime= stime;
HAL_ADC_ConfigChannel(hadc, &sConfig);
}
void adc_nch_dma_enable( uint16_t ndtr)
{
__HAL_ADC_DISABLE(&hadc_nch);
__HAL_DMA_DISABLE(&hdma_nch_adc1);
hdma_nch_adc1.Instance->NDTR=ndtr;
__HAL_DMA_ENABLE(&hdma_nch_adc1) ;
__HAL_ADC_ENABLE(&hadc_nch);
hadc_nch.Instance->CR2|=1<<30;
}
#define ADC_ADCX_DMASx_IS_TC() ( DMA2->HISR & (1 << 5) )
#define ADC_ADCX_DMASx_CLR_TC() do{ DMA2->HIFCR |= 1 << 5; }while(0)
void DMA2_Stream4_IRQHandler()
{
// DMA_FLAG_TCIF0_4;
// if(ADC_ADCX_DMASx_IS_TC() )
// {
// g_adc_dma_sta = 1;
// ADC_ADCX_DMASx_CLR_TC();
// }
if(__HAL_DMA_GET_FLAG(&hdma_nch_adc1, DMA_FLAG_TCIF0_4) )
{
g_adc_dma_sta = 1;
__HAL_DMA_CLEAR_FLAG(&hdma_nch_adc1, DMA_FLAG_TCIF0_4);
}
}
main.c
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/BEEP/beep.h"
#include "./BSP/KEY/key.h"
#include "usart.h"
#include "adc1.h"
uint16_t dma_buf[50*6];
int main(void)
{
uint8_t key,i=0,z=0;
uint8_t app_re_len_old=0;
uint32_t adc_data=0;
HAL_Init(); /* 初始化HAL库 */
sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */
delay_init(168); /* 延时初始化 */
led_init(); /* 初始化LED */
beep_init(); /* 初始化蜂鸣器 */
key_init(); /* 初始化按键 */
LED0(0); /* 先点亮红灯 */
usart_init(115200);
// adc_init();
adc_nch_dma_init( (uint32_t) &dma_buf);
printf("123");
while(1)
{
key = key_scan(0); /* 得到键值 */
delay_ms(10);
if(z++>=100)
{
if(g_adc_dma_sta==1)
{
uint32_t i=0,j=0,sum=0,adc;
g_adc_dma_sta=0;
for(j=0;j<6;j++)
{
sum=0;
for(i=0;i<50;i++)
{
sum+=dma_buf[ 6*i+j];
}
adc=sum/50;
printf("adc%d ; %d \r\n",j,adc);
}
}
adc_nch_dma_enable( 50*6);
z=0;
}
}
}