日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32连续采样_STM32 - 利用双缓冲实现实时曲线显示(续)

發布時間:2025/3/11 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32连续采样_STM32 - 利用双缓冲实现实时曲线显示(续) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

大概半個月之前搗鼓了下利用STM32實現實時曲線顯示,中間又做了一點小改進和擴充,在這里更新一下:

  • 利用DMA進行緩沖區到LCD GRAM的像素數據搬運
  • 效果更好的曲線繪制策略
  • 代碼可以在這里找到:<寫得比較亂,望諒解( ′・ω・)ノ(._.`)

    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!這不耍流氓嗎,你怎么保證采集的數據剛好和圖表的寬度一樣多啊?
    線性插值了解一下:

    uint16_t

    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 - 利用双缓冲实现实时曲线显示(续)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。