陳甸甸, 王 怡, 金小萍
(中國計量大學 信息工程學院, 浙江 杭州 310018)
嵌入式系統原理作為電子信息工程和通信工程等專業的核心課程,理論知識點多,覆蓋學科面廣,命令操作多,教師講授難度大,學生感覺內容枯燥乏味,無法產生學習興趣[7-9]。為改變這種狀況,我們在該課程的實驗教學過程中采用了ARM Cortex-M3內核的STM32F103微控制器為目標平臺,結合相應的實驗項目,強化理論與應用實踐相結合,引導學生獨立思考,培養學生的學習興趣和學習積極性、主動性。
STM32F103系列主要分為基礎性系列與增強型系列,本文使用的STM32F103ZET6屬于增強型系列,模擬/數字(A/D)轉換、數字/模擬(D/A)轉換是該系列處理的重要功能。本文主要利用數字/模擬轉換器(DAC)、直接內存訪問(DMA)和定時器(TIMER)3個模塊,設計了STM32引腳輸出不同的模擬波形實驗。DAC的作用是將數字量轉換成電壓,DMA可以不占用CPU資源讀取內存中的數字量,輸出波形的周期可以通過修改TIMER的定時時間得到。
DAC模塊是數字輸入、電壓輸出的數字/模擬轉換器,可以配置為8位或12位模式,數據格式可以分為8位右對齊、12位左對齊和12位右對齊3種。STM32F103ZET6的DAC模塊有2個輸出通道并帶有DMA功能,每個通道都有單獨的轉換器。在雙DAC模式下,2個通道可以獨立地進行轉換,也可以同時進行轉換并同步地更新2個通道的輸出[10]。
DAC功能框圖見圖1。DAC模塊主要分為觸發模塊、控制邏輯、DAC轉換器。觸發模塊包含7個硬件觸發和1個軟件觸發。DAC中比較重要的寄存器有數據保持寄存器(DHR)、數據輸出寄存器(DOR)以及DAC控制寄存器(DAC_CR), DOR不能直接操作,它的值是由控制邏輯從DHR中更新過來。

圖1 DAC功能框圖
本文利用通道1實現波形輸出,數據格式采用12位右對齊,觸發采用硬件觸發。寫入的數據根據相應的位移后被轉存到DHR1寄存器,當觸發發生后經過3個APB1時鐘周期,數據傳至寄存器DOR1。經過大約3 μs后,輸出即有效,引腳可測得模擬電壓。因此,只要改變數據寄存器中的數據就可以實現不同電壓信號的輸出,產生相應的波形。如果要改變波形的周期,只要通過TIMER改變數據寄存器中數據保持的時間即可。
當DAC的參考電壓為Vref+的時候,DAC的輸出電壓是線性的,從0~Vref+。12位模式下DAC輸出電壓與Vref+以及DOR的計算公式如下:
A new scheme of blending initial perturbation of the GRAPES regional ensemble prediction system
DAC輸出電壓=Vref+×(DOR/4095)
本文所設計的實驗硬件部分無需外接模塊,PA4和PA5引腳即為DAC的兩路通道,主要功能通過軟件控制實現。軟件系統的設計任務:一是利用STM32cubeMX平臺進行初始化配置后,生成初始化MDK工程;二是在keilMDK5.24下進行基于HAL(硬件抽象層)庫程序的開發。軟件的開發流程見圖2。

圖2 信號輸出軟件流程圖
STM32cubeMX是一款圖形化軟件設置工具,支持STM32全系列芯片,用戶可以非常方便地配置MCU的引腳、時鐘、外設等,并且支持自動生成工程項目文件,可以極大地減輕開發工作、節省時間和費用[11-13]。本實驗在STM32CubeMX中配置步驟如下:
(1) 啟動STM32CubeMX,點擊NewProject新建工程。
(2) 進入MCU型號選擇界面,搜索并雙擊選擇STM32F103ZETx后,進入Pinout引腳配置界面(見圖3)。
(3) 選擇通道1(DAC有2路通道),啟用外部高速時鐘晶振,選擇定時器TIM6作為DAC的觸發源。

圖3 STM32引腳配置界面
(4) 進入時鐘配置界面。外部晶振通過鎖相環(PLL)倍頻得到PLLCLK,之后得到系統時鐘72MHz,DAC掛載在APB1總線上,該總線下外設的時鐘頻率最大為36MHz,定時器時鐘頻率為72MHz。
(5) 在DAC配置界面(見圖4)的參數設定選項卡中,選擇定時器6作為觸發事件,其余兩項設置為disable。
(6) 在DMA設定選項卡中,添加DAC通道1的DMA功能,方向從內存到外設,模式為循環模式,內存地址需要自增,數據寬度為HalfWord。DMA參數設置界面見圖5。

圖5 DMA參數設置界面
(7) 輸出引腳PA4的配置設為模擬模式,當DAC通道使能后,相應的GPIO引腳會自動與DAC的模擬輸出相連。
(8) 在定時器TIM6(配置界面見圖6)的配置選項中,將預分頻(Prescaler)設置為72-1,計數方式為向上計數,自動重載寄存器(AutoReloadRegister)的值設置為1000,觸發事件設置為更新事件。在該設置模式下,定時器6的計數周期為1ms。如果需要改變DAC輸出波形的周期,可根據需要設置預分頻和自動重載寄存器的值。

圖6 定時器配置界面
各項配置完成后,點擊生成工程文件按鈕,彈出工程設置窗口,填寫工程名與選擇目錄,選擇編譯器MDK-ARMV5,即可生成初始化工程文件。
波形信號產生的基本原理是利用數字法來實現的。實驗設計中利用STM32F103ZET6單片機的DMA功能,將波形數據表中的數據直接傳至DAC的數據寄存器,再通過DAC轉化輸出。DMA傳輸數據的時間則由TIM6定時器控制,每經過一段時間傳輸一個數據。定時器TIM6的計數時間需要大于DAC的轉化時間以保證每次DAC轉化完成后再傳輸下一個波形數據。
波形數據表中存儲的是信號的離散值,可以通過計算直接得到。本實驗中設計了3種不同的信號波形,得到的實驗測試結果如下:
(1) 正弦波信號。定義一個數組Sine_data[]來存儲正弦波信號的離散值:
Sine_data[i]=(sin(2*pi*i/N)+1)*(dac_maxvalue/2)
其中N為采樣點數,dac_maxvalue是DOR的最大值,采用12位數據,最大為0xFFF。正弦波的測試波形如下圖7,采樣點數N=100,周期為100 ms,而STM32F103ZET6的Vref為3.3 V,因此輸出波形的峰峰值Vpp也為3.3 V。

圖7 正弦波測試信號
(2) 三角波信號。定義數組Triangle[]來存儲三角波信號的離散值:
Triangle[i]=i/(N/2)*dac_maxvalue(i<(N/2));
Triangle[i]=(N-i)/(N/2)*dac_maxvalue((N/2)
三角波信號的測試波形見圖8,周期和峰峰值測量結果與理論值吻合。

圖8 三角波測試信號
(3) 鋸齒波信號。定義數組sawtooth[]來存儲鋸齒波信號的離散值,
Sawtooth[i]=i/N* dac_maxvalue
鋸齒波的測試波形見圖9,測試結果與理論值吻合。

圖9 鋸齒波測試信號
本文利用STM32單片機中的DAC模塊、DMA功能和定時器設計了不同的波形輸出實驗,主要特點是實驗成本低、功耗小、輸出的波形穩定性好。同時,將STM32CUBEMX引入嵌入式原理實驗教學后,學生可以更加直觀、形象地配置初始化程序,這有助于提高實驗教學的效率和學生的學習興趣。通過波形輸出實驗的學習,可以幫助學生深入理解DAC的原理、應用和實踐操作方法,為學生進一步學習與開展課外科技活動打下良好基礎。