stm32f103rct6adc采集电压hal
时间: 2025-01-15 16:16:27 AIGC 浏览: 56
### 使用 STM32F103RCT6 和 HAL 庢实现 ADC 电压采集
#### 定义全局变量
为了存储ADC采样结果以及配置参数,需定义一些必要的全局变量。这些变量用于保存ADC句柄、DMA传输状态以及其他可能需要的数据结构。
```c
/* 用户自定义全局变量 */
uint16_t adcValue;
ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma_adc1;
```
#### 初始化 ADC 句柄
初始化过程中设置ADC的工作模式和其他重要属性,如分辨率、扫描方向等。这部分工作可以通过CubeMX工具自动完成大部分配置[^1]。
```c
static void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
/** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
*/
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = DISABLE; // 单通道模式
hadc1.Init.ContinuousConvMode = ENABLE; // 连续转换模式开启
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
/** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
*/
sConfig.Channel = ADC_CHANNEL_1; // PA1 对应的通道号
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_55CYCLES_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
}
```
#### 启动 DMA 并关联至 ADC
为了让DMA负责搬运数据而不是CPU中断处理每次转换结束事件,这里设置了DMA来接收来自ADC的结果并将其存放到指定缓冲区中。这一步骤同样可以在CubeMX图形界面下轻松配置好相应的DMA流和请求映射关系。
```c
static void MX_DMA_Init(void)
{
/* Init DMAs low Level Drivers */
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
hdma_adc1.Instance = DMA1_Channel1;
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 HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* AdcHandle){
// 当DMA半满时可在此回调函数内做相应处理
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle){
// 当DMA完全填充完毕后执行此回调函数内的逻辑
}
```
#### 开始 ADC 转换过程
一旦上述准备工作完成后就可以启动实际的AD转换流程了。通过`HAL_ADC_Start_DMA()`函数指明要使用的ADC实例对象以及目标内存地址还有长度信息即可让硬件开始运作起来。
```c
if(HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&adcValue,1)!= HAL_OK){
Error_Handler();
}
```
#### 主循环读取与处理数据
最后,在主程序里不断轮询获取最新的ADC值,并根据需求进一步加工成所需的物理量表示形式,例如将原始计数值转化为对应的实际输入电压电平[^5]。
```c
while (1)
{
float voltage = ((float)adcValue * 3.3f)/4096.0f;
// 执行其他任务...
}
```
阅读全文
相关推荐




















