STM32CubeMX配置STM32G031多通道ADC采集(HAL库开发)

该文描述了一个STM32微控制器的配置过程,包括将HSI主频设置为64MHz,启用8个ADC通道进行连续转换,以及配置串口进行异步通信和重定向。代码示例中展示了如何获取ADC通道的平均值并使用串口输出结果。
摘要由CSDN通过智能技术生成

时钟配置HSI主频配置64M

 勾选打开8个通道的ADC

 使能连续转换模式

 配置好串口,选择异步模式配置好需要的开发环境并获取代码

 修改main.c

串口重定向

#include "stdio.h"
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
  return ch;
}

 串口重定向一定要勾选Use Micro LIB

 获取ADC通道值

uint32_t ADC_Get_Average(uint8_t ch)
{
	ADC_ChannelConfTypeDef sConfig;
	uint32_t value_sum=0;	
	switch(ch)							
	{
		case 0:sConfig.Channel = ADC_CHANNEL_0;break;	
		case 1:sConfig.Channel = ADC_CHANNEL_1;break;
		case 2:sConfig.Channel = ADC_CHANNEL_2;break;
		case 3:sConfig.Channel = ADC_CHANNEL_3;break;
		case 4:sConfig.Channel = ADC_CHANNEL_4;break;
		case 5:sConfig.Channel = ADC_CHANNEL_5;break;
        case 6:sConfig.Channel = ADC_CHANNEL_6;break;
        case 7:sConfig.Channel = ADC_CHANNEL_7;break;
	}
    
	sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;		
	sConfig.Rank = ADC_REGULAR_RANK_1;
	HAL_ADC_ConfigChannel(&hadc1,&sConfig);											

    HAL_ADC_Start(&hadc1);								
    HAL_ADC_PollForConversion(&hadc1,30);				
    value_sum = HAL_ADC_GetValue(&hadc1);								
    HAL_ADC_Stop(&hadc1);								

	return value_sum;									
}

主函数 

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_ADC1_Init();
    MX_USART1_UART_Init();


    uint16_t i = 0;
    uint16_t Adc_Val = 0;
    static uint16_t count = 0;
    
    while (1)
    {
        count++;
        if(count % 100000 == 0)
        {
            for(i = 0; i < 8; i++)
            {
                Adc_Val  = ADC_Get_Average(i);
                printf("CHANNEL%d = %04d, %f V\r\n", i, Adc_Val, (double)Adc_Val / 4095 * 3.3); 
            }
            printf("\r\n\r\n\r\n\r\n\r\n"); 
        }
    }
}

 串口输出

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下为STM32G031 HAL库 ADC多通道DMA方式的示例代码: ```c /* 初始化 ADC */ ADC_HandleTypeDef hadc; hadc.Instance = ADC1; hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hadc.Init.Resolution = ADC_RESOLUTION_12B; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.ScanConvMode = ADC_SCAN_ENABLE; hadc.Init.EOCSelection = ADC_EOC_SEQ_CONV; hadc.Init.LowPowerAutoWait = DISABLE; hadc.Init.ContinuousConvMode = ENABLE; hadc.Init.NbrOfConversion = 2; hadc.Init.DiscontinuousConvMode = DISABLE; hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; if (HAL_ADC_Init(&hadc) != HAL_OK) { Error_Handler(); } /* 配置ADC通道 */ ADC_ChannelConfTypeDef sConfig; sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = ADC_RANK_CHANNEL_NUMBER; sConfig.SamplingTime = ADC_SAMPLETIME_640CYCLES_5; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { Error_Handler(); } sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = ADC_RANK_CHANNEL_NUMBER; sConfig.SamplingTime = ADC_SAMPLETIME_640CYCLES_5; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { Error_Handler(); } /* 初始化DMA */ DMA_HandleTypeDef hdma_adc; hdma_adc.Instance = DMA1_Channel1; hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE; hdma_adc.Init.MemInc = DMA_MINC_ENABLE; hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; hdma_adc.Init.Mode = DMA_CIRCULAR; hdma_adc.Init.Priority = DMA_PRIORITY_LOW; if (HAL_DMA_Init(&hdma_adc) != HAL_OK) { Error_Handler(); } /* 配置DMA通道 */ __HAL_LINKDMA(&hadc, DMA_Handle, hdma_adc); HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); /* 启动ADC */ HAL_ADC_Start_DMA(&hadc, (uint32_t *)adc_values, 2); ``` 其中,`ADC1`代表ADC模块的实例;`ADC_CHANNEL_0`和`ADC_CHANNEL_1`代表需要使用的ADC通道;`DMA1_Channel1`代表DMA通道的实例;`adc_values`是一个长度为2的数组,用于存储ADC转换结果。启动ADC转换时,使用`HAL_ADC_Start_DMA`函数,将DMA传输的目的地址设为`adc_values`数组的首地址。当ADC转换完成时,DMA会将转换结果存储到`adc_values`数组中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值