SDADC示例
源码路径:example/rt_device/adc/sdadc
概述
在 RT-Thread 操作系统下,SDADC 外设被虚拟成一个
rt_device,通过标准 RT ADC 框架 (rt_device_find+rt_adc_enable+rt_adc_read)访问"sdadc"设备,实现电压采集。本例程演示 多通道扫描 + 定时器触发 + 中断通知(事件驱动) 的完整链路: GPTIM3 周期性触发一轮扫描 → 硬件把各通道结果分别刷新到对应输出寄存器 → 转换完成中断触发 → 驱动回调
rx_indicate唤醒应用 → 应用逐通道读取最新电压。
支持的平台
例程可以运行在以下开发板。
sf32lb58 HDK
注意:SDADC IP 仅在 SF32LB55X 与 SF32LB58X 芯片上可用,该例程基于58调试。
SDADC 驱动支持的采集模式
SDADC 驱动支持两个相互正交的维度,通过 Kconfig 组合使用:
维度 |
选项 |
说明 |
|---|---|---|
通道数量 |
|
关:单通道;开:多通道扫描(一次配置,多个通道分别采样) |
触发源 |
|
关:软件触发(读取时主动启动一次转换);开:GPTIM3 定时器触发,并使能转换完成中断 |
四种组合均可用:单通道+软件触发、单通道+定时器触发、多通道+软件触发、多通道+定时器触发。 本例程默认采用 多通道 + 定时器触发 + 中断通知。
硬件连接
SDADC 通道与引脚的对应关系(驱动通道号 1~4):
芯片 |
CH1 |
CH2 |
CH3 |
CH4 |
|---|---|---|---|---|
SF32LB55X |
PB_23 |
PB_24 |
PB_25 |
PB_26 |
SF32LB58X |
PB_40 |
PB_41 |
PB_42 |
PB_43 |
将目标 SDADC 引脚连接到外部电压源(0 ~ 参考电压),GND 必须与开发板共地。未接信号的 通道读数为悬空噪声,属正常现象。
例程的使用
编译和烧录
此例程用到了 SDADC RT 驱动,需要确认
rtconfig.h中包含以下宏:
#define BSP_USING_SDADC 1
#define RT_USING_ADC 1
只有包含了上述宏,sifli_sdadc_init 函数才会通过 rt_hw_adc_register 注册 "sdadc" 设备,
后续 rt_device_find、rt_adc_read 才能成功。
本例程的
proj.conf已开启所需配置:
CONFIG_BSP_USING_SDADC=y
CONFIG_BSP_SDADC_USE_TIMER_TRIGGER=y # 定时器触发 + 转换完成中断
CONFIG_BSP_SDADC_TIMER_PERIOD_MS=1000 # 定时周期(ms)
CONFIG_BSP_SDADC_SUPPORT_MULTI_CH_SAMPLING=y # 多通道扫描
如需手动配置,可用
menuconfig(your_board替换为你实际使用的 board 名):
sdk.py menuconfig --board=your_board
按如图选项勾选 SDADC、多通道采样、定时器触发等选项,保存退出。

切换到例程 project 目录,运行 scons 编译(以 ec-lb587 为例):
scons --board=ec-lb587_hcpu -j8
运行
build_ec-lb587_hcpu\uart_download.bat,按提示选择串口下载。
例程输出结果展示
每收到一次转换完成中断通知(约等于定时周期),打印一组 4 通道电压值
(单位 0.1mV,ch1: 6580 (658.0 mV) 表示 658.0mV):
======== SDADC Multi-Channel (IRQ-driven) Example ========
I/sdadc: SDADC ch1 enabled
I/sdadc: SDADC ch2 enabled
I/sdadc: SDADC ch3 enabled
I/sdadc: SDADC ch4 enabled
I/sdadc: SDADC multi-channel + timer trigger + interrupt, 4 channels
msh />
I/sdadc: ch1: 7025 (702.5 mV)
I/sdadc: ch2: 4761 (476.1 mV)
I/sdadc: ch3: 6618 (661.8 mV)
I/sdadc: ch4: 6391 (639.1 mV)
若持续打印
SDADC conversion-complete notification timeout,说明没有收到中断通知, 需检查定时器触发与 SDADC 中断是否正常。
例程流程
对每个待采样通道配置 pinmux(
HAL_PIN_Set+HAL_PIN_Select切到 SDADC 模拟功能)rt_device_find("sdadc")查找 SDADC 设备对每个通道
rt_adc_enable(dev, channel)使能对应采样槽。初始化信号量,并用
rt_device_set_rx_indicate注册转换完成回调主循环
rt_sem_take等待中断通知被唤醒,再对每个通道rt_adc_read读取电压
切换到其它采集模式
单通道:在
proj.conf去掉CONFIG_BSP_SDADC_SUPPORT_MULTI_CH_SAMPLING=y,并把main.c中g_sdadc_channels改为单个通道(如{3})。软件触发:去掉
CONFIG_BSP_SDADC_USE_TIMER_TRIGGER=y。此时没有定时器与转换完成中断, 每次rt_adc_read会主动启动一次转换(阻塞到完成);应用侧应改回rt_thread_mdelay+rt_adc_read的轮询方式,不要再等rx_indicate。只要定时器不要中断通知:保留定时器触发,但不调用
rt_device_set_rx_indicate,主循环用rt_thread_mdelay+rt_adc_read轮询即可。
异常诊断
find sdadc failed—BSP_USING_SDADC未启用,SDADC 驱动未编译,"sdadc"设备未注册。rt_adc_enable chN failed— 通道号超出范围(有效 1~4),或 SDADC 硬件初始化失败。SDADC conversion-complete notification timeout— 没收到中断通知:确认已开启BSP_SDADC_USE_TIMER_TRIGGER(驱动会同时使能定时器触发与转换完成中断),并检查 GPTIM3 是否正常运行。某通道读数恒为 0 或异常 —
检查该通道引脚是否接了信号、是否与板子共地;
检查该 pad 的
HAL_PIN_Select功能选择值是否正确(本例程统一用10,若某通道对不上 请查引脚配置表确认);多通道模式下确认该通道已
rt_adc_enable(未使能的槽不会被扫描)。确认该芯片的sdadc是否有做出厂校准,开机log有没有
Get SDADC configure fail, use default calibration日志出现。
更新记录
版本 |
日期 |
发布说明 |
|---|---|---|
0.0.1 |
07/2026 |
初始版本 |