CH32V307 用IIC I2C 的DMA配置OLED屏幕

csdn有很多oled的配置方式,咱就不多说了。不过有2个点可以大幅提高性能,大家也可能发现了:

1、使用DMA来传iic数据

2、一次性传多个数据,不要一个字节一个字节的传


具体来说,IIC波特率设置为400K,这时候PCLK1最大不能超过36MHz。所以时钟设置要注意下。

其次,ssd1306的命令和数据是不能混着发送的,必须要每次不同的起始bit。但是呢,同样的cmd或者data可以连续写,这时候DMA就派上用场了。

连续写时ssd1306的co bit为1,这个要注意一下,可参考这篇:

I2C向SSD1306的OLED连续发送数据_ssd1306 i2c 连续操作_这个我会的博客

LYJ博客

使用dma最好搭配rtthread使用,当启动dma时,线程等待旗语进入休眠阶段。当dma中断后,增加旗语,线程就会获取到旗语继续执行,伪代码就是:

// 初始化
init(){
sema_init();
// dma第二次调用时只要更新cntr寄存器即可,其他不用再次初始化
dma_init();
iic_init();
}

// 显示调用
show_char(){
dma_send()
sema_wait();
do_somethins();
}
// 中断
interrupt(){
sema_release();
}

在中断函数里面,你不要忘记rt那一套++ --标记函数,不然很容易进入 hardfault() 

本文为3YL原创,转载无需联系,但请注明来自labisart.com。

原创文章不易,如果觉得有帮助,可打赏或点击右侧广告支持:

查看打赏记录

发表评论请遵守党国法律!后台审核后方可显示!
  • 最新评论
  • 总共0条评论
  • Blog v1.1© 2024 labisart.com 版权所有 | 联系:labartwork@163.com