API GUIDE / ADC / LL

G32S10 ADC LL 接口

LL 层接口:本文档定义 G32S10 SDK ADC 模块的正式接口,覆盖以下两层:

1. 文档范围

本文档定义 G32S10 SDK ADC 模块的正式接口,覆盖以下两层:

  • HAL ADC:面向应用、BSP和驱动上层的功能级接口

  • LL ADC:面向寄存器与位操作的低层接口

补充说明:

  • LL层不返回状态码;需要返回寄存器值或数据时返回 uint32_t。

  • HAL层负责参数校验、状态管理、中断/DMA编排和超时处理。

本文档以当前 SDK 源码为准,主要核对文件如下:

类型路径
HAL 公开接口code/include/drivers/g32s10/adc/hal_adc.h
HAL 实现code/drivers/g32s10/adc/hal_adc.c
LL 公开接口code/include/drivers/g32s10/adc/ll_adc.h
寄存器定义code/include/drivers/g32s10/adc/adc_regs.h
构建配置code/drivers/g32s10/adc/Kconfig
HAL 示例code/examples/hal/
LL 示例code/examples/ll/adc_seq_example.c

当文档描述与头文件、实现或 Kconfig 不一致时,以当前源码为准;硬件能力中未能在 SDK 源码内直接确认的数值,应结合芯片 SPEC 阅读。

目录

2. 分层关系

Application / BSP / Example
           |
           v
        HAL ADC
           |
           v
        LL ADC
           |
           v
      ADC Registers

分层职责如下:

  • HAL ADC

    • 封装初始化、序列配置、启动停止、轮询、中断、DMA侧控制、AWD和寄存器dump

    • 维护参数合法性、模块级状态、活跃序列mask和统一返回码

    • 提供便于上层使用的解包数据结构、回调注册和错误查询接口

  • LL ADC

    • 提供寄存器位级访问入口

    • 不维护软件状态,不做复杂业务语义判断

    • 公开接口均为 static inline,首参数为 adc_regs_t *adcx

  • adc_regs.h

    • 定义ADC基地址、寄存器结构体布局、通道数量、序列长度和位域mask

2.1 编译与运行前置条件

ADC HAL/LL 不负责板级时钟、引脚复用和 SoC 中断资源。直接使用本模块前,应用、BSP 或板级代码需要完成以下准备:

项目责任方说明
CONFIG_DRIVER_ADC应用配置编译 ADC 驱动;该选项会自动选择 CONFIG_DRIVER_DMA。
ADC 模块时钟与门控CPM/板级访问寄存器前使能对应 SADC0/SADC1 时钟和门控。HAL 初始化不会配置 CPM。
模拟输入引脚GPIO/板级将所选通道对应的引脚配置为 ADC 模拟输入功能;具体引脚和功能号由板级设计决定。
SoC IRQPLIC/中断框架使用 *_it() 或 DMA 完成中断时,应用必须注册并使能 IRQ_SADC0 或 IRQ_SADC1,中断服务程序调用 hal_adc_irq_handler()。
systick 时间基准应用/OShal_adc_poll_for_conversion() 以及使用微秒/毫秒超时的应用代码依赖 SDK systick。
DMA 控制器CPM/DMA HALDMA 模式需要 DMA 控制器时钟、合法 descriptor 存储和调用方持有的目标缓冲区。HAL 负责 ADC 侧 cache 维护。
Debug helper应用配置hal_adc_regs_dump() 需要同时开启 CONFIG_SDK_ENABLE_DEBUG_HELPERS 和 CONFIG_ADC_ENABLE_DEBUG_HELPERS,否则保留符号但返回 IM_ERR_UNSUPPORTED。

轮询模式下可不使用 ADC IRQ;DMA 模式是否使用完成中断取决于应用选择普通 start 还是 *_it() 接口。

5. LL 与基础辅助接口规范

说明:完整函数原型以 ll_adc.h 为准。

5.1 LL 层实现边界

  • 当前LL实现文件为 code/include/drivers/g32s10/adc/ll_adc.h,寄存器映射和寄存器位定义文件为 code/include/drivers/g32s10/adc/adc_regs.h。

  • 所有公开 ll_adc_* 接口均为 static inline,首参数统一为 adc_regs_t *adcx。

  • LL层不做参数合法性判断,不返回状态码;调用者必须保证 adcx、数组指针、序列号、通道号、rank、mask等参数合法。

  • 写寄存器、置位、清位类接口返回 void;读寄存器、读状态、读数据类接口返回 uint32_t。

  • SEQ1当前LL接口只开放rank 07,高位rank 815暂不开放;后续如SPEC更新再扩展。

  • SEQ1_CR / SEQ2_CR 只提供触发源 EXTSEL 配置,不提供TCU通道选择参数。

  • ll_adc_seq_start() / ll_adc_seq_multi_start() 仅适用于软件触发序列;外部触发序列由外部触发源启动。

  • AWD总中断清除使用 ll_adc_interrupt_status_clear(adcx, ADC_IR_AWD)。

  • Debug寄存器接口不对外提供,dbg_cr / dbg_fsm 仅保留在寄存器映射中。

5.2 LL 层公开宏

当前SDK中LL层使用的ADC寄存器宏集中在 adc_regs.h,前缀为 ADC_。

宏用途说明
ADC_MASK_ALL全bit掩码需要对寄存器全部bit进行清除、屏蔽或关闭时使用,替代 0xFFFFFFFFUL 魔法数字。
ADC_SEQ_0 / ADC_SEQ_1 / ADC_SEQ_2序列编号用于 adc_seq 参数。
ADC_TRIGGER_SOFTWARE软件触发写入SEQ1/SEQ2 EXTSEL 字段。
ADC_TRIGGER_TCUTCU触发只选择TCU触发源,不配置TCU通道。
ADC_TRIGGER_PWM0 / ADC_TRIGGER_PWM1PWM触发选择PWM0/PWM1触发源。
ADC_DRT_SEQ_END序列结束数据就绪用于SEQn_DCR的DRT配置。
ADC_DRT_GROUP_END组结束数据就绪用于SEQ1连续组模式。
ADC_DRT_FIFO_GE_1 / ADC_DRT_FIFO_GE_4 / ADC_DRT_FIFO_GE_8 / ADC_DRT_FIFO_GE_16FIFO水线数据就绪用于SEQ1/SEQ2 FIFO模式。
ADC_DRT_CUSTOM自定义rank数据就绪通过 custom_mask 指定哪些rank触发数据就绪。
ADC_DATA_VALUE(data)提取采样值从packed data中取 [11:0]。
ADC_DATA_CHANNEL(data)提取通道号从packed data中取 [15:12]。
ADC_SR_*ADC_SR状态位用于 ll_adc_status_get() / ll_adc_status_clear()。
ADC_IE_*ADC_IE中断使能位用于 ll_adc_interrupt_enable() / ll_adc_interrupt_disable()。
ADC_IR_*ADC_IR中断状态位用于 ll_adc_interrupt_status_get() / ll_adc_interrupt_status_clear()。
ADC_AWD_LOW_FLAG(channel)AWD低阈值flagchannel 范围为0~7。
ADC_AWD_HIGH_FLAG(channel)AWD高阈值flagchannel 范围为0~7。
ADC_WRITE_FIELD()寄存器字段写入内部基于 im_mmio_update_bits_32() 实现读改写。
ADC_CNT_TO_LEN()次数到寄存器长度编码将转换次数转换为硬件LEN字段值。
ADC_SEQ_START_MASK() / ADC_SEQ_START_MASK_ALL / ADC_SEQ_RESET_MASK()序列启动/复位mask用于ADC_CR中SEQ启动和复位控制位;ADC_SEQ_START_MASK_ALL 是三个启动位的合集,供启动接口清除旧启动位使用。

5.3 基础辅助与寄存器访问

5.3.1 ll_adc_is_instance

static inline bool ll_adc_is_instance(const adc_regs_t *adcx);

功能说明: 判断传入的ADC寄存器基地址是否为当前SDK支持的ADC实例。

参数表:

参数类型方向说明
adcxconst adc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
true条件成立
false条件不成立

补充说明:

  • 参数约束:adcx 可为任意地址,接口只做地址比较。

5.3.2 ll_adc_reg_write

static inline void ll_adc_reg_write(adc_regs_t *adcx, uint32_t offset, uint32_t value);

功能说明: 按ADC基地址偏移写一个32位寄存器。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
offsetuint32_t输入32位对齐的寄存器字节偏移
valueuint32_t输入写入寄存器的32位值

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:offset 为32位对齐的寄存器字节偏移;value 为写入值。

5.3.3 ll_adc_reg_read

static inline uint32_t ll_adc_reg_read(adc_regs_t *adcx, uint32_t offset);

功能说明: 按ADC基地址偏移读一个32位寄存器。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
offsetuint32_t输入32位对齐的寄存器字节偏移

返回值表:

返回值说明
uint32_t当前寄存器值。

补充说明:

  • 参数约束:offset 为32位对齐的寄存器字节偏移。

5.4 PHY 和全局控制

5.4.1 ll_adc_phy_enable

static inline void ll_adc_phy_enable(adc_regs_t *adcx);

功能说明: ADC PHY上电。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adcx 为ADC实例。

5.4.2 ll_adc_phy_disable

static inline void ll_adc_phy_disable(adc_regs_t *adcx);

功能说明: ADC PHY下电。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adcx 为ADC实例。

5.4.3 ll_adc_phy_pad_enable

static inline void ll_adc_phy_pad_enable(adc_regs_t *adcx);

功能说明: 使能模拟pad输入选择。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adcx 为ADC实例。

5.4.4 ll_adc_phy_pad_disable

static inline void ll_adc_phy_pad_disable(adc_regs_t *adcx);

功能说明: 关闭模拟pad输入选择。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adcx 为ADC实例。

5.4.5 ll_adc_phy_reset_enable

static inline void ll_adc_phy_reset_enable(adc_regs_t *adcx);

功能说明: 置位PHY reset。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adcx 为ADC实例。

5.4.6 ll_adc_phy_reset_disable

static inline void ll_adc_phy_reset_disable(adc_regs_t *adcx);

功能说明: 释放PHY reset。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adcx 为ADC实例。

5.4.7 ll_adc_phy_eoc_select

static inline void ll_adc_phy_eoc_select(adc_regs_t *adcx, uint8_t eoc_source);

功能说明: 选择EOC来源。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
eoc_sourceuint8_t输入EOC来源,0表示控制器EOC,1表示PHY EOC

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:eoc_source 为0表示控制器EOC,为1表示PHY EOC。

5.4.8 ll_adc_break_enable

static inline void ll_adc_break_enable(adc_regs_t *adcx);

功能说明: 允许高优先级序列打断低优先级序列。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adcx 为ADC实例。

5.4.9 ll_adc_break_disable

static inline void ll_adc_break_disable(adc_regs_t *adcx);

功能说明: 禁止冲突处理打断正在运行的序列。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adcx 为ADC实例。

5.4.10 ll_adc_soc_extra_cycle_set

static inline void ll_adc_soc_extra_cycle_set(adc_regs_t *adcx, uint8_t cycle);

功能说明: 配置SOC额外高电平周期。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
cycleuint8_t输入SOC额外周期,HAL使用 HAL_ADC_SOC_EXTRA_CYCLE_*,LL使用 ADC_SOC_EXTRA_CYCLE_* 离散值

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:cycle 使用 ADC_SOC_EXTRA_CYCLE_* 离散值;禁止在任一序列工作期间修改该字段。

5.5 时钟控制

5.5.1 ll_adc_clk_div_set

static inline void ll_adc_clk_div_set(adc_regs_t *adcx, uint8_t adc_clk_div);

功能说明: 配置ADC转换时钟分频。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
adc_clk_divuint8_t输入ADC转换时钟分频字段值,范围0~`ADC_CLK_DIV_MAX`

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adc_clk_div 为 ADC_CLKR0.ADCCLK_DIV 字段值,范围0~0xFF。

5.5.2 ll_adc_clk_div_get

static inline uint32_t ll_adc_clk_div_get(adc_regs_t *adcx);

功能说明: 读取ADC转换时钟分频字段。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
uint32_tADC_CLKR0.ADCCLK_DIV 字段值。

补充说明:

  • 参数约束:adcx 为ADC实例。

5.5.3 ll_adc_seq1_cont_clk_div_set

static inline void ll_adc_seq1_cont_clk_div_set(adc_regs_t *adcx, uint32_t div);

功能说明: 配置SEQ1连续转换间隔时钟分频。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
divuint32_t输入分频字段值,调用方需保证不超过对应寄存器字段宽度

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:div 为 ADC_CLKR0.SEQ1_CONTCLK_DIV 字段值,范围0~0x00FFFFFF。

5.5.4 ll_adc_seq1_delay_clk_div_set

static inline void ll_adc_seq1_delay_clk_div_set(adc_regs_t *adcx, uint32_t div);

功能说明: 配置SEQ1延时计数时钟分频。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
divuint32_t输入分频字段值,调用方需保证不超过对应寄存器字段宽度

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:div 为 ADC_CLKR1.SEQ1_DLYCLK_DIV 字段值,范围0~0x00FFFFFF。

5.5.5 ll_adc_seq2_delay_clk_div_set

static inline void ll_adc_seq2_delay_clk_div_set(adc_regs_t *adcx, uint32_t div);

功能说明: 配置SEQ2延时计数时钟分频。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
divuint32_t输入分频字段值,调用方需保证不超过对应寄存器字段宽度

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:div 为 ADC_CLKR2.SEQ2_DLYCLK_DIV 字段值,范围0~0x00FFFFFF。

5.6 状态和中断

5.6.1 ll_adc_status_get

static inline uint32_t ll_adc_status_get(adc_regs_t *adcx);

功能说明: 读取ADC状态寄存器。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
uint32_tADC_SR 当前值。

补充说明:

  • 参数约束:adcx 为ADC实例。

5.6.2 ll_adc_status_clear

static inline void ll_adc_status_clear(adc_regs_t *adcx, uint32_t flag_mask);

功能说明: 清除写1清零的ADC状态位。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
flag_maskuint32_t输入状态位mask,使用 ADC_SR_* 掩码;全清可用 ADC_MASK_ALL

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:flag_mask 使用 ADC_SR_* 掩码;全清可用 ADC_MASK_ALL。

5.6.3 ll_adc_interrupt_enable

static inline void ll_adc_interrupt_enable(adc_regs_t *adcx, uint32_t interrupt_mask);

功能说明: 使能ADC中断源。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
interrupt_maskuint32_t输入中断位mask,使能使用 ADC_IE_*,状态清除使用 ADC_IR_*

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:interrupt_mask 使用 ADC_IE_* 掩码。

5.6.4 ll_adc_interrupt_disable

static inline void ll_adc_interrupt_disable(adc_regs_t *adcx, uint32_t interrupt_mask);

功能说明: 关闭ADC中断源。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
interrupt_maskuint32_t输入中断位mask,使能使用 ADC_IE_*,状态清除使用 ADC_IR_*

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:interrupt_mask 使用 ADC_IE_* 掩码;全关可用 ADC_MASK_ALL。

5.6.5 ll_adc_interrupt_status_get

static inline uint32_t ll_adc_interrupt_status_get(adc_regs_t *adcx);

功能说明: 读取ADC中断状态寄存器。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
uint32_tADC_IR 当前值。

补充说明:

  • 参数约束:adcx 为ADC实例。

5.6.6 ll_adc_interrupt_status_clear

static inline void ll_adc_interrupt_status_clear(adc_regs_t *adcx, uint32_t interrupt_mask);

功能说明: 清除ADC中断状态位。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
interrupt_maskuint32_t输入中断位mask,使能使用 ADC_IE_*,状态清除使用 ADC_IR_*

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:interrupt_mask 使用 ADC_IR_* 掩码;AWD总中断清除使用 ADC_IR_AWD。

5.7 序列公共控制

5.7.1 ll_adc_seq_priority_set

static inline void ll_adc_seq_priority_set(adc_regs_t *adcx,
                                           uint8_t adc_seq,
                                           uint8_t priority);

功能说明: 配置单个序列优先级。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
adc_sequint8_t输入序列号,使用 ADC_SEQ_0/1/2
priorityuint8_t输入优先级字段值,范围0~3,0最低、3最高

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adc_seq 使用 ADC_SEQ_0/1/2;priority 范围0~3,0最低、3最高。

5.7.2 ll_adc_seq_priority_get

static inline uint32_t ll_adc_seq_priority_get(adc_regs_t *adcx, uint8_t adc_seq);

功能说明: 读取单个序列优先级。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
adc_sequint8_t输入序列号,使用 ADC_SEQ_0/1/2

返回值表:

返回值说明
uint32_t优先级字段值。

补充说明:

  • 参数约束:adc_seq 使用 ADC_SEQ_0/1/2。

5.7.3 ll_adc_seq_start

static inline void ll_adc_seq_start(adc_regs_t *adcx, uint8_t adc_seq);

功能说明: 软件触发启动单个ADC转换序列。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
adc_sequint8_t输入序列号,使用 ADC_SEQ_0/1/2

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adc_seq 使用 ADC_SEQ_0/1/2;仅在序列配置为软件触发时使用。

  • 该接口仅适用于已配置为软件触发的序列。

  • 启动位兼作“待处理触发事件”标志,硬件消费后自清。接口写入时先清除全部启动位,再只置位本次请求的位,不会把读到的旧 1 回写。

  • 连续调用本接口启动不同序列时,先前序列的启动事件不会被重复投递,因此不会产生该序列的 EVTn_EVT_OVR。

5.7.4 ll_adc_seq_multi_start

static inline void ll_adc_seq_multi_start(adc_regs_t *adcx, uint32_t seq_mask);

功能说明: 软件触发启动一个或多个ADC转换序列。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
seq_maskuint32_t输入bit0/bit1/bit2分别选择SEQ0/SEQ1/SEQ2

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:seq_mask 使用bit0/1/2选择SEQ0/SEQ1/SEQ2;被选序列均应配置为软件触发。

  • seq_mask 保持32位,便于直接承载寄存器mask表达。

  • 仅置位 seq_mask 选中的启动位;其他启动位写 0,避免把仍处于待处理状态的事件重复写回而触发 EVTn_EVT_OVR。

  • 需要多个序列同时启动时应一次调用本接口,而不是连续多次调用单序列启动接口。

5.7.5 ll_adc_seq_reset

static inline void ll_adc_seq_reset(adc_regs_t *adcx, uint8_t adc_seq);

功能说明: 复位单个序列状态机。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
adc_sequint8_t输入序列号,使用 ADC_SEQ_0/1/2

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adc_seq 使用 ADC_SEQ_0/1/2。

5.7.6 ll_adc_seq_busy_get

static inline uint32_t ll_adc_seq_busy_get(adc_regs_t *adcx, uint8_t adc_seq);

功能说明: 读取单个序列FSM状态。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
adc_sequint8_t输入序列号,使用 ADC_SEQ_0/1/2

返回值表:

返回值说明
uint32_t原始FSM状态值。

补充说明:

  • 参数约束:adc_seq 使用 ADC_SEQ_0/1/2。

5.8 SEQ0 接口

5.8.1 ll_adc_seq0_channels_set

static inline void ll_adc_seq0_channels_set(adc_regs_t *adcx,
                                            const uint8_t *channel,
                                            uint8_t channel_count);

功能说明: 配置SEQ0转换通道列表。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
channelconst uint8_t *输入ADC通道号,范围0~7
channel_countuint8_t输入通道数量或转换次数,SEQ0范围1~4,SEQ1/SEQ2范围1~88

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:channel 指向通道数组;channel_count 范围1~4;LL默认参数合法。

5.8.2 ll_adc_seq0_length_set

static inline void ll_adc_seq0_length_set(adc_regs_t *adcx, uint8_t channel_count);

功能说明: 配置SEQ0转换次数。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
channel_countuint8_t输入通道数量或转换次数,SEQ0范围1~4,SEQ1/SEQ2范围1~88

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:channel_count 范围1~4,接口内部写入 channel_count - 1。

5.8.3 ll_adc_seq0_channel_number_enable

static inline void ll_adc_seq0_channel_number_enable(adc_regs_t *adcx);

功能说明: 使能SEQ0结果携带通道号。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adcx 为ADC实例。

5.8.4 ll_adc_seq0_channel_number_disable

static inline void ll_adc_seq0_channel_number_disable(adc_regs_t *adcx);

功能说明: 关闭SEQ0结果携带通道号。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adcx 为ADC实例。

5.8.5 ll_adc_seq0_data_ready_type_set

static inline void ll_adc_seq0_data_ready_type_set(adc_regs_t *adcx,
                                                   uint8_t data_ready_type,
                                                   uint8_t custom_mask);

功能说明: 配置SEQ0数据就绪方式。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
data_ready_typeuint8_t输入数据就绪类型,使用对应序列支持的 ADC_DRT_* 值
custom_maskuint8_t输入自定义rank mask,SEQ0仅bit3:0有效,SEQ1/SEQ2仅bit7:0有效

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:data_ready_type 为0表示序列结束,为1表示自定义rank;custom_mask 仅bit3:0有效。

5.8.6 ll_adc_seq0_data_count_get

static inline uint32_t ll_adc_seq0_data_count_get(adc_regs_t *adcx);

功能说明: 读取SEQ0已采样数据数量。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
uint32_t数据数量字段值。

补充说明:

  • 参数约束:adcx 为ADC实例。

5.8.7 ll_adc_seq0_data_reg_get

static inline uint32_t ll_adc_seq0_data_reg_get(adc_regs_t *adcx, uint8_t reg_index);

功能说明: 读取SEQ0原始数据寄存器。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
reg_indexuint8_t输入CPU数据寄存器索引,SEQ0范围0~1,SEQ1/SEQ2范围0~33

返回值表:

返回值说明
uint32_tpacked原始寄存器值。

补充说明:

  • 参数约束:reg_index 范围0~1。

5.8.8 ll_adc_seq0_data_get

static inline uint32_t ll_adc_seq0_data_get(adc_regs_t *adcx, uint8_t rank);

功能说明: 读取SEQ0指定rank的packed结果。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
rankuint8_t输入目标rank,SEQ0范围0~3,SEQ1/SEQ2范围0~77

返回值表:

返回值说明
uint32_tpacked采样结果。

补充说明:

  • 参数约束:rank 范围0~3。

5.9 SEQ1 接口

5.9.1 ll_adc_seq1_channels_set

static inline void ll_adc_seq1_channels_set(adc_regs_t *adcx,
                                            const uint8_t *channel,
                                            uint8_t channel_count);

功能说明: 配置SEQ1转换通道列表。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
channelconst uint8_t *输入ADC通道号,范围0~7
channel_countuint8_t输入通道数量或转换次数,SEQ0范围1~4,SEQ1/SEQ2范围1~88

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:channel 指向通道数组;channel_count 范围18;高位rank 815暂不开放。

  • 当前LL只开放rank0rank7,高位rank8rank15暂不开放。

5.9.2 ll_adc_seq1_length_set

static inline void ll_adc_seq1_length_set(adc_regs_t *adcx, uint8_t channel_count);

功能说明: 配置SEQ1转换次数。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
channel_countuint8_t输入通道数量或转换次数,SEQ0范围1~4,SEQ1/SEQ2范围1~88

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:channel_count 范围1~8,接口内部写入 channel_count - 1。

5.9.3 ll_adc_seq1_trigger_set

static inline void ll_adc_seq1_trigger_set(adc_regs_t *adcx, uint8_t trigger);

功能说明: 配置SEQ1触发源。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
triggeruint8_t输入触发源,使用 ADC_TRIGGER_SOFTWARE/TCU/PWM0/PWM1

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:trigger 使用 ADC_TRIGGER_SOFTWARE/TCU/PWM0/PWM1;不配置TCU通道。

  • SEQ1_CR 只选择触发源,不包含TCU通道选择字段。

5.9.4 ll_adc_seq1_channel_number_enable

static inline void ll_adc_seq1_channel_number_enable(adc_regs_t *adcx);

功能说明: 使能SEQ1结果携带通道号。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adcx 为ADC实例。

5.9.5 ll_adc_seq1_channel_number_disable

static inline void ll_adc_seq1_channel_number_disable(adc_regs_t *adcx);

功能说明: 关闭SEQ1结果携带通道号。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adcx 为ADC实例。

5.9.6 ll_adc_seq1_storage_mask_set

static inline void ll_adc_seq1_storage_mask_set(adc_regs_t *adcx, uint8_t storage_mask);

功能说明: 配置SEQ1 CPU数据存储rank mask。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
storage_maskuint8_t输入bit7:0对应rank0~rank7,bit为1表示存储对应rank

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:storage_mask 仅bit7:0有效,bit为1表示存储对应rank。

5.9.7 ll_adc_seq1_data_ready_type_set

static inline void ll_adc_seq1_data_ready_type_set(adc_regs_t *adcx,
                                                   uint8_t data_ready_type,
                                                   uint8_t custom_mask);

功能说明: 配置SEQ1数据就绪触发方式。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
data_ready_typeuint8_t输入数据就绪类型,使用对应序列支持的 ADC_DRT_* 值
custom_maskuint8_t输入自定义rank mask,SEQ0仅bit3:0有效,SEQ1/SEQ2仅bit7:0有效

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:data_ready_type 使用SEQ1支持的 ADC_DRT_*;custom_mask 仅bit7:0有效。

5.9.8 ll_adc_seq1_dma_enable

static inline void ll_adc_seq1_dma_enable(adc_regs_t *adcx);

功能说明: 使能SEQ1 DMA模式。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adcx 为ADC实例。

5.9.9 ll_adc_seq1_dma_disable

static inline void ll_adc_seq1_dma_disable(adc_regs_t *adcx);

功能说明: 关闭SEQ1 DMA模式。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adcx 为ADC实例。

5.9.10 ll_adc_seq1_fifo_count_get

static inline uint32_t ll_adc_seq1_fifo_count_get(adc_regs_t *adcx);

功能说明: 读取SEQ1 FIFO数据数量。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
uint32_tFIFO计数字段值。

补充说明:

  • 参数约束:adcx 为ADC实例。

5.9.11 ll_adc_seq1_fifo_read

static inline uint32_t ll_adc_seq1_fifo_read(adc_regs_t *adcx);

功能说明: 读取SEQ1 FIFO数据寄存器。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
uint32_tpacked采样结果。

补充说明:

  • 参数约束:读取可能弹出FIFO数据或改变FIFO状态。

5.9.12 ll_adc_seq1_delay_set

static inline void ll_adc_seq1_delay_set(adc_regs_t *adcx,
                                         uint8_t rank,
                                         uint16_t delay_count);

功能说明: 配置SEQ1指定rank延时。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
rankuint8_t输入目标rank,SEQ0范围0~3,SEQ1/SEQ2范围0~77
delay_countuint16_t输入延时计数值,调用方需保证不超过对应序列延时字段宽度

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:rank 范围07;delay_count 范围00xFFFF。

5.9.13 ll_adc_seq1_continuous_enable

static inline void ll_adc_seq1_continuous_enable(adc_regs_t *adcx);

功能说明: 使能SEQ1连续转换模式。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adcx 为ADC实例。

5.9.14 ll_adc_seq1_continuous_disable

static inline void ll_adc_seq1_continuous_disable(adc_regs_t *adcx);

功能说明: 关闭SEQ1连续转换模式。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adcx 为ADC实例。

5.9.15 ll_adc_seq1_group_count_set

static inline void ll_adc_seq1_group_count_set(adc_regs_t *adcx, uint8_t group_count);

功能说明: 配置SEQ1连续组数量。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
group_countuint8_t输入SEQ1连续组数量,范围1~`ADC_MAX_GROUP_COUNT`

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:group_count 范围1~8,接口内部写入 group_count - 1。

5.9.16 ll_adc_seq1_group_config_set

static inline void ll_adc_seq1_group_config_set(adc_regs_t *adcx,
                                                uint8_t group_index,
                                                uint8_t group_length,
                                                uint16_t group_interval);

功能说明: 配置SEQ1连续组长度和间隔。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
group_indexuint8_t输入SEQ1连续组索引,范围0~7
group_lengthuint8_t输入SEQ1当前组长度,范围1~8,接口内部写入 group_length - 1
group_intervaluint16_t输入SEQ1当前组结束后的间隔计数,范围0~0xFFFF

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:group_index 范围07;group_length 范围18;group_interval 范围0~0xFFFF。

5.9.17 ll_adc_seq1_read_counter_set

static inline void ll_adc_seq1_read_counter_set(adc_regs_t *adcx, uint16_t max, uint16_t cnt);

功能说明: 配置SEQ1读计数器最大值和当前值。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
maxuint16_t输入读计数器最大值,范围0~0xFFFF
cntuint16_t输入读计数器当前值,范围0~0xFFFF

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:max、cnt 范围0~0xFFFF。

5.9.18 ll_adc_seq1_read_counter_get

static inline uint32_t ll_adc_seq1_read_counter_get(adc_regs_t *adcx);

功能说明: 读取SEQ1读计数器寄存器。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
uint32_tSEQ1_RCNT 当前值。

补充说明:

  • 参数约束:adcx 为ADC实例。

5.9.19 ll_adc_seq1_dma_read_counter_get

static inline uint32_t ll_adc_seq1_dma_read_counter_get(adc_regs_t *adcx);

功能说明: 读取SEQ1 DMA读计数器。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
uint32_tSEQ1_DMA_RCNT 当前值。

补充说明:

  • 参数约束:adcx 为ADC实例。

5.9.20 ll_adc_seq1_data_reg_get

static inline uint32_t ll_adc_seq1_data_reg_get(adc_regs_t *adcx, uint8_t reg_index);

功能说明: 读取SEQ1原始CPU数据寄存器。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
reg_indexuint8_t输入CPU数据寄存器索引,SEQ0范围0~1,SEQ1/SEQ2范围0~33

返回值表:

返回值说明
uint32_tpacked原始寄存器值。

补充说明:

  • 参数约束:reg_index 范围0~3。

5.9.21 ll_adc_seq1_data_get

static inline uint32_t ll_adc_seq1_data_get(adc_regs_t *adcx, uint8_t rank);

功能说明: 读取SEQ1指定rank的packed结果。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
rankuint8_t输入目标rank,SEQ0范围0~3,SEQ1/SEQ2范围0~77

返回值表:

返回值说明
uint32_tpacked采样结果。

补充说明:

  • 参数约束:rank 范围0~7。

5.10 SEQ2 接口

5.10.1 ll_adc_seq2_channels_set

static inline void ll_adc_seq2_channels_set(adc_regs_t *adcx,
                                            const uint8_t *channel,
                                            uint8_t channel_count);

功能说明: 配置SEQ2转换通道列表。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
channelconst uint8_t *输入ADC通道号,范围0~7
channel_countuint8_t输入通道数量或转换次数,SEQ0范围1~4,SEQ1/SEQ2范围1~88

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:channel 指向通道数组;channel_count 范围1~8。

5.10.2 ll_adc_seq2_length_set

static inline void ll_adc_seq2_length_set(adc_regs_t *adcx, uint8_t channel_count);

功能说明: 配置SEQ2转换次数。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
channel_countuint8_t输入通道数量或转换次数,SEQ0范围1~4,SEQ1/SEQ2范围1~88

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:channel_count 范围1~8,接口内部写入 channel_count - 1。

5.10.3 ll_adc_seq2_trigger_set

static inline void ll_adc_seq2_trigger_set(adc_regs_t *adcx, uint8_t trigger);

功能说明: 配置SEQ2触发源。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
triggeruint8_t输入触发源,使用 ADC_TRIGGER_SOFTWARE/TCU/PWM0/PWM1

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:trigger 使用 ADC_TRIGGER_SOFTWARE/TCU/PWM0/PWM1;不配置TCU通道。

  • SEQ2_CR 只选择触发源,不包含TCU通道选择字段。

5.10.4 ll_adc_seq2_channel_number_enable

static inline void ll_adc_seq2_channel_number_enable(adc_regs_t *adcx);

功能说明: 使能SEQ2结果携带通道号。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adcx 为ADC实例。

5.10.5 ll_adc_seq2_channel_number_disable

static inline void ll_adc_seq2_channel_number_disable(adc_regs_t *adcx);

功能说明: 关闭SEQ2结果携带通道号。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adcx 为ADC实例。

5.10.6 ll_adc_seq2_storage_mask_set

static inline void ll_adc_seq2_storage_mask_set(adc_regs_t *adcx, uint8_t storage_mask);

功能说明: 配置SEQ2 CPU数据存储rank mask。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
storage_maskuint8_t输入bit7:0对应rank0~rank7,bit为1表示存储对应rank

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:storage_mask 仅bit7:0有效,bit为1表示存储对应rank。

5.10.7 ll_adc_seq2_data_ready_type_set

static inline void ll_adc_seq2_data_ready_type_set(adc_regs_t *adcx,
                                                   uint8_t data_ready_type,
                                                   uint8_t custom_mask);

功能说明: 配置SEQ2数据就绪触发方式。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
data_ready_typeuint8_t输入数据就绪类型,使用对应序列支持的 ADC_DRT_* 值
custom_maskuint8_t输入自定义rank mask,SEQ0仅bit3:0有效,SEQ1/SEQ2仅bit7:0有效

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:data_ready_type 使用SEQ2支持的 ADC_DRT_*;custom_mask 仅bit7:0有效。

5.10.8 ll_adc_seq2_dma_enable

static inline void ll_adc_seq2_dma_enable(adc_regs_t *adcx);

功能说明: 使能SEQ2 DMA模式。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adcx 为ADC实例。

5.10.9 ll_adc_seq2_dma_disable

static inline void ll_adc_seq2_dma_disable(adc_regs_t *adcx);

功能说明: 关闭SEQ2 DMA模式。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:adcx 为ADC实例。

5.10.10 ll_adc_seq2_fifo_count_get

static inline uint32_t ll_adc_seq2_fifo_count_get(adc_regs_t *adcx);

功能说明: 读取SEQ2 FIFO数据数量。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
uint32_tFIFO计数字段值。

补充说明:

  • 参数约束:adcx 为ADC实例。

5.10.11 ll_adc_seq2_fifo_read

static inline uint32_t ll_adc_seq2_fifo_read(adc_regs_t *adcx);

功能说明: 读取SEQ2 FIFO数据寄存器。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
uint32_tpacked采样结果。

补充说明:

  • 参数约束:读取可能弹出FIFO数据或改变FIFO状态。

5.10.12 ll_adc_seq2_delay_set

static inline void ll_adc_seq2_delay_set(adc_regs_t *adcx,
                                         uint8_t rank,
                                         uint8_t delay_count);

功能说明: 配置SEQ2指定rank延时。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
rankuint8_t输入目标rank,SEQ0范围0~3,SEQ1/SEQ2范围0~77
delay_countuint8_t输入延时计数值,调用方需保证不超过对应序列延时字段宽度

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:rank 范围07;delay_count 范围00xFF。

5.10.13 ll_adc_seq2_read_counter_set

static inline void ll_adc_seq2_read_counter_set(adc_regs_t *adcx, uint16_t max, uint16_t cnt);

功能说明: 配置SEQ2读计数器最大值和当前值。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
maxuint16_t输入读计数器最大值,范围0~0xFFFF
cntuint16_t输入读计数器当前值,范围0~0xFFFF

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:max、cnt 范围0~0xFFFF。

5.10.14 ll_adc_seq2_read_counter_get

static inline uint32_t ll_adc_seq2_read_counter_get(adc_regs_t *adcx);

功能说明: 读取SEQ2读计数器寄存器。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
uint32_tSEQ2_RCNT 当前值。

补充说明:

  • 参数约束:adcx 为ADC实例。

5.10.15 ll_adc_seq2_dma_read_counter_get

static inline uint32_t ll_adc_seq2_dma_read_counter_get(adc_regs_t *adcx);

功能说明: 读取SEQ2 DMA读计数器。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
uint32_tSEQ2_DMA_RCNT 当前值。

补充说明:

  • 参数约束:adcx 为ADC实例。

5.10.16 ll_adc_seq2_data_reg_get

static inline uint32_t ll_adc_seq2_data_reg_get(adc_regs_t *adcx, uint8_t reg_index);

功能说明: 读取SEQ2原始CPU数据寄存器。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
reg_indexuint8_t输入CPU数据寄存器索引,SEQ0范围0~1,SEQ1/SEQ2范围0~33

返回值表:

返回值说明
uint32_tpacked原始寄存器值。

补充说明:

  • 参数约束:reg_index 范围0~3。

5.10.17 ll_adc_seq2_data_get

static inline uint32_t ll_adc_seq2_data_get(adc_regs_t *adcx, uint8_t rank);

功能说明: 读取SEQ2指定rank的packed结果。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
rankuint8_t输入目标rank,SEQ0范围0~3,SEQ1/SEQ2范围0~77

返回值表:

返回值说明
uint32_tpacked采样结果。

补充说明:

  • 参数约束:rank 范围0~7。

5.11 模拟看门狗接口

5.11.1 ll_adc_awd_threshold_set

static inline void ll_adc_awd_threshold_set(adc_regs_t *adcx,
                                            uint8_t channel,
                                            uint16_t low_threshold,
                                            uint16_t high_threshold);

功能说明: 配置单通道AWD低/高阈值。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
channeluint8_t输入ADC通道号,范围0~7
low_thresholduint16_t输入AWD低阈值,范围0~`ADC_THRESHOLD_MAX`
high_thresholduint16_t输入AWD高阈值,范围0~`ADC_THRESHOLD_MAX`,且不小于低阈值

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:channel 范围07;low_threshold、high_threshold 范围00x0FFF。

5.11.2 ll_adc_awd_low_threshold_enable

static inline void ll_adc_awd_low_threshold_enable(adc_regs_t *adcx, uint8_t channel);

功能说明: 使能指定通道低阈值检测。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
channeluint8_t输入ADC通道号,范围0~7

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:channel 范围0~7。

5.11.3 ll_adc_awd_low_threshold_disable

static inline void ll_adc_awd_low_threshold_disable(adc_regs_t *adcx, uint8_t channel);

功能说明: 关闭指定通道低阈值检测。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
channeluint8_t输入ADC通道号,范围0~7

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:channel 范围0~7。

5.11.4 ll_adc_awd_high_threshold_enable

static inline void ll_adc_awd_high_threshold_enable(adc_regs_t *adcx, uint8_t channel);

功能说明: 使能指定通道高阈值检测。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
channeluint8_t输入ADC通道号,范围0~7

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:channel 范围0~7。

5.11.5 ll_adc_awd_high_threshold_disable

static inline void ll_adc_awd_high_threshold_disable(adc_regs_t *adcx, uint8_t channel);

功能说明: 关闭指定通道高阈值检测。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
channeluint8_t输入ADC通道号,范围0~7

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:channel 范围0~7。

5.11.6 ll_adc_awd_status_get

static inline uint32_t ll_adc_awd_status_get(adc_regs_t *adcx);

功能说明: 读取AWD状态flag。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
uint32_tADC_AWD_SR 当前值。

补充说明:

  • 参数约束:adcx 为ADC实例。

5.11.7 ll_adc_awd_status_clear

static inline void ll_adc_awd_status_clear(adc_regs_t *adcx, uint32_t awd_flag_mask);

功能说明: 清除AWD状态flag。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
awd_flag_maskuint32_t输入AWD flag mask,使用 ADC_AWD_LOW_FLAG(channel) 或 ADC_AWD_HIGH_FLAG(channel)

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:awd_flag_mask 使用 ADC_AWD_LOW_FLAG(channel) 或 ADC_AWD_HIGH_FLAG(channel),channel范围0~7。

5.11.8 ll_adc_awd_interrupt_enable

static inline void ll_adc_awd_interrupt_enable(adc_regs_t *adcx, uint32_t awd_flag_mask);

功能说明: 使能AWD中断flag。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
awd_flag_maskuint32_t输入AWD flag mask,使用 ADC_AWD_LOW_FLAG(channel) 或 ADC_AWD_HIGH_FLAG(channel)

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:awd_flag_mask 使用AWD flag宏;AWD_IM 中0表示不屏蔽,接口内部清除对应bit。

5.11.9 ll_adc_awd_interrupt_disable

static inline void ll_adc_awd_interrupt_disable(adc_regs_t *adcx, uint32_t awd_flag_mask);

功能说明: 屏蔽AWD中断flag。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
awd_flag_maskuint32_t输入AWD flag mask,使用 ADC_AWD_LOW_FLAG(channel) 或 ADC_AWD_HIGH_FLAG(channel)

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:awd_flag_mask 使用AWD flag宏;AWD_IM 中1表示屏蔽,接口内部置位对应bit。

5.11.10 ll_adc_awd_interrupt_status_get

static inline uint32_t ll_adc_awd_interrupt_status_get(adc_regs_t *adcx);

功能说明: 读取AWD中断状态flag。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址

返回值表:

返回值说明
uint32_tADC_AWD_IR 当前值。

补充说明:

  • 参数约束:adcx 为ADC实例。

5.11.11 ll_adc_awd_fail_enable

static inline void ll_adc_awd_fail_enable(adc_regs_t *adcx, uint32_t awd_flag_mask);

功能说明: 使能AWD fail输出flag。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
awd_flag_maskuint32_t输入AWD flag mask,使用 ADC_AWD_LOW_FLAG(channel) 或 ADC_AWD_HIGH_FLAG(channel)

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:awd_flag_mask 使用AWD flag宏;AWD_FAIL 中0表示使能,接口内部清除对应bit。

5.11.12 ll_adc_awd_fail_disable

static inline void ll_adc_awd_fail_disable(adc_regs_t *adcx, uint32_t awd_flag_mask);

功能说明: 屏蔽AWD fail输出flag。

参数表:

参数类型方向说明
adcxadc_regs_t *输入ADC寄存器基地址
awd_flag_maskuint32_t输入AWD flag mask,使用 ADC_AWD_LOW_FLAG(channel) 或 ADC_AWD_HIGH_FLAG(channel)

返回值表:

返回值说明
无接口不返回状态码

补充说明:

  • 参数约束:awd_flag_mask 使用AWD flag宏;AWD_FAIL 中1表示屏蔽,接口内部置位对应bit。

6. 寄存器映射与位域约定

6.1 寄存器映射

adc_regs_t 的唯一定义位于 code/include/drivers/g32s10/adc/adc_regs.h。为避免文档副本与头文件字段声明漂移,本手册只维护寄存器偏移和用途:

偏移成员访问用途
0x000sr__IOADC状态寄存器。
0x004ie__IOADC中断使能。
0x008reserved_0[1]-保留。
0x00Cir__IOADC中断状态/清除寄存器。
0x010reserved_1[1]-保留。
0x014cr__IOADC控制寄存器。
0x018cfr__IOADC配置寄存器。
0x01Cclkr0__IOADC时钟寄存器0。
0x020clkr1__IOADC时钟寄存器1。
0x024clkr2__IOADC时钟寄存器2。
0x028reserved_2[1]-保留。
0x02C-0x068awd_cr[16]__IOAWD通道控制寄存器。
0x06Cawd_sr__IOAWD状态寄存器。
0x070awd_im__IOAWD中断屏蔽寄存器。
0x074reserved_3[1]-保留。
0x078awd_ir__IOAWD中断状态寄存器。
0x07Creserved_4[1]-保留。
0x080dbg_cr__IODebug控制寄存器。
0x084dbg_fsm__IDebug FSM寄存器。
0x088awd_fail__IOAWD fail输出屏蔽寄存器。
0x08C-0x0FCreserved_5[29]-保留。
0x100seq0_cr__IOSEQ0控制寄存器。
0x104seq0_cnr0__IOSEQ0通道寄存器。
0x108seq0_dcr__IOSEQ0数据控制寄存器。
0x10C-0x110seq0_dr[2]__ISEQ0 CPU数据寄存器。
0x114-0x1FCreserved_6[59]-保留。
0x200seq1_cr__IOSEQ1控制寄存器。
0x204seq1_cnr0__IOSEQ1通道寄存器0。
0x208seq1_cnr1__IOSEQ1通道寄存器1。
0x20Cseq1_dcr__IOSEQ1数据控制寄存器。
0x210seq1_fifo__ISEQ1 FIFO数据寄存器。
0x214-0x230seq1_dly[8]__IOSEQ1 rank延时寄存器。
0x234-0x250seq1_cont_cr[8]__IOSEQ1连续组控制寄存器。
0x254seq1_rcnt__IOSEQ1读计数器。
0x258seq1_dma_rcnt__ISEQ1 DMA读计数器。
0x25C-0x268seq1_dr[4]__ISEQ1 CPU数据寄存器。
0x26C-0x2FCreserved_7[37]-保留。
0x300seq2_cr__IOSEQ2控制寄存器。
0x304seq2_cnr0__IOSEQ2通道寄存器。
0x308reserved_8[1]-保留。
0x30Cseq2_dcr__IOSEQ2数据控制寄存器。
0x310seq2_fifo__ISEQ2 FIFO数据寄存器。
0x314-0x318seq2_dly[2]__IOSEQ2 rank延时寄存器。
0x31C-0x350reserved_9[14]-保留。
0x354seq2_rcnt__IOSEQ2读计数器。
0x358seq2_dma_rcnt__ISEQ2 DMA读计数器。
0x35C-0x368seq2_dr[4]__ISEQ2 CPU数据寄存器。

说明:

  • AWD_CR[16] 按寄存器空间保留16个槽位;HAL当前只开放通道0~7。

  • dbg_cr / dbg_fsm 仅保留在寄存器映射中,LL/HAL当前不对外提供debug控制接口。

  • 结构体字段的精确类型、reserved数组维度和volatile属性以头文件为准。

6.2 寄存器和位域宏

宏类别代表宏使用说明
全bit掩码ADC_MASK_ALL用于状态清除、中断关闭、全mask操作,避免直接使用 0xFFFFFFFFUL。
序列编号ADC_SEQ_0 / ADC_SEQ_1 / ADC_SEQ_2用于LL内部按序列选择 SEQ0/SEQ1/SEQ2。
触发源编码ADC_TRIGGER_SOFTWARE / ADC_TRIGGER_TCU / ADC_TRIGGER_PWM0 / ADC_TRIGGER_PWM1写入 SEQ1_CR / SEQ2_CR 的 EXTSEL 字段。
数据就绪模式ADC_DRT_SEQ_END / ADC_DRT_GROUP_END / ADC_DRT_FIFO_GE_* / ADC_DRT_CUSTOM写入 SEQn_DCR 的 DRT 字段。
packed数据解析ADC_DATA_VALUE(data) / ADC_DATA_CHANNEL(data)从 SEQn_FIFO / SEQn_DRx packed数据中提取12bit采样值和通道号。
状态寄存器bitADC_SR_*用于 ll_adc_status_get() / ll_adc_status_clear()。
中断使能bitADC_IE_*用于 ll_adc_interrupt_enable() / ll_adc_interrupt_disable()。
中断状态bitADC_IR_*用于 ll_adc_interrupt_status_get() / ll_adc_interrupt_status_clear()。
AWD通道flagADC_AWD_LOW_FLAG(channel) / ADC_AWD_HIGH_FLAG(channel)生成AWD低阈值和高阈值flag,channel范围0~7。
全局控制位域ADC_CFR_*PHY、PAD、reset、break和SOC额外周期字段。
时钟位域ADC_CLKR0_* / ADC_CLKR1_* / ADC_CLKR2_*ADC转换时钟、SEQ1连续时钟和SEQ1/SEQ2延时时钟字段。
AWD阈值位域ADC_AWD_CR_*每通道AWD低/高阈值和使能位字段。
SEQ0位域ADC_SEQ0_CR_* / ADC_SEQ0_DCR_*SEQ0长度、通道号存储、数据就绪和计数字段。
SEQ1位域ADC_SEQ1_CR_* / ADC_SEQ1_DCR_* / ADC_SEQ1_CONT_CR_*SEQ1存储mask、长度、触发、连续模式、DMA、FIFO和组配置字段。
SEQ2位域ADC_SEQ2_CR_* / ADC_SEQ2_DCR_*SEQ2存储mask、长度、触发、DMA和FIFO字段。
读计数位域ADC_RCNT_*SEQ1_RCNT / SEQ2_RCNT 的最大计数和当前计数字段。
MMIO辅助宏ADC_REG_ADDR / ADC_FIELD_VALUE / ADC_WRITE_FIELD配合 im_mmio_update_bits_32() 实现字段写入。
编码辅助宏ADC_CNT_TO_LEN / ADC_SEQ_START_MASK / ADC_SEQ_START_MASK_ALL / ADC_SEQ_RESET_MASK / ADC_SEQ_PRI_SHIFT / ADC_SEQ_FSM_SHIFT用于长度编码、序列启动/复位mask、优先级和FSM字段偏移计算。

6.3 寄存器访问约束

  • 结构体成员使用 __IO / __I 保留volatile语义,直接访问如 ADC0->sr 不会被编译器优化成普通内存访问。

  • FIFO寄存器 seq1_fifo / seq2_fifo 为读敏感寄存器,dump默认不读取,避免改变硬件FIFO状态;如需读取,由 HAL_ADC_DUMP_READ_FIFO 宏控制。

  • AWD中断总状态清除通过 ADC_IR_AWD 操作ADC总中断状态,AWD各通道flag通过 awd_sr / awd_ir 相关接口处理。

  • 当前SDK宏和结构体命名以 code/include/drivers/g32s10/adc/adc_regs.h 为准。

7. 当前实现约束与行为说明

7.1 通道和序列长度

序列最大转换次数通道范围说明
SEQ040~7软件触发,数据在 seq0_dr[2]。
SEQ180~7LL层当前开放rank 0~7,支持FIFO/DMA/连续/组连续。
SEQ280~7支持FIFO/DMA/延时扫描。

7.2 模式组合

配置项SEQ0SEQ1SEQ2
软件触发支持支持支持
TCU触发不支持支持支持
PWM0触发不支持支持支持
PWM1触发不支持支持支持
延时扫描不支持支持支持
连续转换不支持支持不支持
组连续转换不支持支持不支持
DMA不支持支持支持
FIFO不支持深度16深度16

7.3 SOC 额外周期

参数约束
soc_extra_cycle / cycle必须为 hal_adc_soc_extra_cycle_t 中定义的离散值。
有效值HAL_ADC_SOC_EXTRA_CYCLE_0/5/10/15/30/45/60/210。
修改时机SPEC要求禁止在 SEQ0/SEQ1/SEQ2 工作期间配置 SOC_EXT_CYCLE。

7.4 AWD 阈值

参数约束
channel0~7。
low_threshold0~0x0FFF。
high_threshold0~0x0FFF。
阈值关系必须 low_threshold <= high_threshold,HAL参数校验不满足时返回 IM_ERR_INVALID_PARAM。
low_flagsbit07对应通道07低阈值触发;建议使用 HAL_ADC_AWD_CHANNEL_FLAG()。
high_flagsbit07对应通道07高阈值触发;建议使用 HAL_ADC_AWD_CHANNEL_FLAG()。

7.5 DMA 注意事项

  • DMA模式只支持 SEQ1 和 SEQ2。

  • ADC HAL已接入DMA控制器,DMA request使用 ADCx_SEQy_RX,bus width为32-bit,unit size为4字节。

  • HAL_ADC_DMA_MODE_SINGLE 使用非descriptor DMA;HAL_ADC_DMA_MODE_CYCLIC 使用调用方提供的descriptor存储。

  • DMA参数统一通过 hal_adc_sequence_config() 的 dma_enable/dma_buffer/dma_len/dma_mode/dma_desc/dma_desc_count 配置,不再提供独立的ADC DMA start/stop接口。

  • 软件触发DMA统一使用 hal_adc_start() / hal_adc_start_multi();需要ADC DMA完成/错误中断时使用对应的 *_it 接口。

  • 当前DMA传输只能由统一start路径激活,因此DMA-enabled sequence必须使用软件触发;外部触发DMA当前没有公开的prepare-only启动入口。

  • cyclic模式下 dma_desc 和 dma_desc_count 必须有效,descriptor存储必须保持有效直到该sequence重新配置或ADC deinit。

  • hal_adc_stop() / hal_adc_stop_multi() 只停止当前DMA并保留配置,可直接再次start;重新配置同一sequence或deinit才释放DMA配置。

  • DMA启动前HAL维护目标buffer cache,DMA完成中断中再次维护一次,停止路径(stop/deinit/重新配置)再维护一次,因此 stop 返回后可直接读取目标 buffer;DMA active 期间调用方不得写入该buffer,读取也可能读到部分更新的数据。

  • SEQn_DMA_RCNT 可通过 hal_adc_dma_read_counter_get() 读取,软件可比较前后两次计数值判断进度;有效长度换算需要结合硬件计数单位并处理回绕。

7.6 实现约束

  • LL层只做寄存器访问封装,公开接口均为 static inline,不依赖RTOS、不申请内存、不调用DMA驱动。

  • HAL层当前依赖公共错误码、参数检查、日志组件、微秒时间基准、cache维护接口和DMA HAL;IRQ入口由BSP ISR调用。

  • hal_adc_irq_handler() 先读取一次 ADC_IR 快照并处理错误;DMA完成flag在cache处理和回调前单独清除,其余已处理flag在本次IRQ末尾统一清除。

  • 高频采样场景应优先使用 SEQ1/SEQ2 + DMA,避免CPU读取FIFO过慢导致 DATA_OVR;或者CPU模式下直接读取对应序列的数据寄存器。

7.7 状态迁移、错误锁存与恢复

HAL 运行状态是软件状态,活动序列则由 active_sequence_mask 单独跟踪。主要变化如下:

操作或事件state 变化active_sequence_maskerror_code
hal_adc_handle_init()RESET清零清零
hal_adc_init()READY清零清零
hal_adc_start*() 在正常READY路径成功启动BUSY置位所选序列通常保持;DMA启动失败时锁存 HAL_ADC_ERROR_DMA
轮询成功无其他活动序列时为 READY,否则为 BUSY清除目标序列保持
轮询超时TIMEOUT目标序列可能仍为活动锁存 HAL_ADC_ERROR_EOC_TIMEOUT
轮询或IRQ检测到硬件错误ERROR清零锁存对应错误位
从 TIMEOUT 调用stop无其他活动序列时回到 READY,否则为 BUSY清除被停止序列历史错误保持
从 ERROR 调用stop保持 ERROR清除被停止序列历史错误保持
hal_adc_deinit()RESET清零清零

恢复说明:

  • TIMEOUT 后应停止或重新配置目标序列;此后可以再次启动,但 HAL_ADC_ERROR_EOC_TIMEOUT 会保留在 error_code 中。

  • 硬件错误进入 ERROR 后,当前公开接口没有单独清除错误状态的 API。完整恢复路径为 hal_adc_deinit()、hal_adc_handle_init()、重新设置配置并调用 hal_adc_init()。

  • hal_adc_start*() 当前不会单独拒绝 ERROR 状态;应用不应依赖start接口完成错误恢复,必须先执行上述恢复流程。

  • hal_adc_error_get() 只读取锁存值,不清除错误历史。

  • DMA-enabled sequence 应通过DMA完成回调或相应等待逻辑判断传输结束。hal_adc_poll_for_conversion() 只观察sequence数据就绪状态,不替代DMA停止或完成处理。

7.8 配置修改时机与资源所有权

HAL 不会在所有配置接口中统一检查“所有序列均已停止”。调用方必须根据下表保证时序:

接口或资源HAL 当前检查调用方责任
hal_adc_sequence_config()检查目标sequence的HAL active、DMA active和硬件busy状态仅在该sequence空闲时重新配置。
hal_adc_start() / hal_adc_start_multi()检查目标sequence active、硬件busy、软件触发和DMA状态不应重复启动仍在活动的sequence。
hal_adc_clock_config()只校验分频范围,不检查序列忙状态在修改ADC转换/延时时钟前停止所有相关序列。
hal_adc_priority_config()只校验优先级和break参数,不检查序列忙状态在修改抢占配置前停止所有相关序列。
hal_adc_soc_extra_cycle_config()校验离散编码,不检查序列忙状态SPEC要求任一序列运行期间不得修改 SOC_EXT_CYCLE。
ll_adc_soc_extra_cycle_set()不校验编码和序列忙状态调用方只能传入合法离散编码,并保证所有序列已停止。
hal_adc_sequence_unstorage_config()不检查目标sequence是否活动先停止目标SEQ1/SEQ2,再修改storage mask。
dma_buffer / dma_desc配置阶段校验地址、长度、对齐和descriptor约束存储始终由调用方持有,生命周期必须覆盖DMA配置、运行和停止阶段。
IRQ_SADC0 / IRQ_SADC1HAL只处理ADC寄存器中断PLIC、CPU中断入口/退出和IRQ生命周期由BSP或中断框架负责。

7.9 回调与中断上下文

  • hal_adc_irq_handler() 由BSP ISR调用,注册的sequence完成、DMA完成、AWD和error回调可能运行在ADC IRQ 上下文。

  • 回调不得阻塞、睡眠、等待互斥锁或执行重日志;耗时处理应转交任务上下文。

  • DMA完成flag在回调前清除,目标buffer在回调前执行cache invalidate;single DMA完成后HAL清除对应active状态,cyclic DMA保持active直到显式stop。

  • AWD回调中的 low_flags / high_flags 已解码到bit7:0,分别对应通道0~7。

  • 调用方需要通过 hadc->user_data 传递业务上下文,HAL不会解释该指针。

8. 示例程序与使用方式

8.1 示例程序索引与接入方式

ADC示例只位于 code/examples。这些文件不会自动编译进主固件,应用需要将选定的 .c 文件显式加入自身构建目标;示例用于说明调用方式,不属于与HAL/LL同等级的稳定二进制接口。

示例层级调用入口覆盖内容
adc_polling_example.cHALexample_adc_sample_run()、example_adc_sample_run_on()单通道采样、SEQ0/SEQ1/SEQ2轮询、多序列启动。
hal_adc_dma_example.cHALexample_hal_adc_dma_run()SEQ1/SEQ2循环DMA、ADC DMA完成中断和回调。
hal_adc_dma_loop_example.cHALexample_hal_adc_dma_loop_run()、example_hal_adc_dma_loop_soak_get_default_config()、example_hal_adc_dma_loop_soak_run()多轮DMA、停止后重启和长时间运行观察;SADC时钟由调用方配置。
tcu_trig_adc_example.cHALexample_tcu_trig_adc0_run()、example_tcu_trig_adc1_run()SEQ1 TCU外部触发,TCU channel 0 HALF/FULL输出分别触发ADC0/ADC1。
adc_seq_example.cLLexample_adc_seq_sample_run()直接配置寄存器,完成SEQ0/SEQ1/SEQ2软件触发轮询和寄存器dump。

接入方式:

  1. HAL示例需要包含 hal_adc.h 并启用 CONFIG_DRIVER_ADC;再按示例实际使用的功能启用GPIO、TCU、IRQ等驱动。CONFIG_DRIVER_ADC 会自动选择 CONFIG_DRIVER_DMA;示例本身不调用CPM HAL,SADC时钟由调用方准备。

  2. LL示例需要包含 ll_adc.h,不需要链接ADC HAL。

  3. 示例未提供独立公共头文件时,应用应显式把示例 .c 加入构建目标,并在应用侧声明需要调用的入口函数;不要同时编译和包含同一个 .c 文件,避免重复定义。

  4. 调用示例前完成2.1节中的时钟、引脚、IRQ、systick和模拟信号准备。不同示例覆盖的前置条件不同,以各文件头部说明为准。

本文列出的 ADC HAL/LL 示例都不配置CPM,SADC源时钟和门控由板级代码或调用方预先建立;示例中的GPIO配置只负责把目标GPIOC引脚切到function 0。

8.2 单通道轮询采样

hal_adc_handle_t hadc0;
uint32_t value;
error_code_t ret;

ret = hal_adc_handle_init(&hadc0, ADC0);
if (ret != IM_OK) {
    return ret;
}

hadc0.init.adc_clk_div = 2U;
hadc0.init.soc_extra_cycle = (uint8_t)HAL_ADC_SOC_EXTRA_CYCLE_0;
ret = hal_adc_init(&hadc0);
if (ret != IM_OK) {
    return ret;
}

ret = hal_adc_channel_value_get(&hadc0, 0U, &value, 1000000U);

8.3 SEQ1 多通道扫描中断模式

static void adc_seq1_done(hal_adc_handle_t *hadc)
{
    hal_adc_data_t data[8];

    (void)hal_adc_data_get(hadc, HAL_ADC_SEQUENCE_1, data, 8U);
}

hal_adc_sequence_config_t config = {0};

config.sequence = HAL_ADC_SEQUENCE_1;
config.trigger = HAL_ADC_TRIGGER_SOFTWARE;
config.data_ready_type = HAL_ADC_DRT_SEQUENCE_END;
config.channel_number_enable = 1U;
config.channel_count = 4U;
config.channel[0] = 0U;
config.channel[1] = 2U;
config.channel[2] = 5U;
config.channel[3] = 6U;
config.storage_mask = 0x0FU;
config.dma_enable = 0U;
config.continuous_enable = 0U;

hal_adc_sequence_config(&hadc0, &config);
hal_adc_callback_register(&hadc0, HAL_ADC_CALLBACK_SEQ1_COMPLETE, adc_seq1_done);
hal_adc_start_it(&hadc0, HAL_ADC_SEQUENCE_1);

8.4 SEQ1 连续组与 TCU 外部触发

hal_adc_sequence_config_t config = {0};

config.sequence = HAL_ADC_SEQUENCE_1;
config.trigger = HAL_ADC_TRIGGER_TCU;
config.data_ready_type = HAL_ADC_DRT_GROUP_END;
config.channel_number_enable = 1U;
config.channel_count = 8U;
config.continuous_enable = 1U;
config.group_count = 2U;
config.group_length[0] = 4U;
config.group_interval[0] = 100U;
config.group_length[1] = 4U;
config.group_interval[1] = 100U;

hal_adc_sequence_config(&hadc0, &config);

/* TCU/PWM外部触发模式不调用 hal_adc_start();由外部触发源启动转换。 */

该片段省略了 channel[0..7] 的有效通道填充;实际配置必须为每个转换rank提供合法通道号。

本段只展示ADC侧配置。完整的TCU时钟、比较值和 HAL_ADC_TRIGGER_TCU 路由见tcu_trig_adc_example.c。

8.5 SEQ2 DMA 采样

static uint32_t adc_dma_buffer[256];
hal_adc_sequence_config_t config = {0};

static void adc_seq2_dma_done(hal_adc_handle_t *hadc)
{
    (void)hadc;
    /* adc_dma_buffer中保存本次DMA采样结果。 */
}

config.sequence = HAL_ADC_SEQUENCE_2;
config.trigger = HAL_ADC_TRIGGER_SOFTWARE;
config.data_ready_type = HAL_ADC_DRT_SEQUENCE_END;
config.channel_number_enable = 1U;
config.channel_count = 4U;
config.channel[0] = 0U;
config.channel[1] = 1U;
config.channel[2] = 2U;
config.channel[3] = 3U;
config.storage_mask = 0x0FU;
config.dma_enable = 1U;
config.dma_buffer = adc_dma_buffer;
config.dma_len = sizeof(adc_dma_buffer);
config.dma_mode = HAL_ADC_DMA_MODE_SINGLE;
config.dma_desc = NULL;
config.dma_desc_count = 0U;

hal_adc_sequence_config(&hadc0, &config);
hal_adc_callback_register(&hadc0,
                          HAL_ADC_CALLBACK_SEQ2_DMA_COMPLETE,
                          adc_seq2_dma_done);

/* start_it先配置DMA完成/错误中断,再由统一start路径启动DMA和ADC。 */
hal_adc_start_it(&hadc0, HAL_ADC_SEQUENCE_2);

单次SEQ1/SEQ2 DMA及中断流程见hal_adc_dma_example.c,多轮停止再启动和CPM时钟配置见hal_adc_dma_loop_example.c。

8.6 AWD 高低阈值检测

hal_adc_awd_config_t awd_config = {0};
uint32_t low_flags;
uint32_t high_flags;

awd_config.channel = 0U;
awd_config.low_threshold = 0x100U;
awd_config.high_threshold = 0xE00U;
awd_config.low_threshold_enable = 1U;
awd_config.high_threshold_enable = 1U;
awd_config.interrupt_enable = 1U;
awd_config.fail_enable = 1U;

hal_adc_awd_config(&hadc0, &awd_config);
hal_adc_awd_status_get(&hadc0, &low_flags, &high_flags);
hal_adc_awd_status_clear(&hadc0,
                         HAL_ADC_AWD_CHANNEL_FLAG(0U),
                         HAL_ADC_AWD_CHANNEL_FLAG(0U));

8.7 LL 寄存器级序列采样

adc_seq_example.c 的入口为example_adc_seq_sample_run()。该示例不链接ADC HAL,直接完成GPIO功能配置、PHY初始化、 时钟/优先级配置、SEQ0/SEQ1/SEQ2软件触发、状态轮询、packed数据解析和寄存器dump,适合用于确认 “HAL问题还是寄存器配置问题”。