STM32G474VET6 stm32cubemx ADC配置笔记

参考教材

https://blog.csdn.net/qq153471503/article/details/108123019
里面有轮询的代码

cube配置

image.png
image.png
image.png
image.png
使用DMA还要设置
image.png

相关代码

ADC-DMA方式

HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);//ADC1的精度校准函数
//主函数主循环前要先校准

HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC1_DMA_buff,8);
fval_adc1[0] = (float)(ADC1_DMA_buff[0])*3.3f/4096.0f;//ADC1的多通道数据转化
fval_adc1[1] = (float)(ADC1_DMA_buff[1])*3.3f/4096.0f;
fval_adc1[2] = (float)(ADC1_DMA_buff[2])*3.3f/4096.0f;
fval_adc1[3] = (float)(ADC1_DMA_buff[3])*3.3f/4096.0f;
fval_adc1[4] = (float)(ADC1_DMA_buff[4])*3.3f/4096.0f;
fval_adc1[5] = (float)(ADC1_DMA_buff[5])*3.3f/4096.0f;
fval_adc1[6] = (float)(ADC1_DMA_buff[6])*3.3f/4096.0f;
fval_adc1[7] = (float)(ADC1_DMA_buff[7])*3.3f/4096.0f;

len=sprintf(str,"adc1 = PA0:%4.2f, PA1:%4.2f, PA3:%4.2f, PB14:%4.2f, PC0:%4.2f, PC1:%4.2f, PC2:%4.2f, PC3:%4.2f\r\n",fval_adc1[0],fval_adc1[1],fval_adc1[2],fval_adc1[3],fval_adc1[4],fval_adc1[5],fval_adc1[6],fval_adc1[7]);
HAL_UART_Transmit_DMA(&huart1, (uint8_t*)str, len);//多个DMA发送时,由于每个DMA发送搬运数据很快,若使用同一个数组存发送数据,就会出现还没发送完,下一个发送数据把正在发送的数据覆盖  要么延时 要么多个DMA发送分开数据存储

轮询方式

uint8_t read_adc_PD10(float *data){
  // float ADC3_Value[2] ;
  // uint16_t buf_out;
  // for(int i=0 ; i<2 ; i++ )
	// 	{
	// 		buf_out = ADC_Read_adc3(ADC_CHANNEL_1);//ADC1的多个通道采集函数,需循环读取函数
  //     ADC3_Value[i] = (float)buf_out *3.3f/4096.0f;
	// 	}
  //   *data = ADC3_Value[0];
	float _fbuf[2];
  HAL_ADC_Start_DMA(&hadc3,(uint32_t *)_ADC3_DMA_buff,2);
  _fbuf[0] = (float)(_ADC3_DMA_buff[0])*3.3f/4096.0f;//ADC3的多通道数据转化 AD3-7
  _fbuf[1] = (float)(_ADC3_DMA_buff[1])*3.3f/4096.0f;
  *data = _fbuf[0];
  return 0 ;
}

ADC中断产生采集完成标志

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
	if(hadc == &hadc1)
	{
		adc1_flg=1;
	}
	if(hadc == &hadc2)
	{
		adc2_flg=1;
	}
	if(hadc == &hadc3)
	{
		adc3_flg=1;
	}
	if(hadc == &hadc4)
	{
		adc4_flg=1;
	}
	if(hadc == &hadc5)
	{
		adc5_flg=1;
	}

}

ADC-UART普通发送方式看UART篇

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是基于STM32CubeIDE的STM32G474VET6 ADC DMA实现代码示例。在这个示例中,我们将使用ADC1来采集模拟信号,使用DMA2来传输数据到内存空间。 首先,我们需要在CubeMX配置ADC和DMA。在ADC配置中,我们选择使用单通道模式,使用ADC1通道5,同时开启DMA传输。在DMA配置中,我们选择使用DMA2,将数据传输到内存空间,传输大小设置为1个16位字。 接下来,我们需要在main.c文件中编写代码,启用ADC和DMA,并开始采样和传输数据。以下是示例代码: ```c #include "main.h" #include "stm32g4xx_hal.h" ADC_HandleTypeDef hadc1; DMA_HandleTypeDef hdma_adc1; uint16_t adcValue[1]; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_DMA_Init(void); static void MX_ADC1_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_DMA_Init(); MX_ADC1_Init(); // 启动DMA传输 HAL_DMA_Start(&hdma_adc1, (uint32_t)&ADC1->DR, (uint32_t)&adcValue, 1); // 启动ADC HAL_ADC_Start_DMA(&hadc1, (uint32_t)&adcValue, 1); while (1) { // 采样和传输数据 HAL_Delay(10); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) { Error_Handler(); } } static void MX_ADC1_Init(void) { ADC_ChannelConfTypeDef sConfig = {0}; hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; hadc1.Init.Resolution = ADC_RESOLUTION_12B; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; hadc1.Init.LowPowerAutoWait = DISABLE; hadc1.Init.ContinuousConvMode = DISABLE; hadc1.Init.NbrOfConversion = 1; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc1.Init.DMAContinuousRequests = ENABLE; hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; hadc1.Init.OversamplingMode = DISABLE; if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); } sConfig.Channel = ADC_CHANNEL_5; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; sConfig.SingleDiff = ADC_SINGLE_ENDED; sConfig.OffsetNumber = ADC_OFFSET_NONE; sConfig.Offset = 0; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } } static void MX_DMA_Init(void) { /* DMA controller clock enable */ __HAL_RCC_DMA2_CLK_ENABLE(); /* DMA interrupt init */ /* DMA2_Channel1_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA2_Channel1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA2_Channel1_IRQn); /* DMA2_Channel1 init */ hdma_adc1.Instance = DMA2_Channel1; hdma_adc1.Init.Request = DMA_REQUEST_ADC1; hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE; hdma_adc1.Init.MemInc = DMA_MINC_ENABLE; hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_adc1.Init.Mode = DMA_CIRCULAR; hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH; if (HAL_DMA_Init(&hdma_adc1) != HAL_OK) { Error_Handler(); } __HAL_LINKDMA(&hadc1,DMA_Handle,hdma_adc1); } void Error_Handler(void) { while(1) { } } ``` 在以上代码中,我们使用了`HAL_ADC_Start_DMA()`函数来启动ADC和DMA传输。在主循环中,我们使用了`HAL_Delay()`函数来等待一段时间以便采样和传输数据。 当DMA传输完成后,我们可以在`adcValue`数组中找到传输的数据。注意,这里我们只传输了一个16位字,因此`adcValue`数组中只有一个元素。如果需要传输多个16位字,则需要相应地修改DMA传输大小和`adcValue`数组的大小。 希望这个示例代码能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值