DAC指数字/模拟转换。STM32F103RCT6具有2个12位数字输入,模拟输出的DAC;支持数字输入配置成8位右对齐、12位左对齐或12位右对齐格式;在双DAC通道模式下支持单通道独立转换或双通道同步转换。

将ENx置1即可打开对DACx的供电。在经过一段启动时间Twakeup(见规格书,6.5us)后,DACx被使能
注:ENx只会使能DACx的模拟部分,即使ENx置0,DACx的数字部分仍在工作



数字输入经过DAC被线性地转换为模拟电压输出,其范围为0到VREF+。
任一DAC通道引脚上的输出电压满足下面的关系:
DAC输出 = VREF x (DOR / 4096)
如果TENx位被置1, DAC转换可以由某外部事件触发(定时器计数器、外部中断线)。配置控制位TSELx[2:0]可以选择8个触发事件之一触发

以**字(32位)**的方式操作这些寄存器
该寄存器用于控制DAC1和DAC2,低12位为DAC1,[28:16]为DAC2,这里仅看低12位



bit0和bit1分别用于设置DAC1和DAC2通道的软件触发,其余bit均保留


这里仅说一下DAC1的12bit右对齐格式,其他的格式请查参考手册
低12bit为写入DHR寄存器的数据,这里用的是12bit右对齐格式

DAC1和DAC2的格式一样,该DORx寄存器的数据会传输到DACx的模拟电路并转换成模拟输出
注:不能直接写数据到该寄存器,输出数据只能通过写入到DHR寄存器,经系统传输到DORx

不使用外部触发,噪声、三角波生成的简单初始化如下:
/****************************************************************************
* 函数名:bspDACInit()
* 功能:初始化DAC
* 输入:无
* 输出:无
*/
void bspDACInit(void)
{
uint32_t ulTemp;
RCC->APB2ENR |= 1 << 2; /*使能GPIPA时钟*/
GPIOA->CRL &= 0xFFF0FFFF; /*PA4模拟输入*/
RCC->APB1ENR |= 1 << 29; /*使能DAC时钟*/
ulTemp = DAC->CR;
ulTemp &= 0xFFFF0000;
ulTemp |= 0x00000003;
DAC->CR = ulTemp; /*失能ADC1的DMA,MAMP,波形发生器,触发;使能ADC1*/
DAC->DHR12R1 = 0; /*输出数据初始值为0*/
}
在例程中运行如下:
