多通道ADC

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;
				}

				
				
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值