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 连续操作_这个我会的博客
使用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()