历史上的今天
今天是:2025年03月03日(星期一)
2020年03月03日 | 【菜鸟入门】stm32 之 DAC
2020-03-03 来源:eefocus
DAC可谓是stm32继按键最简单的一个寄存器配置吧,花了半个小时搞定!
DAC主要特征
● 2个DAC转换器:每个转换器对应1个输出通道
● 8位或者12位单调输出
● 12位模式下数据左对齐或者右对齐
● 同步更新功能
● 噪声波形生成
● 三角波形生成
● 双DAC通道同时或者分别转换
● 每个通道都有DMA功能
● 外部触发转换
看了这些东西,貌似很激动的样子,我们下面就开始配置DAC外设了
先直接看看寄存器:

位12 DMAEN1:DAC通道1 DMA使能(DAC channel1 DMA enable
该位由软件设置和清除。
0:关闭DAC通道1 DMA模式;
1:使能DAC通道1 DMA模式。
MAMP1[3:0]:DAC通道1屏蔽/幅值选择器(DAC channel1 mask/amplitude selector) 位11:8
由软件设置这些位,用来在噪声生成模式下选择屏蔽位,在三角波生成模式下选择波形的幅
值。
0000:不屏蔽LSFR位0 / 三角波幅值等于1;
0001:不屏蔽LSFR位[1:0] / 三角波幅值等于3;
0010:不屏蔽LSFR位[2:0] / 三角波幅值等于7;
0011:不屏蔽LSFR位[3:0] / 三角波幅值等于15;
0100:不屏蔽LSFR位[4:0] / 三角波幅值等于31;
0101:不屏蔽LSFR位[5:0] / 三角波幅值等于63;
0110:不屏蔽LSFR位[6:0] / 三角波幅值等于127;
0111:不屏蔽LSFR位[7:0] / 三角波幅值等于255;
1000:不屏蔽LSFR位[8:0] / 三角波幅值等于511;
1001:不屏蔽LSFR位[9:0] / 三角波幅值等于1023;
1010:不屏蔽LSFR位[10:0] / 三角波幅值等于2047;
≥1011:不屏蔽LSFR位[11:0] / 三角波幅值等于4095。
位7:6 WAVE1[1:0]:DAC通道1噪声/三角波生成使能(DAC channel1 noise/triangle wave generation
enable)
该2位由软件设置和清除。
00:关闭波形生成;
10:使能噪声波形发生器;
1x:使能三角波发生器。
位5:3 TSEL1[2:0]:DAC通道1触发选择(DAC channel1 trigger selection)
该位用于选择DAC通道1的外部触发事件。
000:TIM6 TRGO事件;
001:对于互联型产品是TIM3 TRGO事件,对于大容量产品是TIM8 TRGO事件;
010:TIM7 TRGO事件;
011:TIM5 TRGO事件;
100:TIM2 TRGO事件;
101:TIM4 TRGO事件;
110:外部中断线9;
111:软件触发。
注意:该位只能在TEN1= 1(DAC通道1触发使能)时设置。
位2 TEN1:DAC通道1触发使能(DAC channel1 trigger enable)
该位由软件设置和清除,用来使能/关闭DAC通道1的触发。
0:关闭DAC通道1触发,写入寄存器DAC_DHRx的数据在1个APB1时钟周期后传入寄存器
DAC_DOR1;
1:使能DAC通道1触发,写入寄存器DAC_DHRx的数据在3个APB1时钟周期后传入寄存器
DAC_DOR1。
注意:如果选择软件触发,写入寄存器DAC_DHRx的数据只需要1个APB1时钟周期就可以传入
寄存器DAC_DOR1。
位1 BOFF1:关闭DAC通道1输出缓存(DAC channel1 output buffer disable)
该位由软件设置和清除,用来使能/关闭DAC通道1的输出缓存。
0:使能DAC通道1输出缓存;
1:关闭DAC通道1输出缓存。
位0 EN1:DAC通道1使能(DAC channel1 enable)
该位由软件设置和清除,用来使能/失能DAC通道1。
0:关闭DAC通道1;
1:使能DAC通道1。
因为DAC1对应的是PA4,所以我们在初始化DAC1的时钟时别忘了 PA4
RCC->APB1ENR |= 1<<29;
RCC->APB2ENR |= 1<<2;
因为我们这里不用DMA,所以就关掉
DAC->CR &= ~(1<<12); //close DMA
如果想输出三级波,那就把6:7位都置1,想输出噪声我们就弄成10b,什么都不想要我们就用00b;这里我想玩玩三角波,我就配置称11;
DAC->CR &= ~(3<<6);//好习惯是先把几位全部清空
DAC->CR |= 3<<6;
因为我们上面设置了三级波模式,这里我们来设置三级波的VPP,可以根据上面的datasheet设置!
DAC->CR &= ~(0xf<<8);
DAC->CR |= 0xf<<8;
DA的触发模式,为了方便起见我们之间选用软件触发,但是

所以我们要现设置TEN1=1;然后再设置成软件触发
DAC->CR |= 1<<2;
DAC->CR |= 7<<3; //sw
我们也用不上DAC的缓存,所以二话不说关掉!
DAC->CR |= 1<<1;
下面设置要输出的偏移电源,0当然就是0V了,
DAC->DHR12R1 = 0;
因为我们用到了软件触发,所以我们要时刻关注软件触发寄存器,寄存器就两位:

DAC->SWTRIGR |= 1<<0;
然后就打开DA,开始工作!
DAC->CR |= 1<<0;
下面附上我的代码!
/* dac.c */
#include void dac_init() { RCC->APB1ENR |= 1<<29; RCC->APB2ENR |= 1<<2; DAC->CR &= ~(1<<12); //close DMA DAC->CR &= ~(0xf<<8); DAC->CR |= 0xf<<8; //Vp = 512 DAC->CR &= ~(3<<6); // DAC->CR |= 3<<6; DAC->CR |= 1<<2; DAC->CR |= 7<<3; //sw DAC->CR |= 1<<1; DAC->DHR12R1 = 0; DAC->SWTRIGR |= 1<<0; DAC->CR |= 1<<0; } 主函数 #include #include "init.h" #include "usart.h" #include "stdio.h" #include "dac.h" int main() { rs232_init(CPU_72M,9600); dac_init(); while(1) { if(!(DAC->SWTRIGR&(1<<0))) { DAC->SWTRIGR |= 1<<0; } } } 效果: 还有什么说的?慢慢瞎搞吧!把瞎搞进行到底! 
史海拾趣
|
1、简单描述一个单片机系统的主要组成模块,并说明各模块之间的数据流流向和控制流流向。简述单片机应用系统的设计原则。(仕兰微面试题目) 2、画出8031与2716(2K*8ROM)的连线图,要求采用三-八译码器,8031的P2.5,P2.4和P2.3参加译码,基本地 ...… 查看全部问答> |
|
急: 咨询LM3S8962通过I2C模块访问DAC8571, 位啥不成功? 本帖最后由 dontium 于 2015-1-23 13:42 编辑 先介绍DAC8571 资料; 数字转模拟的DAC, 工作电压3.3V, 目前参考电压输入为1V , 电路图如下连接: SDA, SCL 都上拉了,上拉电阻10K; DAC8571 访问关键资料图如下: LM3S8962 配 ...… 查看全部问答> |
|
最近在学习NTP网络较时编程中,遇到了一个问题,这是一个容易被我们忽视的问题,也是一个很重要的问题。 对NTP网络校时编程有一定了解的同学,一定知道NTP包,它的结构如下图: 在编程中,对上图的描述就是用一个结构体: typedef stru ...… 查看全部问答> |
|
第一次用AVR的单片机,没弄懂串口发送数据怎么写。谢谢大家帮忙看看程序编译出来没错,但是收不到数据编译器 CodeVisionAVR V2.03.4(附带下载)下面是我写的程序串口部分晶振用的是11.0592的使用的是PD0、PD1只做输出,不接收数据 void USART ...… 查看全部问答> |
|
以前确实抽不出时间搞这个。现在按照计划开始试用了。 由于测试条件不理想,图片嘛,这里就不贴了。 今天只测试了LMZ10501的部分特性,且是在输出1.8V下的。以后还要继续作其它测试。 一、空载电流 测试条件:输入5V, &n ...… 查看全部问答> |
|
大虾们,偶在做一个温湿度传感器,用的DHT21传感器,但是有一段程序困扰我好久了,... 函数名称 : 读温湿度字节函数 功 能 : 读取温湿度每个字节 说 明 : 无 *********************************************************/ void COM(void)//读字节 { U8 i; & ...… 查看全部问答> |




