STM32CubeMX配置(CH3-CH4)

  • ADC配置
    在这里插入图片描述
  • DMA配置
    在这里插入图片描述

添加代码

  • 存放ADC输出的数组
uint16_t ADC_ConvertedValue[2]={0,0};
  • ADC开始转换
void ADC_DMA_Config_Start(void)
{
	LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_HIGH);
	LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_1,(uint32_t)ADC_ConvertedValue);
	LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_1,LL_ADC_DMA_GetRegAddr(ADC1,LL_ADC_DMA_REG_REGULAR_DATA));
	LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_1, 2);
	LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1);
	
	LL_ADC_Enable(ADC1);
	LL_ADC_StartCalibration(ADC1);
	while(LL_ADC_IsCalibrationOnGoing(ADC1));
	
	LL_ADC_REG_StartConversionSWStart(ADC1);
	LL_ADC_REG_SetDMATransfer(ADC1, LL_ADC_REG_DMA_TRANSFER_UNLIMITED);
}
  • 主函数
    (串口自己配置)
/* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  printf("STM32CubeMX Test...\r\n");
  ADC_DMA_Config_Start();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		printf("ADC->CH1 Value:%lf\r\n",(float)ADC_ConvertedValue[0]*3.3/4095);
		printf("ADC->CH2 Value:%lf\r\n",(float)ADC_ConvertedValue[1]*3.3/4095);
		LL_mDelay(500);
  }

标准库

void adc(void)
{
	ADC_InitTypeDef ADC_InitStructure; 
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_ADC1,ENABLE );	  //使能ADC1通道时钟
	
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;		//模拟输入引脚
	GPIO_Init(GPIOB, &GPIO_InitStructure);	

	ADC_DeInit(ADC1);  //复位ADC1 
	
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	//ADC工作模式:ADC1和ADC2工作在独立模式
	ADC_InitStructure.ADC_ScanConvMode = ENABLE;	//模数转换工作在单通道模式
	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;	//模数转换工作在单次转换模式
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	//转换由软件而不是外部触发启动
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	//ADC数据右对齐
	ADC_InitStructure.ADC_NbrOfChannel = 2;	//顺序进行规则转换的ADC通道的数目
	ADC_Init(ADC1, &ADC_InitStructure);	//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   

	ADC_RegularChannelConfig(ADC1,ADC_Channel_8,1,ADC_SampleTime_239Cycles5);//通道一转换结果保存到ADCConvertedValue[0~10][0]
	ADC_RegularChannelConfig(ADC1,ADC_Channel_9,2,ADC_SampleTime_239Cycles5);//通道二转换结果保存到ADCConvertedValue[0~10][1]

	ADC_DMACmd(ADC1, ENABLE);
	ADC_Cmd(ADC1, ENABLE);	//使能指定的ADC1
	
	ADC_ResetCalibration(ADC1);	//使能复位校准  
	while(ADC_GetResetCalibrationStatus(ADC1));	//等待复位校准结束
	ADC_StartCalibration(ADC1);	 //开启AD校准
	while(ADC_GetCalibrationStatus(ADC1));	 //等待校准结束
}

void dma(void)
{ 	
	DMA_InitTypeDef DMA_InitTypeStruct;
	
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

	DMA_DeInit(DMA1_Channel1);    //将通道一寄存器设为默认值
	DMA_InitTypeStruct.DMA_DIR=DMA_DIR_PeripheralSRC;//ADC寄存器到数据
	DMA_InitTypeStruct.DMA_BufferSize=2;
	DMA_InitTypeStruct.DMA_M2M=DMA_M2M_Disable;
	DMA_InitTypeStruct.DMA_MemoryBaseAddr=(uint32_t)&ADCConvertedValue;
	DMA_InitTypeStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;
	DMA_InitTypeStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;
	DMA_InitTypeStruct.DMA_Mode=DMA_Mode_Circular;
	DMA_InitTypeStruct.DMA_PeripheralBaseAddr=(uint32_t)&(ADC1->DR);//0x4001244C;
	DMA_InitTypeStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;
	DMA_InitTypeStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
	DMA_InitTypeStruct.DMA_Priority=DMA_Priority_Medium;
	DMA_Init(DMA1_Channel1, &DMA_InitTypeStruct);
	DMA_Cmd(DMA1_Channel1, ENABLE);
}				   

void ADC_Config(void)
{
	dma();
	adc();
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		//使能指定的ADC1的软件转换启动功能	
}
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐