基於STM32的簡單數字示波器
阿新 • • 發佈:2019-02-08
1. 平臺說明
基於STM32F103ZET6晶片最小系統 + TFT液晶屏。 用到了:STM32內部ADC,DAC,DMA,FSMC等等。。2. 基本原理
(1). 用STM32晶片內部的AD連續取樣 (2). 用DMA傳送到資料緩衝區 (3). 把取樣結果轉化為液晶屏上的座標位置 (4). 在液晶屏上面畫出來波形 (5). 回到(1) 一言概之,取樣&畫圖。3. 結果展示
這個三角波是用STM32內部的DAC產生。4. 遇到的問題
(1). 閃屏問題 問題描述:更新波形時候閃屏嚴重。 原因:一次重畫,需要經歷三次過程,首先清空波形圖所在矩形,然後畫波形座標的格子(方便檢視電壓大小),最後畫波形,因為刷屏速度本身不快,所以刷三遍後,閃屏很嚴重。 想到了三種解決方法:在重畫之前,先進行預處理,處理方式: a方式: 每次先處理一條豎線上的資料,然後畫一條豎線,處理包括刷屏,格子,波形。這樣處理一條,畫一條,一次刷屏即可完成重畫。 b方式:開闢一塊與螢幕畫素數相同的緩衝區(16位),緩衝區與螢幕座標一一對應,每次刷屏操作都是修改緩衝區,當完成所有操作,然後再把緩衝區內容畫到螢幕上。 c方式:每次刷屏仍需三次操作,不過,之前是針對整個螢幕,而現在針對一條線,每次先畫完一條豎線,然後再畫完下一條。 理論上來說,b方法效果最好,操作也較簡單。c方式效果相對最差,但操作方法最簡單。 b方式只是空想,空間上不符合現實。對於微控制器而言,RAM本就不多。假如使用320*240屏,一共76800個畫素點,每個畫素點用RGB565的話,一個點需要兩個位元組,那一共就是150KB。想法不錯,但是嚴重脫離群眾。 a方式可行,但是資料預處理也比較麻煩,只比c方式好了一點點,因此除非要求特高。。。 所以採用c方式,效果也不錯,沒有明顯的閃屏了。 (2). DMA問題 問題描述:DMA連續傳送時,在畫波形時資料可能部分被修改。而單次傳輸,如何快速重啟DMA? 解決方法(DMA重啟傳輸): DMA初始化時選擇單次傳輸,傳輸過程中,BufferSize會改變,實測資料位寬也改變了。因此先關閉DMA,然後重新設定BufferSize和資料位寬,再開啟DMA就好了。 程式碼:DMA_Cmd(DMA1_Channel1, DISABLE); DMA_SetCurrDataCounter(DMA1_Channel1,n); DMA1_Channel1->CCR &= 0xFFFFF0FF; DMA1_Channel1->CCR |= 0x00000900; DMA_Cmd(DMA1_Channel1, ENABLE);