stm32F103,中断采集DMA.AD
时间: 2025-01-03 21:41:39 浏览: 10
### STM32F103 中断 DMA ADC 数据采集
#### 配置头文件 `adc.h`
为了实现基于中断和DMA的ADC数据采集,需要定义相应的宏以及声明全局变量。这通常在`adc.h`中完成。
```c
#ifndef __ADC_H
#define __ADC_H
#include "stm32f1xx_hal.h"
extern ADC_HandleTypeDef hadc1;
void MX_ADC1_Init(void);
uint16_t adc_value[8]; // 假设有8个通道被采样
#endif /* __ADC_H */
```
#### 初始化配置
##### ADC GPIO配置
GPIO端口需设置为模拟输入模式以便用于ADC采样。
```c
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1; // 例如PA0, PA1作为ADC输入
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
```
##### 开启ADC和DMA时钟
确保ADC模块及其关联的DMA控制器已启用其工作所需的时钟源。
```c
__HAL_RCC_ADC1_CLK_ENABLE();
__HAL_RCC_DMA1_CLK_ENABLE();
```
##### 多路ADC DMA采样配置
配置DMA以处理来自ADC的数据传输,并设定回调函数来响应DMA操作结束事件。
```c
static void MX_DMA_Init(void)
{
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;
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 1);
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
if (HAL_DMA_Init(&hdma_adc1) != HAL_OK){
Error_Handler();
}
__HAL_LINKDMA(&hadc1,DMA_Handle,hdma_adc1);
}
```
#### 软件滤波
考虑到噪声的影响,在实际应用中可能还需要加入简单的平均值或其他形式的数字滤波器来提高测量精度[^1]。
#### 主函数调用
初始化完成后可以在主循环里启动ADC转换并等待DMA传输完毕后的中断通知。
```c
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_value, 8);
while(1){
// 这里可以放置其他任务代码...
}
}
// 当DMA传输完成时会被调用
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if(hadc->Instance==ADC1){
// 可在此处添加额外逻辑或信号量控制
}
}
```
阅读全文