一、 初始化设备stm32_adc_init()

​ 进行板级初始化

image-20250213213546245

1.1定义adc_config数组

image-20250213215103492

数组中有几个值通过board.h中的宏定义来确定,同时数组中的最后一个元素后面在某些标准下是被允许加逗号的

image-20250213215514039

如果打开ADC1和ADC2,那么

1
adc_config[] ={ADC1_CONFIG,ADC3_CONFIG};

1.2 ADC1_CONFIG是什么

image-20250213215847418

1.3 ADC_HandleTypeDef是什么类型

STM32 HAL(硬件抽象层)库 中的一个结构体,用于表示 ADC(模拟到数字转换器) 外设的配置和状态

image-20250213221307498

Instance

  • 类型:ADC_TypeDef *
  • 描述:指向 ADC 模块寄存器的指针。不同的 STM32 微控制器有多个 ADC 模块(如 ADC1, ADC2, ADC3 等),Instance 用于标识当前操作的是哪个 ADC 模块。

Init

  • 类型:ADC_InitTypeDef

  • 描述

    :包含 ADC 初始化配置的结构体。它包含了多个配置选项,如 ADC 时钟、分辨率、数据对齐方式等。

    1
    ADC_InitTypeDef

    是一个结构体,通常包括以下字段:

    • ClockPrescaler:ADC 时钟的预分频器。
    • Resolution:ADC 分辨率(如 12 位、10 位、8 位)。
    • DataAlign:数据对齐方式(如左对齐或右对齐)。
    • ScanConvMode:是否启用扫描模式(多个通道转换)。
    • ContinuousConvMode:是否启用连续转换模式。
    • ExternalTrigConv:外部触发类型(如软件触发、定时器触发等)。

DMA_Handle

  • 类型:DMA_HandleTypeDef *
  • 描述:指向 DMA(直接存储器访问)句柄的指针。如果使用 DMA 进行 ADC 数据传输,这个字段指向一个 DMA_HandleTypeDef 结构,用于管理 DMA 的配置。

State

  • 类型:__IO uint32_t *
  • 描述:指向 ADC 状态的指针。这个字段通常用于存储 ADC 的当前状态,如转换进行中、转换完成等状态信息。

ErrorCode

  • 类型:__IO uint32_t
  • 描述:存储 ADC 操作过程中发生的错误代码。这可以帮助调试和排查问题,比如发生了什么错误,是否由于配置问题导致操作失败等。

1.4 启用了几个ADC就定义几个stm32_adc_obj[]元素

image-20250213223809186

1.5 ADC_Handler和adc_config是一个类型的变量

image-20250213224057191

1.6 for循环

用sizeof判断使用了几个ADC,使用了几个ADC就循环几此

1.把adc_config赋值给ADC_Hander(因为第6小点)

2.通过stm32f407xx.h判断是否有这个外设

3.Instance中存放的名字是ADCx,是ADC几就把几赋值给name_buf[3]

image-20250213222200867

1.7 HAL_ADC_Init()

1.传入ADC_HandleTypeDef类型的值,初始化ADC

2.如果返回错误,答应init failed

99e47c9c-0550-49aa-992d-62ec87fad64a

1.8 rt_hw_adc_register()

用于注册硬件 ADC 的函数,它将 ADC 驱动和硬件抽象层(HAL)关联起来,使得 RT-Thread 可以识别和使用指定的 ADC 外设

  • 初始化硬件 ADC 驱动:这个函数将硬件 ADC 外设与 RT-Thread 的设备模型进行注册,使得 RT-Thread 可以管理和访问硬件 ADC。
  • 设备注册:它会在 RT-Thread 的设备模型中创建一个 ADC 设备对象,从而让系统能够通过统一的接口(例如 read()write() 等)来操作硬件。
  • 设备抽象层支持:通过设备抽象层,用户可以通过设备操作接口(如打开设备、关闭设备、读取数据等)与硬件 ADC 进行交互。

1.9rt_adc_device 是用于表示一个 ADC 设备 的结构体

image-20250213230813789

1.10 struct rt_adc_ops

RT-Thread 中与 ADC(模拟到数字转换器) 设备交互的操作函数结构体,它包含了一组函数指针

image-20250213231324141

image-20250213231110666

二、查找ADC设备rt_device_find()

1
2
3
4
#define ADC_DEV_NAME        "adc1"  /* ADC 设备名称 */
rt_adc_device_t adc_dev; /* ADC 设备句柄 */
/* 查找设备 */
adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);

三、使能ADC通道rt_adc_enable()

image-20250218192237456

3.1 stm32_adc_enabled

rt_adc_enable()中调用了硬件驱动层函数stm32_adc_enabled()

image-20250218192444206

image-20250218143021553

  • 传入deviceenabled参数,此处的channel没用到

四、读取通道值rt_adc_read()

获取ADC通道的值,存入value变量中

image-20250218193225562

4.1 stm32_get_adc_value()

rt_adc_read()中调用了硬件驱动层函数1stm32_get_adc_value()

image-20250218193118064

image-20250218193915303

4.2 stm32_adc_get_channel()

将通道的数字转换成ADC通道的地址

image-20250218143654896

image-20250218143716406

五、 关闭ADC通道rt_adc_disable()

image-20250218194154075

5.1 stm32_adc_enabled()

rt_adc_disable()中调用了硬件驱动层函数stm32_adc_enabled()

image-20250218200837908

六、总结

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#define ADC_DEV_NAME        "adc1"  /* ADC 设备名称 */
#define ADC_DEV_CHANNEL 5 /* ADC 通道 */
rt_adc_device_t adc_dev; /* ADC 设备句柄 */
rt_uint32_t value;
/* 查找设备 */
adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
/* 使能设备 */
rt_adc_enable(adc_dev, ADC_DEV_CHANNEL);
/* 读取采样值 */
value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL);
/* 转换为对应电压值 */
vol = value * REFER_VOLTAGE / CONVERT_BITS;
rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);
/* 关闭通道 */
rt_adc_disable(adc_dev, ADC_DEV_CHANNEL);