DAC(数模转换器)相关的寄存器主要是用于 控制 DAC 的功能、配置输出模式和操作 DAC 输出数据。以下是典型的 STM32 系列微控制器中 DAC 的寄存器分类和功能说明:
1. DAC 控制和状态相关寄存器
1.1 DAC_CR (控制寄存器)
- 用于配置 DAC 的工作模式,包括启用通道、触发设置、波形生成等。
- 每个 DAC 通道(如 DAC 通道 1 和通道 2)都有独立的控制字段。
| 位名称 | 描述 |
|-----------------|-------------------------------------------------------------------------|
| ENx | 启用 DAC 通道 x(0:禁用;1:启用)。 |
| BOFFx | 输出缓冲使能位(0:使能缓冲;1:关闭缓冲,提升驱动能力)。 |
| TENx | 触发使能位(0:禁用触发;1:启用触发)。 |
| TSELx[2:0] | 触发源选择(如软件触发、定时器触发等)。 |
| WAVE1/WAVE2 | 波形生成选择(噪声或三角波)。 |
| MAMPx[3:0] | 波形振幅选择(如三角波振幅控制)。 |
示例:启用 DAC 通道 1,并使用软件触发。
DAC->CR |= (1U << 0); // EN1:使能 DAC 通道 1
DAC->CR |= (1U << 2); // TEN1:启用触发
DAC->CR &= ~(0x7U << 3); // TSEL1:选择软件触发
1.2 DAC_SWTRIGR (软件触发寄存器)
- 用于触发 DAC 的转换操作(如果启用了触发功能)。
- 每个通道独立使用一个位,写
1
表示触发转换。
| 位名称 | 描述 |
|------------|--------------------------------|
| SWTRIG1 | 软件触发 DAC 通道 1 转换。 |
| SWTRIG2 | 软件触发 DAC 通道 2 转换。 |
示例:触发 DAC 通道 1 的转换:
DAC->SWTRIGR |= (1U << 0); // 触发通道 1
1.3 DAC_SR (状态寄存器)
- 用于监测 DAC 的状态,包括 DMA 下溢出和输出电压状态。
| 位名称 | 描述 |
|------------|-----------------------------------------------------|
| DMAUDR1 | 通道 1 的 DMA 下溢错误标志(1:下溢;0:无错误)。 |
| DMAUDR2 | 通道 2 的 DMA 下溢错误标志。 |
示例:检测 DMA 下溢错误:
if (DAC->SR & (1U << 13)) {
// 通道 1 下溢错误
}
2. 数据寄存器(用于写入数据)
2.1 DAC_DHRxR(数据保持寄存器,右对齐模式)
- 用于写入转换数据,右对齐,数据长度为 12 位。
- 每个通道有三个寄存器(8 位、12 位右对齐、12 位左对齐)可供选择。
| 寄存器 | 数据位宽 | 描述 |
|-------------------|-----------------|----------------------------------------|
| DAC_DHR8Rx | 8 位 | 仅使用 8 位数据,右对齐。 |
| DAC_DHR12Rx | 12 位 | 右对齐,数据放在低 12 位。 |
| DAC_DHR12Lx | 12 位 | 左对齐,数据放在高 12 位。 |
示例:写入2048
到 DAC 通道 1 的右对齐数据寄存器:
DAC->DHR12R1 = 2048; // 输出中间值(范围:0-4095)
2.2 DAC_DORx(数据输出寄存器)
- 只读寄存器,表示当前 DAC 转换后的输出值。
- 每个通道有一个输出寄存器。
| 寄存器 | 描述 |
|------------|--------------------------------|
| DAC_DOR1 | 通道 1 的当前输出数据寄存器。 |
| DAC_DOR2 | 通道 2 的当前输出数据寄存器。 |
示例:读取 DAC 通道 1 当前输出数据:
uint32_t output_value = DAC->DOR1;
3. DMA 和触发配置
3.1 DAC_DMAUDR (DMA 下溢标志寄存器)
- 当 DAC 使用 DMA 进行数据传输时,如果数据传输速度跟不上,则会触发下溢错误。
3.2 触发源配置(CR 寄存器中的 TSELx 字段)
- DAC 支持多种触发源,
TSELx
字段用于选择触发信号:
| TSELx 值 | 触发源 |
|--------------|-----------------------|
|000
| 软件触发 |
|001
| Timer 6 触发事件 |
|010
| Timer 3 触发事件 |
|011
| Timer 7 触发事件 |
|100
| Timer 15 触发事件 |
|101
| 外部引脚(EXTI 线 9) |
|110
| Timer 2 触发事件 |
|111
| Timer 4 触发事件 |
示例:配置 DAC 通道 1 使用 Timer 6 触发:
DAC->CR &= ~(0x7U << 3); // 清除 TSEL1 位
DAC->CR |= (0x1U << 3); // 设置触发源为 Timer 6
4. 完整的寄存器清单
寄存器 | 描述 |
---|---|
DAC_CR | 控制寄存器:启用通道、设置触发源、波形生成等。 |
DAC_SWTRIGR | 软件触发寄存器:用于触发转换。 |
DAC_DHR12R1/DHR12R2 | 12 位右对齐数据寄存器:写入待转换数据。 |
DAC_DHR12L1/DHR12L2 | 12 位左对齐数据寄存器。 |
DAC_DHR8R1/DHR8R2 | 8 位数据寄存器。 |
DAC_DOR1/DOR2 | 数据输出寄存器:显示当前输出值。 |
DAC_SR | 状态寄存器:包括 DMA 下溢错误标志。 |
DAC_DMAUDR | DMA 下溢错误寄存器。 |
完整配置示例:使用 DAC 通道 1 输出模拟信号
假设我们需要将一个 12 位数据写入 DAC 通道 1 并输出。
// 1. 使能 DAC 时钟
RCC->APB1ENR1 |= (1U << 29); // 使能 DAC1 时钟
// 2. 配置 DAC 通道 1
DAC->CR |= (1U << 0); // EN1:启用通道 1
DAC->CR |= (1U << 2); // TEN1:启用触发
DAC->CR &= ~(0x7U << 3); // TSEL1:选择软件触发
// 3. 写入数据到 DAC 数据寄存器
DAC->DHR12R1 = 2048; // 输出 12 位中间值
// 4. 软件触发
DAC->SWTRIGR |= (1U << 0); // 软件触发通道 1
总结
关于 DAC 的寄存器:
- 控制寄存器(CR):启用通道、设置触发和波形生成。
- 软件触发寄存器(SWTRIGR):用于触发 DAC 转换。
- 数据寄存器(DHRx):用于写入 DAC 的待转换值。
- 输出寄存器(DORx):用于读取当前 DAC 输出值。
- 状态寄存器(SR):监控 DMA 下溢错误等状态。
通过配置这些寄存器,可以实现 DAC 的模拟信号输出,包括静态电压、动态波形(如三角波或正弦波)等。