STM32 DMA ADC温度 LL库
时间: 2025-05-12 21:20:06 浏览: 17
### STM32 DMA与ADC结合实现温度测量
为了利用STM32的DMA和ADC功能来完成温度测量,可以采用LL库编写相应的初始化代码以及数据处理逻辑。以下是关于如何配置并使用这些外设的具体方法。
#### 初始化GPIO引脚
首先需要设置用于连接热敏电阻或其他传感器输入通道的GPIO引脚作为模拟输入模式[^1]。这一步骤通常涉及指定哪个端口上的具体针脚会被启用为ADC输入源:
```c
// 配置PA0为模拟输入 (假设使用的是ADC1_IN0)
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
```
#### 启动ADC模块
接着要启动ADC硬件单元,并将其绑定到特定的规则组下以便后续操作能够正常执行[^2]。这里我们还设置了采样时间以及其他必要的参数以优化性能表现:
```c
__HAL_RCC_ADC1_CLK_ENABLE();
/* Configure the ADC peripheral */
static void MX_ADC1_Init(void){
ADC_ChannelConfTypeDef sConfig = {0};
hadc1.Instance = ADC1;
/* Initialize and configure the ADC structure parameters */
hadc1.Init.OversamplingMode = DISABLE;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.ScanConvMode = ENABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DMAContinuousRequests = ENABLE;
hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;
if(HAL_ADC_Init(&hadc1)!= HAL_OK){Error_Handler();}
/** Configure Regular Channel **/
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = 1;
sConfig.SamplingTime= ADC_SAMPLETIME_3CYCLES;
if(HAL_ADC_ConfigChannel(&hadc1,&sConfig) != HAL_OK){ Error_Handler();}
}
```
#### 设置DMA传输机制
最后一步就是建立好DMA控制器之间的联系关系,从而允许它自动搬运来自ADC转换后的数值至内存缓冲区当中去[^3]。下面展示了一个简单的例子说明怎样去做这件事儿:
```c
/* Enable clock for DMA controller */
__HAL_RCC_DMA1_CLK_ENABLE();
/* Define a buffer to store conversion results */
uint16_t adcConvertedValue[NUMBER_OF_SAMPLES];
/* Create handle instance of DMA stream/channel used by ADC*/
hdma_adc1.Instance = DMA1_Stream0;
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(); }
/* Associate the initialized DMA handle to the ADC handle */
__HAL_LINKDMA(&hadc1,DMA_Handle,hdma_adc1);
/* Start continuous conversions through DMA */
if(HAL_ADC_Start_DMA(&hadc1,(uint32_t*)adcConvertedValue , NUMBER_OF_SAMPLES )!= HAL_OK ){
Error_Handler();
}
```
以上便是基于STMicroelectronics官方文档所整理出来的有关于STM32微控制单元上运用低层驱动程序接口(LL Library),借助直接存储器访问(DMA)技术配合模数转换器(Analog-to-Digital Converter,简称ADC), 来达成实时采集环境温湿度信号目的的一套完整解决方案概述[^4].
阅读全文
相关推荐


















