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 *adcxadc_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 IRQ | PLIC/中断框架 | 使用 *_it() 或 DMA 完成中断时,应用必须注册并使能 IRQ_SADC0 或 IRQ_SADC1,中断服务程序调用 hal_adc_irq_handler()。 |
| systick 时间基准 | 应用/OS | hal_adc_poll_for_conversion() 以及使用微秒/毫秒超时的应用代码依赖 SDK systick。 |
| DMA 控制器 | CPM/DMA HAL | DMA 模式需要 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_TCU | TCU触发 | 只选择TCU触发源,不配置TCU通道。 |
ADC_TRIGGER_PWM0 / ADC_TRIGGER_PWM1 | PWM触发 | 选择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_16 | FIFO水线数据就绪 | 用于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低阈值flag | channel 范围为0~7。 |
ADC_AWD_HIGH_FLAG(channel) | AWD高阈值flag | channel 范围为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实例。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | const 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位寄存器。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
offset | uint32_t | 输入 | 32位对齐的寄存器字节偏移 |
value | uint32_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位寄存器。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
offset | uint32_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上电。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_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下电。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_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输入选择。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_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输入选择。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_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。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_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。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_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来源。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
eoc_source | uint8_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);
功能说明: 允许高优先级序列打断低优先级序列。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
返回值表:
| 返回值 | 说明 |
|---|---|
| 无 | 接口不返回状态码 |
补充说明:
参数约束:
adcx为ADC实例。
5.4.9 ll_adc_break_disable
static inline void ll_adc_break_disable(adc_regs_t *adcx);
功能说明: 禁止冲突处理打断正在运行的序列。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_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额外高电平周期。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
cycle | uint8_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转换时钟分频。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
adc_clk_div | uint8_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转换时钟分频字段。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
返回值表:
| 返回值 | 说明 |
|---|---|
uint32_t | ADC_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连续转换间隔时钟分频。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
div | uint32_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延时计数时钟分频。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
div | uint32_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延时计数时钟分频。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
div | uint32_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状态寄存器。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
返回值表:
| 返回值 | 说明 |
|---|---|
uint32_t | ADC_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状态位。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
flag_mask | uint32_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中断源。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
interrupt_mask | uint32_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中断源。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
interrupt_mask | uint32_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中断状态寄存器。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
返回值表:
| 返回值 | 说明 |
|---|---|
uint32_t | ADC_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中断状态位。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
interrupt_mask | uint32_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);
功能说明: 配置单个序列优先级。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
adc_seq | uint8_t | 输入 | 序列号,使用 ADC_SEQ_0/1/2 |
priority | uint8_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);
功能说明: 读取单个序列优先级。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
adc_seq | uint8_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转换序列。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
adc_seq | uint8_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转换序列。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
seq_mask | uint32_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);
功能说明: 复位单个序列状态机。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
adc_seq | uint8_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状态。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
adc_seq | uint8_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转换通道列表。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
channel | const uint8_t * | 输入 | ADC通道号,范围0~7 |
channel_count | uint8_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转换次数。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
channel_count | uint8_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结果携带通道号。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_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结果携带通道号。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_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数据就绪方式。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
data_ready_type | uint8_t | 输入 | 数据就绪类型,使用对应序列支持的 ADC_DRT_* 值 |
custom_mask | uint8_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已采样数据数量。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_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原始数据寄存器。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
reg_index | uint8_t | 输入 | CPU数据寄存器索引,SEQ0范围0~1,SEQ1/SEQ2范围0~33 |
返回值表:
| 返回值 | 说明 |
|---|---|
uint32_t | packed原始寄存器值。 |
补充说明:
参数约束:
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结果。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
rank | uint8_t | 输入 | 目标rank,SEQ0范围0~3,SEQ1/SEQ2范围0~77 |
返回值表:
| 返回值 | 说明 |
|---|---|
uint32_t | packed采样结果。 |
补充说明:
参数约束:
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转换通道列表。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
channel | const uint8_t * | 输入 | ADC通道号,范围0~7 |
channel_count | uint8_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转换次数。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
channel_count | uint8_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触发源。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
trigger | uint8_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结果携带通道号。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_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结果携带通道号。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_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。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
storage_mask | uint8_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数据就绪触发方式。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
data_ready_type | uint8_t | 输入 | 数据就绪类型,使用对应序列支持的 ADC_DRT_* 值 |
custom_mask | uint8_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模式。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_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模式。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_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数据数量。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
返回值表:
| 返回值 | 说明 |
|---|---|
uint32_t | FIFO计数字段值。 |
补充说明:
参数约束:
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数据寄存器。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
返回值表:
| 返回值 | 说明 |
|---|---|
uint32_t | packed采样结果。 |
补充说明:
参数约束:读取可能弹出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延时。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
rank | uint8_t | 输入 | 目标rank,SEQ0范围0~3,SEQ1/SEQ2范围0~77 |
delay_count | uint16_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连续转换模式。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_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连续转换模式。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_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连续组数量。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
group_count | uint8_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连续组长度和间隔。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
group_index | uint8_t | 输入 | SEQ1连续组索引,范围0~7 |
group_length | uint8_t | 输入 | SEQ1当前组长度,范围1~8,接口内部写入 group_length - 1 |
group_interval | uint16_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读计数器最大值和当前值。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
max | uint16_t | 输入 | 读计数器最大值,范围0~0xFFFF |
cnt | uint16_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读计数器寄存器。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
返回值表:
| 返回值 | 说明 |
|---|---|
uint32_t | SEQ1_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读计数器。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
返回值表:
| 返回值 | 说明 |
|---|---|
uint32_t | SEQ1_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数据寄存器。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
reg_index | uint8_t | 输入 | CPU数据寄存器索引,SEQ0范围0~1,SEQ1/SEQ2范围0~33 |
返回值表:
| 返回值 | 说明 |
|---|---|
uint32_t | packed原始寄存器值。 |
补充说明:
参数约束:
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结果。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
rank | uint8_t | 输入 | 目标rank,SEQ0范围0~3,SEQ1/SEQ2范围0~77 |
返回值表:
| 返回值 | 说明 |
|---|---|
uint32_t | packed采样结果。 |
补充说明:
参数约束:
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转换通道列表。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
channel | const uint8_t * | 输入 | ADC通道号,范围0~7 |
channel_count | uint8_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转换次数。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
channel_count | uint8_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触发源。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
trigger | uint8_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结果携带通道号。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_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结果携带通道号。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_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。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
storage_mask | uint8_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数据就绪触发方式。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
data_ready_type | uint8_t | 输入 | 数据就绪类型,使用对应序列支持的 ADC_DRT_* 值 |
custom_mask | uint8_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模式。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_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模式。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_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数据数量。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
返回值表:
| 返回值 | 说明 |
|---|---|
uint32_t | FIFO计数字段值。 |
补充说明:
参数约束:
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数据寄存器。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
返回值表:
| 返回值 | 说明 |
|---|---|
uint32_t | packed采样结果。 |
补充说明:
参数约束:读取可能弹出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延时。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
rank | uint8_t | 输入 | 目标rank,SEQ0范围0~3,SEQ1/SEQ2范围0~77 |
delay_count | uint8_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读计数器最大值和当前值。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
max | uint16_t | 输入 | 读计数器最大值,范围0~0xFFFF |
cnt | uint16_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读计数器寄存器。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
返回值表:
| 返回值 | 说明 |
|---|---|
uint32_t | SEQ2_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读计数器。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
返回值表:
| 返回值 | 说明 |
|---|---|
uint32_t | SEQ2_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数据寄存器。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
reg_index | uint8_t | 输入 | CPU数据寄存器索引,SEQ0范围0~1,SEQ1/SEQ2范围0~33 |
返回值表:
| 返回值 | 说明 |
|---|---|
uint32_t | packed原始寄存器值。 |
补充说明:
参数约束:
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结果。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
rank | uint8_t | 输入 | 目标rank,SEQ0范围0~3,SEQ1/SEQ2范围0~77 |
返回值表:
| 返回值 | 说明 |
|---|---|
uint32_t | packed采样结果。 |
补充说明:
参数约束:
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低/高阈值。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
channel | uint8_t | 输入 | ADC通道号,范围0~7 |
low_threshold | uint16_t | 输入 | AWD低阈值,范围0~`ADC_THRESHOLD_MAX` |
high_threshold | uint16_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);
功能说明: 使能指定通道低阈值检测。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
channel | uint8_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);
功能说明: 关闭指定通道低阈值检测。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
channel | uint8_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);
功能说明: 使能指定通道高阈值检测。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
channel | uint8_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);
功能说明: 关闭指定通道高阈值检测。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
channel | uint8_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。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
返回值表:
| 返回值 | 说明 |
|---|---|
uint32_t | ADC_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。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
awd_flag_mask | uint32_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。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
awd_flag_mask | uint32_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。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
awd_flag_mask | uint32_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。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
返回值表:
| 返回值 | 说明 |
|---|---|
uint32_t | ADC_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。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
awd_flag_mask | uint32_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。
参数表:
| 参数 | 类型 | 方向 | 说明 |
|---|---|---|---|
adcx | adc_regs_t * | 输入 | ADC寄存器基地址 |
awd_flag_mask | uint32_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。为避免文档副本与头文件字段声明漂移,本手册只维护寄存器偏移和用途:
| 偏移 | 成员 | 访问 | 用途 |
|---|---|---|---|
0x000 | sr | __IO | ADC状态寄存器。 |
0x004 | ie | __IO | ADC中断使能。 |
0x008 | reserved_0[1] | - | 保留。 |
0x00C | ir | __IO | ADC中断状态/清除寄存器。 |
0x010 | reserved_1[1] | - | 保留。 |
0x014 | cr | __IO | ADC控制寄存器。 |
0x018 | cfr | __IO | ADC配置寄存器。 |
0x01C | clkr0 | __IO | ADC时钟寄存器0。 |
0x020 | clkr1 | __IO | ADC时钟寄存器1。 |
0x024 | clkr2 | __IO | ADC时钟寄存器2。 |
0x028 | reserved_2[1] | - | 保留。 |
0x02C-0x068 | awd_cr[16] | __IO | AWD通道控制寄存器。 |
0x06C | awd_sr | __IO | AWD状态寄存器。 |
0x070 | awd_im | __IO | AWD中断屏蔽寄存器。 |
0x074 | reserved_3[1] | - | 保留。 |
0x078 | awd_ir | __IO | AWD中断状态寄存器。 |
0x07C | reserved_4[1] | - | 保留。 |
0x080 | dbg_cr | __IO | Debug控制寄存器。 |
0x084 | dbg_fsm | __I | Debug FSM寄存器。 |
0x088 | awd_fail | __IO | AWD fail输出屏蔽寄存器。 |
0x08C-0x0FC | reserved_5[29] | - | 保留。 |
0x100 | seq0_cr | __IO | SEQ0控制寄存器。 |
0x104 | seq0_cnr0 | __IO | SEQ0通道寄存器。 |
0x108 | seq0_dcr | __IO | SEQ0数据控制寄存器。 |
0x10C-0x110 | seq0_dr[2] | __I | SEQ0 CPU数据寄存器。 |
0x114-0x1FC | reserved_6[59] | - | 保留。 |
0x200 | seq1_cr | __IO | SEQ1控制寄存器。 |
0x204 | seq1_cnr0 | __IO | SEQ1通道寄存器0。 |
0x208 | seq1_cnr1 | __IO | SEQ1通道寄存器1。 |
0x20C | seq1_dcr | __IO | SEQ1数据控制寄存器。 |
0x210 | seq1_fifo | __I | SEQ1 FIFO数据寄存器。 |
0x214-0x230 | seq1_dly[8] | __IO | SEQ1 rank延时寄存器。 |
0x234-0x250 | seq1_cont_cr[8] | __IO | SEQ1连续组控制寄存器。 |
0x254 | seq1_rcnt | __IO | SEQ1读计数器。 |
0x258 | seq1_dma_rcnt | __I | SEQ1 DMA读计数器。 |
0x25C-0x268 | seq1_dr[4] | __I | SEQ1 CPU数据寄存器。 |
0x26C-0x2FC | reserved_7[37] | - | 保留。 |
0x300 | seq2_cr | __IO | SEQ2控制寄存器。 |
0x304 | seq2_cnr0 | __IO | SEQ2通道寄存器。 |
0x308 | reserved_8[1] | - | 保留。 |
0x30C | seq2_dcr | __IO | SEQ2数据控制寄存器。 |
0x310 | seq2_fifo | __I | SEQ2 FIFO数据寄存器。 |
0x314-0x318 | seq2_dly[2] | __IO | SEQ2 rank延时寄存器。 |
0x31C-0x350 | reserved_9[14] | - | 保留。 |
0x354 | seq2_rcnt | __IO | SEQ2读计数器。 |
0x358 | seq2_dma_rcnt | __I | SEQ2 DMA读计数器。 |
0x35C-0x368 | seq2_dr[4] | __I | SEQ2 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采样值和通道号。 |
| 状态寄存器bit | ADC_SR_* | 用于 ll_adc_status_get() / ll_adc_status_clear()。 |
| 中断使能bit | ADC_IE_* | 用于 ll_adc_interrupt_enable() / ll_adc_interrupt_disable()。 |
| 中断状态bit | ADC_IR_* | 用于 ll_adc_interrupt_status_get() / ll_adc_interrupt_status_clear()。 |
| AWD通道flag | ADC_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 通道和序列长度
| 序列 | 最大转换次数 | 通道范围 | 说明 |
|---|---|---|---|
SEQ0 | 4 | 0~7 | 软件触发,数据在 seq0_dr[2]。 |
SEQ1 | 8 | 0~7 | LL层当前开放rank 0~7,支持FIFO/DMA/连续/组连续。 |
SEQ2 | 8 | 0~7 | 支持FIFO/DMA/延时扫描。 |
7.2 模式组合
| 配置项 | SEQ0 | SEQ1 | SEQ2 |
|---|---|---|---|
| 软件触发 | 支持 | 支持 | 支持 |
| 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 阈值
| 参数 | 约束 |
|---|---|
channel | 0~7。 |
low_threshold | 0~0x0FFF。 |
high_threshold | 0~0x0FFF。 |
| 阈值关系 | 必须 low_threshold <= high_threshold,HAL参数校验不满足时返回 IM_ERR_INVALID_PARAM。 |
low_flags | bit07对应通道07低阈值触发;建议使用 HAL_ADC_AWD_CHANNEL_FLAG()。 |
high_flags | bit07对应通道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_mask | error_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_SADC1 | HAL只处理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.c | HAL | example_adc_sample_run()、example_adc_sample_run_on() | 单通道采样、SEQ0/SEQ1/SEQ2轮询、多序列启动。 |
hal_adc_dma_example.c | HAL | example_hal_adc_dma_run() | SEQ1/SEQ2循环DMA、ADC DMA完成中断和回调。 |
hal_adc_dma_loop_example.c | HAL | example_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.c | HAL | example_tcu_trig_adc0_run()、example_tcu_trig_adc1_run() | SEQ1 TCU外部触发,TCU channel 0 HALF/FULL输出分别触发ADC0/ADC1。 |
adc_seq_example.c | LL | example_adc_seq_sample_run() | 直接配置寄存器,完成SEQ0/SEQ1/SEQ2软件触发轮询和寄存器dump。 |
接入方式:
HAL示例需要包含
hal_adc.h并启用CONFIG_DRIVER_ADC;再按示例实际使用的功能启用GPIO、TCU、IRQ等驱动。CONFIG_DRIVER_ADC会自动选择CONFIG_DRIVER_DMA;示例本身不调用CPM HAL,SADC时钟由调用方准备。LL示例需要包含
ll_adc.h,不需要链接ADC HAL。示例未提供独立公共头文件时,应用应显式把示例
.c加入构建目标,并在应用侧声明需要调用的入口函数;不要同时编译和包含同一个.c文件,避免重复定义。调用示例前完成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问题还是寄存器配置问题”。