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