ryhyc 发表于 2025-7-12 22:45:06

这个OLED12864 for STC32G12K128是不是直接用到屠龙刀3上,不要做任何修改?

王昱顺 发表于 2025-9-8 15:35:22

113183694 发表于 2025-1-16 12:11
使用DMA是为了空出CPU时间来。 我用SPI DMA的U8G2例程做了测试,发现每次刷屏,即完成调用 u8g2.firstPage( ...
使用显存方式才能解放CPU,简单来讲,就是将绘制和显示分开
这需要将DMA设置为1024,建立一个显存,这样每次只需要一个触发发送指令即可实现刷屏。
在此过程中,可以对显存进行改写,类似同步进行操作,DMA负责刷屏(也就是之前说的等待),CPU负责处理图像绘制部分
以下是我之前做过的一个OLED显示,就是采用的DMA整屏刷新
可以做到处理和显示还有其他任务都同时进行(采用随机数满屏绘制矩形)

113183694 发表于 2025-10-2 16:24:55

王昱顺 发表于 2025-9-8 15:35
使用显存方式才能解放CPU,简单来讲,就是将绘制和显示分开
这需要将DMA设置为1024,建立一个显存,这样每 ...

我觉得您说得对,我对工程进行了如下修改:
1 将SPI和DMA配置打开,DMA的BUF设置成1024
2 将U8G2的SETUP函数选择F结尾的,即使用全缓冲。
3 将发送数据到屏幕的方式由FIRSTPAGE() NEXTPAGE() 改为clearbuffer()和sendbuffer().
编译成功后,没能成功显示,白屏了。我在想会不会是因为DMA发送数据时不会等待,而U8G2在底层会自动对指令/数据进行切换,数据发送不等待就导致DC切换时时序错误。
另外我也没有加入RTOS。
再请大佬指导一下。

王昱顺 发表于 2025-10-2 20:27:04

113183694 发表于 2025-10-2 16:24
我觉得您说得对,我对工程进行了如下修改:
1 将SPI和DMA配置打开,DMA的BUF设置成1024
2 将U8G2的SETUP ...

dma发送需要读取dma的发送完成标志位
需要类似的替换原来等待的部分,不然可能会造成没读到完成标志位一直等待或者一直发送
dma的发送和正常的速度一样,也是需要时间的,只不过dma的过程中,cpu可以干点别的事情
这里可能要处理一下发送逻辑,在每次sendbuff的时候判断dma是否已经完成,已完成就触发一次再次发送,没完成就不发送本次dma,这样可以最大化的利用时间
页: 1 2 [3]
查看完整版本: 【开源】GUI-OLED12864: U8g2/OLED12864 for STC32G12K128