STM32F103C8T6的HAL库ADC
时间: 2025-04-25 07:32:27 浏览: 29
### STM32F103C8T6 HAL库 ADC 配置和使用教程
#### 一、初始化设置
为了使STM32F103C8T6能够通过HAL库执行ADC操作,需先完成必要的硬件资源初始化工作。这包括但不限于时钟配置、GPIO引脚设定以及中断服务程序注册等前置条件[^1]。
```c
// 初始化函数示例
static void MX_ADC_Init(void)
{
/* USER CODE BEGIN ADC_Init 0 */
/* USER CODE END ADC_Init 0 */
/** Common config
*/
hadc.Instance = ADC1;
hadc.Init.ScanConvMode = DISABLE; // 单通道模式
hadc.Init.ContinuousConvMode = ENABLE; // 连续转换模式开启
hadc.Init.DiscontinuousConvMode = DISABLE; // 关闭不连续转换模式
hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; // 软件触发启动
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 数据右对齐
hadc.Init.NbrOfConversion = 1; // 设置要转换的数量为1次
if (HAL_ADC_Init(&hadc) != HAL_OK)
{
Error_Handler();
}
}
```
#### 二、读取模拟量输入值
当完成了上述初始化过程之后,则可以调用`HAL_ADC_Start()`来开始一次新的采样周期,并借助于回调机制或者轮询方式获取最终的结果数据。
```c
uint32_t adc_value;
if(HAL_ADC_PollForConversion(&hadc, HAL_MAX_DELAY)== HAL_OK){
adc_value=HAL_ADC_GetValue(&hadc);
}
printf("The current ADC value is %lu\n",adc_value);
```
#### 三、多通道扫描与DMA传输支持
对于更复杂的应用场景而言,还可以进一步启用多路复用器来进行多个不同源端口的同时监测;与此同时配合直接存储访问(DMA),可实现高速率不间断的数据流捕捉而不占用过多CPU时间开销。
```c
/* DMA configuration for 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_HALFWORD;
hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_adc.Init.Mode = DMA_CIRCULAR;
hdma_adc.Init.Priority = DMA_PRIORITY_HIGH;
if (HAL_DMA_Init(&hdma_adc) != HAL_OK)
{
Error_Handler();
}
__HAL_LINKDMA(&hadc,DMA_Handle,&hdma_adc);
/* Enable the DMA stream */
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 1);
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
/* Start conversion with DMA transfer */
HAL_ADC_Start_DMA(&hadc,(uint32_t*)aADCTab,BUFFER_SIZE);
```
阅读全文
相关推荐

















