HAL库配置DMA ADC 基于 STM32F103C8

  1. 双击图标,启动STM32CubeMX。我的STM32CubeMX版本是6.3.0。在开始建立工程前一定要先把STM32CubeMX安装好,如果出现错误提示请先解决错误提示。

图 1软件主页面

图 2  STM32CubeMX版本

  1. 新建工程

创建一个新的工程。

图 3新建工程步骤

图 4新建工程界面

选择开发单片机的型号,我们用的型号是STM32F103C8T6。选择好单片机型号单击图标。

等几秒中后,弹出工程配置界面。

图 5工程配置界面

  1. 工程配置

时钟配置,我们只需配置为外部高速时钟。

配置系统模式

配置ADC引脚,我们这里选择的是ADC1,IN4,IN5。

配置ADC参数。

配置参数

首先要把Number Of Conversion更改为2,因为我们只启用了两个通道。要不然无法配置扫描模式。

更之后会出现两个 Rank 分别配置为

ADC设置

图 6翻译

DMA设置

选择ADC1

配置DMA模式

开启中断

  1. 系统时钟配置

  1. 导出工程

设置工程名称、工程导出路径和IDE工具。

代码生成器配置

图 7代码生成器翻译

图 8代码生产器设置

生成代码

点击软件右上角图标,生成代码。

等待几秒钟出现提示框,点击打开工程。

打开工程后先编译一下。

打开main.c文件

修改代码

1.先定义一个数据缓存区

uint16_t dma_adc[2] = {0};

在main函数中添加如下代码

2.校准ADC

HAL_ADCEx_Calibration_Start(&hadc1);

3.开启DMA的adc模式

HAL_ADC_Start_DMA(&hadc1, (uint32_t*)dma_adc, 2);

注意:这里是一个坑见下图红色圈起来部分,非常容易踩到。

图 9代码

再次编译代码,启动调试。监视dma_adc的值

开始运行,查看watch1中已有adc的两路数据了

图 10Watch1中监视的ADC数据

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32F103C8T6 HAL库(Hardware Abstraction Layer)提供了高级接口来管理和使用ADC(Analog-to-Digital Converter)模块,用于数字化模拟信号。以下是使用HAL ADC检测电压的基本步骤: 1. **初始化ADC**: 首先,你需要在初始化STM32设备时配置ADC。这包括配置ADC的时钟、通道、序列和扫描模式。 ```c ADC_HandleTypeDef hadc1; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK2_DIV2; // 根据实际时钟配置 hadc1.Init.Resolution = ADC_RESOLUTION_12B; hadc1.Init.ScanConvMode = DISABLE; // 如果不需要连续转换,设置为DISABLE hadc1.Init.ContinuousConvMode = DISABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.NbrOfConversion = 1; // 设置为1,单次转换 hadc1.Init.DMAContinuousRequests = DISABLE; HAL_ADC_Init(&hadc1); ``` 2. **配置ADC通道**: 配置你要使用的ADC输入通道,例如ADC_CHANNEL_0代表PA0引脚(如果你的ADC通道映射是这样)。 ```c hadc1.Instance->Channel.CR1 &= ~ADC_CR1_SMP; // 关闭采样保持 hadc1.Instance->Channel.CR1 |= ADC_CR1_DIR; // 设置为输入方向 hadc1.Instance->Channel.DR = 0; // 清除可能存在的上次转换结果 ``` 3. **启动转换**: 启动ADC转换,转换完成后会触发中断或DMA操作。 ```c HAL_ADC_Start(&hadc1); ``` 4. **读取转换结果**: 使用ADC的中断服务函数或定期检查转换完成标志后,读取转换结果(DR寄存器)。 ```c uint16_t voltage = (hadc1.Instance->DR * (float)ADC_SCALE_FACTOR) / (float)ADC_REFERENCE_VOLTAGE; ``` 这里假设`ADC_SCALE_FACTOR`是将AD转换后的12位值映射到实际电压范围的系数,`ADC_REFERENCE_VOLTAGE`是ADC参考电压。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值