STM32连续采样_STM32 - 利用双缓冲实现实时曲线显示(续)
前言
大概半個月之前搗鼓了下利用STM32實現實時曲線顯示,中間又做了一點小改進和擴充,在這里更新一下:
代碼可以在這里找到:<寫得比較亂,望諒解( ′・ω・)ノ(._.`)
curve_chart.c?github.com使用DMA進行像素搬運
利用STM32 DMA的M2M(Memory to Memory)模式,實現像素數據從外置SRAM的雙緩沖區到LCD GRAM的搬移。只需要把數據源(SRAM)和終點(LCD-GRAM)的虛擬地址交給DMA,DMA控制器即可自動通知FSMC控制兩個外設進行數據交換。
DMA初始化:
DMA_HandleTypeDef雙緩沖區像素更新:
void注意到DMA一次最多搬運65535個數據,這里我們分多次發出DMA請求,一次搬運65535個WORD == 65535 * 2 個RGB565像素,分幾部分將雙緩沖區的像素刷新到LCD的GRAM中。在每一次DMA傳輸請求發出后,得等它傳完才能進行下一次傳輸。
雖然CPU還是得在這里掛起等待,不過,,DMA傳得快啊!ヽ(??ω?? )ゝ
如果你的雙緩沖區數據量小于65535 * 4個字節,甚至可以把DMA配置成CIRCULAR模式,或者利用一個定時器中斷隔一段時間整體刷新一次,這樣就不用在這里掛起等待啦。對于
320x240這種小屏幕甚至可以把整個屏幕區域開辟雙緩沖區,然后利用DMA一直刷新就好,反正一次就能把所有像素搬完。沒錯是有這種操作的
但我用的屏分辨率比較高,就emmmmmmm
效果更好的曲線繪制策略
之前我們直接在數據點對應的位置處畫一個點, 最多在它的鄰域多畫幾個點。這樣對于“平滑”的波形顯示效果還行,但是對于豎直方向有快速變化的信號(比如方波),這種繪制策略會產生視覺上的不連續性,看起來很丑就是了XD
網格表示像素,紅色點表示數據點解決思路很簡單粗暴,把兩個數據點之間的垂直間隔補上即可,在局部產生一種階梯狀的填充,是不是有點像信號與系統里面學的離散采樣點恢復連續信號使用的零階保持╮( ??ω?? )╭
靈魂畫風了解一下,橙色為補上的像素點好啦我們上代碼!
void看到這里就要問了,這種繪制策略只是解決了y方向上數據點顯示不連續的問題,那x方向呢?
我們默認傳入的數據數組和繪圖區域的寬度(即x方向上的像素數)一致,所以x方向我覺得十分OK!這不耍流氓嗎,你怎么保證采集的數據剛好和圖表的寬度一樣多啊?
線性插值了解一下:
q15_t arm_linear_interp_q15(q15_t * pYData, q31_t x, uint32_t nValues)
這個函數是ARM DSP庫自帶的線性插值函數,除了16位的q15_t還有其他數據類型的版本
不管原始數據點數比顯示區域的寬度多還是少,都可以利用這樣的線性插值得到數量和圖表寬度剛好匹配的顯示數據。
總結與效果演示
進行了這兩個地方的小改進,不管是速度還是效果都比之前的版本更好了
https://www.zhihu.com/video/987057417087148032
歡迎吐槽與提建議,一起交流學習!
?(? ?? ??)?
總結
以上是生活随笔為你收集整理的STM32连续采样_STM32 - 利用双缓冲实现实时曲线显示(续)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PDM系统服务器管理,基于PDM的异地协
- 下一篇: vmware nat模式网络不通_【EV