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 <stm32f10x.h>
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 <stm32f10x.h>
#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;
}
}
}
~~~
效果:

還有什么說的?慢慢瞎搞吧!把瞎搞進行到底!
- 前言
- 【菜鳥入門】stm32的第一個程序--LED
- 【菜鳥入門】stm32 之 掃描按鍵
- 【菜鳥入門】stm32 之 中斷按鍵
- 【菜鳥入門】stm32 之 USART
- 【菜鳥入門】stm32 之 iic
- 【菜鳥入門】stm32 之 eeprom
- 【菜鳥入門】stm32 之 pwm
- 【菜鳥入門】stm32 之 ADC 模數轉換
- 【菜鳥入門】stm32 之 實時時鐘
- 【菜鳥入門】stm32 之 DMA
- 【菜鳥入門】stm32 之 DAC
- 【STM庫應用】stm32 之 USART
- 中斷源去抖辦法
- stm32 啟動代碼應用技巧
- 【STM庫應用】stm32 之 IIC應用
- 【STM庫應用】stm32 之 中斷按鍵初始化(注意事項)
- 關于結構體初始化
- 【STM庫應用】stm32 之 TIM (詳解一 通用定時器)
- 【STM庫應用】stm32 之 TIM (詳解二 脈沖寬度、周期測量)
- 【stm32庫應用】SD驅動移植(基于SDIO外設)
- SD卡fat文件系統移植
- stm32 DMA初始化選項研究
- stm32 靈活靜態存儲控制器(FSMC)(NORFLASH\PSRAM)
- 【stm32+uC/OS-II】ucosii移植簡單詳細步驟
- STM32 加入調試信息來調試代碼
- NRF24L01 無線通信模塊使用