單芯片解決方案,開啟全新體驗——W55MH32 高性能以太網單片機
W55MH32是WIZnet重磅推出的高性能以太網單片機,它為用戶帶來前所未有的集成化體驗。這顆芯片將強大的組件集于一身,具體來說,一顆W55MH32內置高性能Arm? Cortex-M3核心,其主頻最高可達216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲與數據處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協議棧、內置MAC以及PHY,擁有獨立的32KB以太網收發緩存,可供8個獨立硬件socket使用。如此配置,真正實現了All-in-One解決方案,為開發者提供極大便利。
在封裝規格上,W55MH32 提供了兩種選擇:QFN68和QFN100。
W55MH32Q采用QFN68封裝版本,尺寸為8x8mm,它擁有36個GPIO、3個ADC、12通道DMA、17個定時器、2個I2C、3個串口、2個SPI接口(其中1個帶I2S接口復用)、1個CAN以及1個USB2.0。在保持與同系列其他版本一致的核心性能基礎上,僅減少了部分GPIO以及SDIO接口,其他參數保持一致,性價比優勢顯著,尤其適合網關模組等對空間布局要求較高的場景。緊湊的尺寸和精簡化外設配置,使其能夠在有限空間內實現高效的網絡連接與數據交互,成為物聯網網關、邊緣計算節點等緊湊型設備的理想選擇。 同系列還有QFN100封裝的W55MH32L版本,該版本擁有更豐富的外設資源,適用于需要多接口擴展的復雜工控場景,軟件使用方法一致。更多信息和資料請進入http://www.w5500.com/網站或者私信獲取。
此外,本W55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應用,涵蓋TCP SSL、HTTP SSL以及MQTT SSL等,為網絡通信安全再添保障。
為助力開發者快速上手與深入開發,基于W55MH32Q這顆芯片,WIZnet精心打造了配套開發板。開發板集成WIZ-Link芯片,借助一根USB C口數據線,就能輕松實現調試、下載以及串口打印日志等功能。開發板將所有外設全部引出,拓展功能也大幅提升,便于開發者全面評估芯片性能。
若您想獲取芯片和開發板的更多詳細信息,包括產品特性、技術參數以及價格等,歡迎訪問官方網頁:http://www.w5500.com/,我們期待與您共同探索W55MH32的無限可能。
第十五章 DAC (上篇)
1 DAC簡介
數字/模擬轉換模塊(DAC)是 12 位數字輸入,電壓輸出的數字/模擬轉換器。DAC 可以配置為 8 位或 12 位模式,也可以與 DMA 控制器配合使用。DAC 工作在 12 位模式時,數據可以設置成左對齊或右對。DAC 模塊有 2 個輸出通道,每個通道都有單獨的轉換器。在雙 DAC 模式下,2 個通道可以獨立地進行轉換,也可以同時進行轉換并同步地更新 2 個通道的輸出。DAC 可以通過引腳輸入參考電壓 VREF+以獲得更精確的轉換結果。
2 DAC主要特征
?2 個 DAC 轉換器:每個轉換器對應 1 個輸出通道
?8 位或者 12 位單調輸出
?12 位模式下數據左對齊或者右對齊
?同步更新功能
?噪聲波形生成
?三角波形生成
?雙 DAC 通道同時或者分別轉換
?每個通道都有 DMA 功能
?外部觸發轉換
?輸入參考電壓 VREF+
DAC通道模塊框圖如下:
DAC 通道模塊框圖
名稱 | 型號類型 | 注釋 |
VREF+ | 輸入,正模擬參考電壓 | DAC使用的高端/正極參考電壓,2.4V≤VREF+≤VDDA(3.3V) |
VDDA | 輸入,模擬電源 | 模擬電源 |
VSSA | 輸入,模擬電源地 | 模擬電源的地線 |
DAC_OUTx | 模擬輸出信號 | DAC通道x的模擬輸出 |
注意: 一旦使能 DACx 通道,相應的 GPIO 引腳(PA4 或者 PA5)就會自動與 DAC 的模擬輸出相連(DAC_OUTx)。為了避免寄生的干擾和額外的功耗,引腳 PA4 或者 PA5 在之前應當設置成模擬輸入(AIN)。
3 DAC功能描述
3.1 使能DAC通道
將 DAC_CR 寄存器的 ENx 位置'1'即可打開對 DAC 通道 x 的供電。經過一段啟動時間 tWAKEUP,DAC 通道 x 即被使能。注意: ENx 位只會使能 DAC 通道 x 的模擬部分,即便該位被置'0',DAC 通道 x 的數字部分仍然工作
3.2 使能DAC輸出緩存
DAC 集成了 2 個輸出緩存,可以用來減少輸出阻抗,無需外部運放即可直接驅動外部負載。每個DAC 通道輸出緩存可以通過設置 DAC_CR 寄存器的 BOFFx 位來使能或者關閉。
3.3 DAC數據格式
根據選擇的配置模式,數據按照下文所述寫入指定的寄存器:
?單 DAC 通道 x,有 3 種情況:
······8 位數據右對齊:用戶須將數據寫入寄存器 DAC_DHR8Rx[7:0]位(實際是存入寄存器DHRx[11:4]位)
······12位數據左對齊:用戶須將數據寫入寄DAC_DHR12Lx[15:4]位(實際是存入寄存器DHRx[11:0]位)
······12 位數據右對齊:用戶須將數據寫入寄存器 DAC_DHR12Rx[11:0]位(實際是存入寄存器DHRx[11:0]位)
根據對 DAC_DHRyyyx 寄存器的操作,經過相應的移位后,寫入的數據被轉存到 DHRx 寄存器中(DHRx 是內部的數據保存寄存器 x)。隨后,DHRx 寄存器的內容或被自動地傳送到 DORx 寄存器,或通過軟件觸發或外部事件觸發被傳送到 DORx 寄存器。
單 DAC 通道模式的數據寄存器
?雙 DAC 通道,有 3 種情況:
······8 位數據右對齊:用戶須將 DAC 通道 1 數據寫入寄存器 DAC_DHR8RD[7:0]位(實際是存入寄存器 DHR1[11:4]位),將 DAC 通道 2 數據寫入寄存器DAC_DHR8RD[15:8]位(實際是存入寄存器 DHR2[11:4]位)
·······12 位數據左對齊:用戶須將 DAC 通道 1 數據寫入寄存器 DAC_DHR12LD[15:4]位(實際是存入寄存器 DHR1[11:0]位),將 DAC 通道 2 數據寫入寄存器 DAC_DHR12LD[31:20]位(實際是存入寄存器 DHR2[11:0]位)
·······12 位數據右對齊:用戶須將 DAC 通道 1 數據寫入寄存器 DAC_DHR12RD[11:0]位(實際是存入寄存器 DHR1[11:0]位),將 DAC 通道 2 數據寫入寄存器 DAC_DHR12RD[27:16]位(實際是存入寄存器 DHR2[11:0]位)
根據對 DAC_DHRyyyD 寄存器的操作,經過相應的移位后,寫入的數據被轉存到 DHR1 和 DHR2 寄存器中(DHR1 和 DHR2 是內部的數據保存寄存器 x)。隨后,DHR1 和 DHR2 的內容或被自動地傳送到 DORx 寄存器,或通過軟件觸發或外部事件觸發被傳送到 DORx 寄存器。
雙 DAC 通道模式的數據寄存器
3.4 DAC轉換
不能直接對寄存器 DAC_DORx 寫入數據,任何輸出到 DAC 通道 x 的數據都必須寫入 DAC_DHRx 寄存器(數據實際寫入DAC_DHR8Rx、DAC_DHR12Lx、DAC_DHR12Rx、DAC_DHR8RD、DAC_DHR12LD、或者 DAC_DHR12RD 寄存器)。
如果沒有選中硬件觸發(寄存器 DAC_CR1 的 TENx 位置'0'),存入寄存器 DAC_DHRx 的數據會在一個 APB1 時鐘周期后自動傳至寄存器 DAC_DORx。如果選中硬件觸發(寄存器 DAC_CR1 的 TENx 位置'1'),數據傳輸在觸發發生以后 3 個 APB1 時鐘周期后完成。一旦數據從 DAC_DHRx 寄存器裝入 DAC_DORx 寄存器,在經過時間 tSETTLING 之后,輸出即有效,這段時間的長短依電源電壓和模擬輸出負載的不同會有所變化。
TEN=0 觸發失能時轉換的時間框圖
3.5 DAC輸出電壓
數字輸入經過 DAC 被線性地轉換為模擬電壓輸出,其范圍為 0 到 VREF+。
任一 DAC 通道引腳上的輸出電壓滿足下面的關系:
?DAC 輸出=VREFx(DOR/4095)。
3.6 選擇DAC觸發
如果 TENx 位被置 1,DAC 轉換可以由某外部事件觸發(定時器計數器、外部中斷線)。配置控制TSELx[2:0]可以選擇 8 個觸發事件之一觸發 DAC 轉換。
觸發源 | 類型 | TSELx[2:0] |
定時器 6TRGO 事件 | 來自片上定時器的內部信號 | 000 |
定時器 8TRGO 事件 | 001 | |
定時器 7TRGO 事件 | 010 | |
定時器 5TRGO 事件 | 011 | |
定時器 2TRGO 事件 | 100 |
每次 DAC 接口偵測到來自選中的定時器 TRGO 輸出,或者外部中斷線 9 的上升沿,最近存放在寄存器 DAC_DHRx 中的數據會被傳送到寄存器 DAC_DORx 中。在 3 個 APB1 時鐘周期后,寄存器DAC_DORx 更新為新值。
如果選擇軟件觸發,一旦 SWTRIG 位置'1',轉換即開始。在數據從 DAC_DHRx 寄存器傳送到DAC_DORx 寄存器后,SWTRIG 位由硬件自動清'0'。
注意: 1.不能在 ENx 為'1'時改變 TSELx[2:0]位。2.如果選擇軟件觸發,數據從寄存器 DAC_DHRx 傳送到寄存器 DAC_DORx 只需要一個 APB1 時鐘周期。
3.7 DMA請求
任一 DAC 通道都具有 DMA 功能。2 個 DMA 通道可分別用于 2 個 DAC 通道的 DMA 請求。如果DMAENx 位置'1',一旦有外部觸發(而不是軟件觸發)發生,則產生一個 DMA 請求,然后DAC_DHRx 寄存器的數據被傳送到 DAC_DORx 寄存器。
在雙 DAC 模式下,如果 2 個通道的 DMAENx 位都為'1',則會產生 2 個 DMA 請求。如果實際只需要一個 DMA 傳輸,則應只選擇其中一個 DMAENx 位置'1'。這樣,程序可以在只使用一個 DMA 請求,一個DMA 通道的情況下,處理工作在雙 DAC 模式的 2 個 DAC 通道。DAC 的 DMA 請求不會累計,因此如果第 2 個外部觸發發生在響應第 1 個外部觸發之前,則不能處理第 2 個 DMA 請求,也不會報告錯誤。
3.8 噪聲生成
可以利用線性反饋移位寄存器(Linear Feedback Shift Register LFSR)產生幅度變化的偽噪聲。設置WAVE[1:0]位為'01'選擇DAC噪聲生成功能。寄存器LFSR的預裝入值為0xAAA。按照特定算法,在每次觸發事件后 3 個 APB1 時鐘周期之后更新該寄存器的值。
DACLFSR 寄存器算法
設置 DAC_CR 寄存器的 MAMPx[3:0]位可以屏蔽部分或者全部 LFSR 的數據,這樣的得到的 LSFR 值與 DAC_DHRx 的數值相加,去掉溢出位之后即被寫入 DAC_DORx 寄存器。
如果寄存器 LFSR 值為 0x000,則會注入'1'(防鎖定機制)。將 WAVEx[1:0]位置'0'可以復位 LFSR 波形的生成算法。
帶 LFSR 波形生成的 DAC 轉換(使能軟件觸發)
3.9 三角波生成
可以在 DC 或者緩慢變化的信號上加上一個小幅度的三角波。設置 WAVEx[1:0]位為'10'選擇 DAC 的三角波生成功能。設置 DAC_CR 寄存器的 MAMPx[3:0]位來選擇三角波的幅度。內部的三角波計數器每次觸發事件之后 3 個 APB1 時鐘周期后累加 1。計數器的值與 DAC_DHRx 寄存器的數值相加并丟棄溢出位后寫入 DAC_DORx 寄存器。在傳入 DAC_DORx 寄存器的數值小于 MAMP[3:0]位定義的最大幅度時,三角波計數器逐步累加。一旦達到設置的最大幅度,則計數器開始遞減,達到 0 后再開始累加,周而復始。
將 WAVEx[1:0]位置'0'可以復位三角波的生成。
DAC 三角波生成
帶三角生成的 DAC 轉換(使能軟件觸發)
注意: 1.為了產生三角波,必須使能 DAC 觸發,即設 DAC_CR 寄存器的 TENx 位為'1'。
MAMP[3:0]位必須在使能 DAC 之前設置,否則其值不能修改。
4 雙DAC通道轉換
在需要 2 個 DAC 同時工作的情況下,為了更有效地利用總線帶寬,DAC 集成了 3 個供雙 DAC 模式使用的寄存器:DHR8RD、DHR12RD 和 DHR12LD,只需要訪問一個寄存器即可完成同時驅動 2 個DAC 通道的操作。
對于雙 DAC 通道轉換和這些專用寄存器,共有 11 種轉換模式可用。這些轉換模式在只使用一個DAC 通道的情況下,仍然可通過獨立的 DHRx 寄存器操作。
4.1 不使用波形發生器的獨立觸發
按照下列順序設置 DAC 工作在此轉換模式:
?分別設置 2 個 DAC 通道的觸發使能位 TEN1 和 TEN2 為'1';
?通過設置 TSEL1[2:0]和 TSEL2[2:0]位為不同值,分別配置 2 個 DAC 通道的不同觸發源;
?將雙 DAC 通道轉換數據裝入所需的 DHR 寄存器(DHR12RD、DHR12LD 或 DHR8RD)。
當發生 DAC 通道 1 觸發事件時,(延遲 3 個 APB1 時鐘周期后)寄存器 DHR1 的值傳入寄存器DAC_DOR1。
當發生 DAC 通道 2 觸發事件時,(延遲 3 個 APB1 時鐘周期后)寄存器 DHR2 的值傳入寄存器DAC_DOR2。
4.2 使用相同LFSR的獨立觸發
按照下列順序設置 DAC 工作在此轉換模式:
?分別設置 2 個 DAC 通道的觸發使能位 TEN1 和 TEN2 為'1';
?通過設置 TSEL1[2:0]和 TSEL2[2:0]位為不同值,分別配置 2 個 DAC 通道的不同觸發源;
?設置 2 個 DAC 通道的 WAVEx[1:0]位為”01”,并設置 MAMPx[3:0]為相同的 LFSR 屏蔽值;
?將雙 DAC 通道轉換數據裝入所需的 DHR 寄存器(DHR12RD、DHR12LD 或 DHR8RD)。
當發生 DAC 通道 1 觸發事件時,具有相同屏蔽的 LFSR1 計數器值與 DHR1 寄存器數值相加,(延遲3 個 APB1 時鐘周期后)結果傳入寄存器 DAC_DOR1,然后更新 LFSR1 計數器。當發生 DAC 通道 2 觸發事件時,具有相同屏蔽的 LFSR2 計數器值與 DHR2 寄存器數值相加,(延遲3 個 APB1 時鐘周期后)結果傳入寄存器 DAC_DOR2,然后更新 LFSR2 計數器。
4.3 使用不同LFSR的獨立觸發
按照下列順序設置 DAC 工作在此轉換模式:
?分別設置 2 個 DAC 通道的觸發使能位 TEN1 和 TEN2 為'1';
?通過設置 TSEL1[2:0]和 TSEL2[2:0]位為不同值,分別配置 2 個 DAC 通道的不同觸發源;
?設置 2 個 DAC 通道的 WAVEx[1:0]位為”01”,并設 MAMPx[3:0]為不同的 LFSR 屏蔽值;
?將雙 DAC 通道轉換數據裝入所需的 DHR 寄存器(DHR12RD、DHR12LD 或者 DHR8RD)。
當發生 DAC 通道 1 觸發事件時,按照 MAMP1[3:0]所設屏蔽的 LFSR1 計數器值與 DHR1 寄存器數值相加,(延遲 3 個 APB1 時鐘周期后)結果傳入寄存器 DAC_DOR1,然后更新 LFSR1 計數器。當發生 DAC 通道 2 觸發事件時,按照 MAMP2[3:0]所設屏蔽的 LFSR2 計數器值與 DHR2 寄存器數值相加,(延遲 3 個 APB1 時鐘周期后)結果傳入寄存器 DAC_DOR2,然后更新 LFSR2 計數器。
4.4 產生相同三角波的獨立觸發
按照下列順序設置 DAC 工作在此轉換模式:
?分別設置 2 個 DAC 通道的觸發使能位 TEN1 和 TEN2 為'1';
?通過設置 TSEL1[2:0]和 TSEL2[2:0]位為不同值,分別配置 2 個 DAC 通道的不同觸發源;
?設置 2 個 DAC 通道的 WAVEx[1:0]位為”1x”,并設 MAMPx[3:0]為相同的三角波幅值;
將雙 DAC 通道轉換數據裝入所需的 DHR 寄存器(DHR12RD、DHR12LD 或 DHR8RD)。
當發生 DAC 通道 1 觸發事件時,相同的三角波幅值加上 DHR1 寄存器的值,(延遲 3 個 APB1 時鐘周期后)結果傳入寄存器 DAC_DOR1,然后更新 DAC 通道 1 三角波計數器。
當發生 DAC 通道 2 觸發事件時,相同的三角波幅值加上 DHR2 寄存器的值,(延遲 3 個 APB1 時鐘周期后)結果傳入寄存器 DAC_DOR2,然后更新 DAC 通道 2 三角波計數器。
4.5 產生不同三角波的獨立觸發
按照下列順序設置 DAC 工作在此轉換模式:
?分別設置 2 個 DAC 通道的觸發使能位 TEN1 和 TEN2 為'1';
?通過設置 TSEL1[2:0]和 TSEL2[2:0]位為不同值,分別配置 2 個 DAC 通道的不同觸發源;
?設置 2 個 DAC 通道的 WAVEx[1:0]位為'1x',并設 MAMPx[3:0]為不同的三角波幅值。
?將雙 DAC 通道轉換數據裝入所需的 DHR 寄存器(DHR12RD、DHR12LD 或 DHR8RD)。
當發生 DAC 通道 1 觸發事件時,MAMP1[3:0]所設的三角波幅值加上 DHR1 寄存器數值,(延遲 3 個APB1 時鐘周期后)結果傳入寄存器 DAC_DOR1,然后更新 DAC 通道 1 三角波計數器。
當發生 DAC 通道 2 觸發事件時,MAMP2[3:0]所設的三角波幅值加上 DHR2 寄存器數值,(延遲 3 個APB1 時鐘周期后)結果傳入寄存器 DAC_DOR2,然后更新 DAC 通道 2 三角波計數器。
4.6 同時軟件啟動
按照下列過程設置 DAC 工作在此轉換模式:
?將雙 DAC 通道轉換數據裝入所需的 DHR 寄存器(DHR12RD、DHR12LD 或 DHR8RD)。在此配置下,一個 APB1 時鐘周期后,DHR1 和 DHR2 寄存器的數值即被分別傳入 DAC_DOR1 和DAC_DOR2 寄存器。
4.7 不使用波形發生器的同時觸發
按照下列順序設置 DAC 工作在此轉換模式:
?分別設置 2 個 DAC 通道的觸發使能位 TEN1 和 TEN2 為'1';
?通過設置 TSEL1[2:0]和 TSEL2[2:0]位為相同值,分別配置 2 個 DAC 通道使用相同觸發源;
?將雙 DAC 通道轉換數據裝入所需的 DHR 寄存器(DHR12RD、DHR12LD 或 DHR8RD)。
當發生觸發事件時,(延遲 3 個 APB1 時鐘周期后)DHR1 和 DHR2 寄存器的數值分別傳入 DAC_DOR1和 DAC_DOR2 寄存器。
4.8 使用相同LFSR的同時觸發
按照下列順序設置 DAC 工作在此轉換模式:
?分別設置 2 個 DAC 通道的觸發使能位 TEN1 和 TEN2 為'1';
?通過設置 TSEL1[2:0]和 TSEL2[2:0]位為相同值,分別配置 2 個 DAC 通道使用相同觸發源;
?設置 2 個 DAC 通道的 WAVEx[1:0]位為”01”,并設 MAMPx[3:0]為相同的 LFSR 屏蔽值;
?將雙 DAC 通道轉換數據裝入所需的 DHR 寄存器(DHR12RD、DHR12LD 或 DHR8RD);
當發生觸發事件時,MAMP1[3:0]所設屏蔽的 LFSR1 計數器值與 DHR1 寄存器的數值相加,(延遲 3個 APB1 時鐘周期后)結果傳入 DAC_DOR1 寄存器,然后更新 LFSR1 計數器。同樣,MAMP1[3:0]所設屏蔽的 LFSR2 計數器值與 DHR2 寄存器的數值相加,(延遲 3 個 APB1 時鐘周期后)結果傳入寄存器 DAC_DOR2,然后更新 LFSR2 計數器。
4.9 使用不同LFSR的同時觸發
按照下列順序設置 DAC 工作在此轉換模式:
?分別設置 2 個 DAC 通道的觸發使能位 TEN1 和 TEN2 為'1';
?通過設置 TSEL1[2:0]和 TSEL2[2:0]位為相同值,分別配置 2 個 DAC 通道使用相同觸發源;
?設置 2 個 DAC 通道的 WAVEx[1:0]位為'01',并設 MAMPx[3:0]為不同的 LFSR 屏蔽值;
?將雙 DAC 通道轉換數據裝入所需的 DHR 寄存器(DHR12RD、DHR12LD 或 DHR8RD)。
當發生觸發事件時,具有相同屏蔽的 LFSR1 計數器值與 DHR1 寄存器數值相加,(延遲 3 個 APB1時鐘周期后)結果傳入寄存器 DAC_DOR1,然后更新 LFSR1 計數器。同時,具有相同屏蔽的 LFSR2 計數器值與 DHR2 寄存器數值相加,(延遲 3 個 APB1 時鐘周期后)結果傳入寄存器 DAC_DOR2,然后更新 LFSR2 計數器。
4.10 使用相同三角波發生器的同時觸發
按照下列順序設置 DAC 工作在此轉換模式:
?分別設置 2 個 DAC 通道的觸發使能位 TEN1 和 TEN2 為'1':
?通過設置 TSEL1[2:0]和 TSEL2[2:0]位為相同值,分別配置 2 個 DAC 通道使用相同觸發源。
?設置 2 個 DAC 通道的 WAVEx[1:0]位為'1x',并設 MAMPx[3:0]為相同的三角波幅值。將雙 DAC 通道轉換數據裝入所需的 DHR 寄存器(DHR12RD、DHR12LD 或 DHR8RD)。
當發生觸發事件時,相同的三角波幅值與 DHR1 寄存器數值相加,(延遲 3 個 APB1 時鐘周期后)結果傳入寄存器 DAC_DOR1,然后更新 LFSR1 計數器。同時,相同的三角波幅值與 DHR2 寄存器數值相加,(延遲 3 個 APB1 時鐘周期后)結果傳入寄存器DAC_DOR2,然后更新 LFSR2 計數器。
4.11 使用不同三角波發生器的同時觸發
按照下列順序設置 DAC 工作在此轉換模式:
?分別設置 2 個 DAC 通道的觸發使能位 TEN1 和 TEN2 為'1':
?通過設置 TSEL1[2:0]和 TSEL2[2:0]位為相同值,分別配置 2 個 DAC 通道使用相同觸發源。
?設置 2 個 DAC 通道的 WAVEx[1:0]位為'1x',并設 MAMPx[3:0]為不同的三角波幅值。
?將雙 DAC 通道轉換數據裝入所需的 DHR 寄存器(DHR12RD、DHR12LD 或 DHR8RD)。
當發生觸發事件時,MAMP1[3:0]所設的三角波幅值與 DHR1 寄存器數值相加,(延遲 3 個 APB1 時鐘周期后)結果傳入寄存器 DAC_DOR1,然后更新 LFSR1 計數器。同時,MAMP2[3:0]所設的三角波幅值與 DHR2 寄存器數值相加,(延遲 3 個 APB1 時鐘周期后)結果傳入寄存器 DAC_DOR2,然后更新 LFSR2 計數器。
5 例程設計
5.1 DAC_OutAudio例程
1.UART 模塊:配置 USART1,波特率為 115200,將printf輸出重定向到該串口,用于輸出系統時鐘信息與測試提示。
// UART初始化函數 void UART_Configuration(uint32_t bound) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; // 使能USART1和GPIOA時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); // 配置TX引腳(PA9)為復用推挽輸出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置RX引腳(PA10)為浮空輸入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置串口參數:115200bps,8位數據,1位停止位 USART_InitStructure.USART_BaudRate = bound; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); } // 重定向printf函數到USART1 int SER_PutChar(int ch) { while (!USART_GetFlagStatus(USART_TEST, USART_FLAG_TC)); // 等待發送完成 USART_SendData(USART_TEST, (uint8_t)ch); return ch; } int fputc(int c, FILE *f) { if (c == 'n') SER_PutChar('r'); // 自動添加回車符 return SER_PutChar(c); }
2.GPIO 模塊:使能 GPIOA 時鐘,把引腳 4 和 5 配置成模擬輸入模式,為 DAC 輸出做準備。
3.DAC 模塊:使能 DAC 時鐘,對 DAC 通道 1 和通道 2 進行初始化,設置初始輸出值,將觸發源設為定時器 2 的觸發輸出,同時使能 DMA 請求。
4.定時器模塊:使能定時器 2 時鐘,配置其參數以產生 8kHz 的更新事件,將更新事件選為觸發輸出。
5.DMA 模塊:使能 DMA2 時鐘,配置通道 4 和通道 3,將Sine12bit數組的數據循環傳輸到 DAC2 和 DAC1 的數據寄存器。
void DMA_Configuration(void) { DMA_InitTypeDef DMA_InitStructure; // 使能DMA2時鐘 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE); // 配置DMA2通道4(DAC2) DMA_InitStructure.DMA_PeripheralBaseAddr = DAC2_DHR12RD_ADDRESS; // DAC2數據寄存器地址 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Sine12bit; // 數據源:正弦波數組 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; // 內存到外設 DMA_InitStructure.DMA_BufferSize = DATA_LEN; // 傳輸長度 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 內存地址遞增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 16位數據 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 循環模式 DMA_Init(DMA2_Channel4, &DMA_InitStructure); DMA_Cmd(DMA2_Channel4, ENABLE); // 配置DMA2通道3(DAC1,參數與通道4相同) DMA_InitStructure.DMA_PeripheralBaseAddr = DAC1_DHR12RD_ADDRESS; DMA_Init(DMA2_Channel3, &DMA_InitStructure); DMA_Cmd(DMA2_Channel3, ENABLE); }
數據轉換模塊:把 8 位數據轉換為 12 位數據,存于Sine12bit數組。
6 下載驗證
6.2 DAC_OutAudio例程
初始輸出
在 DAC 配置過程中,代碼會先將 DAC 通道 1 和通道 2 的輸出設置為一個初始值(代碼中設置為 3102)。因此,在程序啟動的瞬間,DAC 的兩個通道會輸出對應于該初始值的電壓信號。
在完成所有配置后,DMA 會將Sine12bit數組中的數據循環傳輸到 DAC 的數據寄存器,同時定時器 TIM2 會以 8kHz 的頻率產生觸發信號,觸發 DAC 進行數模轉換。因此,DAC 的兩個通道會持續輸出軟件生成的正弦波信號。
?頻率:由于定時器 TIM2 的周期設置為 8999,預分頻器設置為 0,所以定時器的更新頻率為 8kHz,這意味著 DAC 輸出的正弦波信號的頻率也為 8kHz。
?幅度:正弦波的幅度取決于Sine12bit數組中的數據,該數組中的數據是通過uint8_uint16函數將data數組中的 8 位數據轉換為 12 位數據得到的。
WIZnet 是一家無晶圓廠半導體公司,成立于 1998 年。產品包括互聯網處理器 iMCU?,它采用 TOE(TCP/IP 卸載引擎)技術,基于獨特的專利全硬連線 TCP/IP。iMCU? 面向各種應用中的嵌入式互聯網設備。
WIZnet 在全球擁有 70 多家分銷商,在香港、韓國、美國設有辦事處,提供技術支持和產品營銷。
香港辦事處管理的區域包括:澳大利亞、印度、土耳其、亞洲(韓國和日本除外)。
審核編輯 黃宇
-
單片機
+關注
關注
6067文章
44982瀏覽量
650291 -
dac
+關注
關注
44文章
2408瀏覽量
193651 -
dma
+關注
關注
3文章
576瀏覽量
103193
發布評論請先 登錄
《DNK210使用指南 -CanMV版 V1.0》第十五章 按鍵中斷實驗
視頻詳解:上海尤老師verilog入門到實戰第十五課
基于RFID和MySQL實現小區門禁系統
「正點原子Linux連載」第十五章按鍵輸入試驗
第十五屆智能車入門淺談 精選資料分享
第十五講 組合邏輯電路的分析方法和設計方法

第十五屆智能車入門淺談

【正點原子FPGA連載】第十五章 窗口門狗(WWDG)實驗 -摘自【正點原子】新起點之FPGA開發指南_V2.1

深度參與,共話未來 —— 吹田電氣亮相第十五屆亞洲電源技術發展論壇

評論