5.13 OPAMP 使用说明
本章说明 N32G033 标准外设库中 OPAMP 驱动的文件组成、10 个公开函数,以及 PGA 1 个示例。内部运算放大器的四种工作模式、增益档位与输入引脚映射请配合用户手册的“运算放大器(OPAMP)”章节阅读,芯片已知问题以勘误手册为准。
5.13.1 相关文件
| 相对路径 | 作用 |
|---|---|
firmware/n32g033_std_periph_driver/inc/n32g033_opamp.h |
定义 OPAMP_InitType 结构体与工作模式、增益、VP/VM 输入选择、参考电压、锁定等宏,并按复位与初始化、内部缓冲与增益、输入选择与锁定、参考电压四个区段声明 10 个公开函数 |
firmware/n32g033_std_periph_driver/src/n32g033_opamp.c |
实现上述 10 个函数:OPAMP 复位、结构体默认值与初始化、使能与内部缓冲、增益与输入选择、参考电压选择与锁定 |
projects/n32g033_EVAL/examples/OPAMP/ |
OPAMP 示例根目录,含 PGA 1 个示例 |
projects/n32g033_EVAL/examples/OPAMP/PGA/ |
该示例的工程目录组成:MDK-ARM/、EWARM/、inc/、src/、readme.txt |
5.13.2 API 参考
以下 10 个公开函数按 n32g033_opamp.h 的声明顺序分为 4 组;每个条目给出功能摘要与 n32g033_opamp.c 中该函数正上方的注释原文。
复位与初始化
OPAMP_DeInit、OPAMP_StructInit、OPAMP_Init、OPAMP_Enable
内部缓冲与增益
OPAMP_EnableInterBufferMode、OPAMP_SetPgaGain
输入选择与锁定
OPAMP1_SetVpSel、OPAMP1_SetVmSel、OPAMP_SetLock
参考电压选择
OPAMP_VREFPSel
void OPAMP_DeInit(void)复位 OPAMP 寄存器。
name OPAMP_DeInit.
fun Reset the OPAMP registers.
return none
void OPAMP_StructInit(OPAMP_InitType* OPAMP_InitStruct)用默认值填充 OPAMP_InitStruct 的各个成员。
name OPAMP_StructInit.
fun Fills each OPAMP_initstruct member with its default value.
param OPAMP_initstruct :
- Gain
- Mode
- OPAMP1_Vpsel
- OPAMP1_Vmsel
return none
void OPAMP_Init(OPAMPX OPAMPx, OPAMP_InitType* OPAMP_InitStruct)按 OPAMP_InitStruct 初始化指定的 OPAMP。
name OPAMP_Init.
fun Initializes the OPAMP according to OPAMP_InitStruct.
param OPAMPX :
- OPAMP1
- OPAMP2
- OPAMP3
param OPAMP_InitStruct :
- Mode :just vailed For OPAMP1
- OPAMP1_CS_MODE_EXT_OPA
- OPAMP1_CS_MODE_DIFF_PGA
- OPAMP1_CS_MODE_INTER_PGA
- OPAMP1_CS_MODE_BUFF_EN
- Mode :just vailed For OPAMP2/3
- OPAMP23_CS_MODE_DISBALE
- OPAMP23_CS_MODE_BUFF_EN
param - VpSel : just vailed For OPA1
- OPAMP1_CS_VPSEL_PF0
- OPAMP1_CS_VPSEL_PA0
- OPAMP1_CS_VPSEL_PA1
- OPAMP1_CS_VPSEL_PA4
- OPAMP1_CS_VPSEL_PA7
- OPAMP1_CS_VPSEL_PB0
- VmSel : just vailed For OPA1
- OPAMP1_CS_VMSEL_PF1
- OPAMP1_CS_VMSEL_PA2
- OPAMP1_CS_VMSEL_PA5
- OPAMP1_CS_VMSEL_PB1
- OPAMP1_CS_VMSEL_PB2
- Gain : just vailed For OPAMP1
- OPAMP1_CS_PGA_GAIN_2_DIFF_1
- OPAMP1_CS_PGA_GAIN_4_DIFF_2
- OPAMP1_CS_PGA_GAIN_8_DIFF_4
- OPAMP1_CS_PGA_GAIN_16_DIFF_8
- OPAMP1_CS_PGA_GAIN_32_DIFF_16
- OPAMP1_CS_PGA_GAIN_xx_DIFF_32
- Gain : just vailed For OPAMP2/3
- OPAMP23_CS_PGA_GAIN_DIFF_1
- OPAMP23_CS_PGA_GAIN_DIFF_2
- OPAMP23_CS_PGA_GAIN_DIFF_4
- OPAMP23_CS_PGA_GAIN_DIFF_8
- OPAMP23_CS_PGA_GAIN_DIFF_16
return none
void OPAMP_Enable(OPAMPX OPAMPx, FunctionalState Cmd)使能或关闭指定的 OPAMP。
name OPAMP_Enable.
fun Enable or disable opampx .
param OPAMPX :
- OPAMP1
- OPAMP2
- OPAMP3
param Cmd :
- ENABLE
- DISABLE
return none
void OPAMP_EnableInterBufferMode(OPAMPX OPAMPx, FunctionalState Cmd)使能或关闭 OPAMP2、OPAMP3 的内部缓冲模式。
name OPAMP_EnableInterBufferMode.
fun Enable or disable opampx internal buffer mode .
param OPAMPX :
- OPAMP2
- OPAMP3
param Cmd :
- ENABLE
- DISABLE
return none
note OPA2 and OPA3 support this function.
void OPAMP_SetPgaGain(OPAMPX OPAMPx, uint32_t Gain)设置指定 OPAMP 的 PGA 增益档位。
name OPAMP_SetPgaGain.
fun Set opampx gain value selection
param OPAMPX :
- OPAMP1
- OPAMP2
- OPAMP3
param Gain :
- OPAMP1
- OPAMP1_CS_PGA_GAIN_2_DIFF_1
- OPAMP1_CS_PGA_GAIN_4_DIFF_2
- OPAMP1_CS_PGA_GAIN_8_DIFF_4
- OPAMP1_CS_PGA_GAIN_16_DIFF_8
- OPAMP1_CS_PGA_GAIN_32_DIFF_16
- OPAMP1_CS_PGA_GAIN_xx_DIFF_32
- OPAMP2/3
- OPAMP23_CS_PGA_GAIN_DIFF_1
- OPAMP23_CS_PGA_GAIN_DIFF_2
- OPAMP23_CS_PGA_GAIN_DIFF_4
- OPAMP23_CS_PGA_GAIN_DIFF_8
- OPAMP23_CS_PGA_GAIN_DIFF_16
return none
void OPAMP1_SetVpSel(uint32_t VpSel)选择 OPAMP1 的同相输入端(VP)。
name OPAMP1_SetVpSel.
fun Set opamp1 VP selection
param VpSel :
- OPAMP1_CS_VPSEL_PF0
- OPAMP1_CS_VPSEL_PA0
- OPAMP1_CS_VPSEL_PA1
- OPAMP1_CS_VPSEL_PA4
- OPAMP1_CS_VPSEL_PA7
- OPAMP1_CS_VPSEL_PB0
return none
void OPAMP1_SetVmSel(uint32_t VmSel)选择 OPAMP1 的反相输入端(VM)。
name OPAMP1_SetVmSel.
fun Set opamp1 Vm selection
param VmSel :
- OPAMP1_CS_VMSEL_PF1
- OPAMP1_CS_VMSEL_PA2
- OPAMP1_CS_VMSEL_PA5
- OPAMP1_CS_VMSEL_PB1
- OPAMP1_CS_VMSEL_PB2
return none
void OPAMP_SetLock(uint32_t Lock)设置 OPAMP 写保护锁定。
name OPAMP_SetLock.
fun Set opamp lock
param Lock :
- OPAMP_LOCK
return none
void OPAMP_VREFPSel(OPAMPX OPAMPx, uint32_t VrefSel)设置指定 OPAMP 的参考电压 VREFP。
name OPAMP_VREFPSel.
fun Set opampx vrefp selection
param OPAMPX :
- OPAMP1
- OPAMP2
- OPAMP3
param VrefSel :
- OPAMP_VREFP_SEL_0_9V
- OPAMP_VREFP_SEL_1_8VDD
- OPAMP_VREFP_SEL_1_4VDD
return none
5.13.3 Demo 示例说明
本节说明 OPAMP 的 1 个示例:PGA 把 OPAMP1 配成内部 PGA 模式,对 PA0 的同相输入电压做 2 倍放大,放大结果由 PA6 输出。
5.13.3.1 PGA 内部 PGA 增益放大
工程目录: projects/n32g033_EVAL/examples/OPAMP/PGA/
使能 GPIO 与 OPA 时钟→配置 PA0、PA6 为模拟输入→用结构体把 OPAMP1 配成内部 PGA 模式并设 2 倍增益→使能 OPAMP1 后由 PA6 输出放大结果
| 项目 | 源码解读 |
|---|---|
| 功能 | 把 OPAMP1 配成内部 PGA 模式,以 PA0 为同相输入、PA6 为输出,对输入电压做 2 倍放大。 |
| 源码组成 | src/main.c 含 RCC_Configuration、GPIO_Configuration、OPAMP_Configuration;src/n32g033_it.c 与 inc/n32g033_it.h 为中断函数;inc/main.h 给出声明;readme.txt 给出配置与测试步骤;工程文件在 MDK-ARM/ 与 EWARM/。 |
| 关键配置 | 引脚:PA0 为 OPA1 同相输入、PA6 为 OPA1 输出,均为模拟功能; 模式: OPAMP1_CS_MODE_INTER_PGA(内部 PGA);增益: OPAMP1_CS_PGA_GAIN_2_DIFF_1(2 倍);时钟:系统时钟 64 MHz。 |
| 程序与数据路径 | main → RCC_Configuration 打开 GPIO 与 OPA 时钟 → GPIO_Configuration 把 PA0、PA6 设为模拟功能 → OPAMP_Configuration 取默认值后填模式、输入与增益,再调用 OPAMP_Init 并 OPAMP_Enable → 放大结果由 PA6 输出。 |
| 主要 API | OPAMP_StructInit、OPAMP_Init、OPAMP_Enable |
| 验证方法 | 编译后进入调试模式,用示波器观察 PA0 输入与 PA6 输出; OPA1 输出约为输入电压的 2 倍。 |
| 使用提示 | 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0; 内部 PGA 的增益由片内电阻反馈网络提供,输入不要超出供电范围。 |
核心代码解读与移植
示例把 OPAMP1 的输入、工作模式与增益一次写入结构体,初始化后使能即可输出。
数据路径: RCC_Configuration 开 GPIO 与 OPA 时钟 → GPIO_Configuration 写 PA0、PA6 模拟模式 → OPAMP_StructInit 取默认值 → OPAMP_Configuration 填输入与内部 PGA 增益 → OPAMP_Init 写控制寄存器 → OPAMP_Enable 使能输出
1. 先打开 GPIO 与 OPA 的 APB 时钟。 OPA 挂在 APB 上,两个时钟一次使能,之后才能配置引脚与运放。
void RCC_Configuration(void)
{
/* Enable peripheral clocks ------------------------------------------------*/
/* Enable GPIO OPA clocks */
RCC_EnableAPBPeriphClk(RCC_APB_PERIPH_GPIO | RCC_APB_PERIPH_OPA, ENABLE);
}
换到其他模块时按实际外设改 RCC_APB_PERIPH_xxx,同一条语句里的多个宏可以按位或一起打开。
2. 把输入与输出引脚配成模拟功能。 模拟模式下引脚不接数字通道,输入 PA0 与输出 PA6 共用一次配置。
GPIO_InitStruct(&GPIO_InitStructure);
/* Configure INP PA0 OUT PA6 as analog input -----------------------*/
GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_6;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_ANALOG;
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
换用其他输入或输出引脚时,这里要同步改 Pin,并保证引脚号符合用户手册的 OPA 输入输出映射。
3. 用结构体一次配好模式、输入与增益,再使能。 结构体成员分别对应工作模式、同相输入选择与增益;本例选内部 PGA 模式并把增益设为 2 倍,最后使能 OPAMP1。
OPAMP_InitType OPAMP_Initial;
OPAMP_StructInit(&OPAMP_Initial);
OPAMP_Initial.OPAMP1_Vpsel = OPAMP1_CS_VPSEL_PA0;
OPAMP_Initial.Gain = OPAMP1_CS_PGA_GAIN_2_DIFF_1;
OPAMP_Initial.Mode = OPAMP1_CS_MODE_INTER_PGA;
/*configure opamp1*/
OPAMP_Init(OPAMP1, &OPAMP_Initial);
OPAMP_Enable(OPAMP1, ENABLE);
单端 PGA 模式下 VM 引脚需保持浮空,增益档位要与模式匹配;改用跟随或差分模式时,Mode 与 Gain 的宏都要按用户手册换成对应取值。
对应源码: src/main.c、firmware/n32g033_std_periph_driver/inc/n32g033_opamp.h
5.13.4 注意与排障
| 场景 | 检查与建议 | 来源 |
|---|---|---|
| 输入与输出范围 | 用户手册 OPAMP 章写明 OPAMP 输入范围为 0 V 到 VDDA,输出范围为 0.4 V 到 VDDA-0.4 V; 信号超出该范围时输出不可用。 |
用户手册 |
| 单端 PGA 的 VM 引脚 | 用户手册 OPAMP 章写明单端增益(PGA)模式(MOD=10)下 VMSEL 引脚必须设为浮空; VP 引脚用于选择同相输入。 |
用户手册 |
| 跟随模式的 VM 引脚 | 用户手册 OPAMP 章写明跟随模式下 VMSEL 由芯片内部连接到输出端口; 未占用的 VM 引脚可作普通 GPIO。 |
用户手册 |
| 增益档位与模式匹配 | 用户手册 OPAMP 章写明 OPA1 单端 PGA 增益为 2/4/8/16/32 倍、差分 PGA 为 1/2/4/8/16/32 倍; OPA2、OPA3 仅差分 PGA,增益为 1/2/4/8/16 倍,且无输出引脚。 |
用户手册 |
| OPAMP 写保护 | 用户手册 OPAMP 章写明 OPAMP_LOCK 置位后 OPAMP1/2/3 控制寄存器变为只读; 只有芯片复位或 OPA 模块复位才能清除写保护。 |
用户手册 |
勘误手册 V1.0.0(2025.9.25)针对 A 版芯片,未列出 OPAMP 相关条目。