CH579是自带BLE蓝牙的芯片,由于蓝牙连接传输对时间的要求比较高,所以在实现功能时并不能阻塞或执行代码段时间过长,会导致蓝牙连接不稳定或者蓝牙传输数据失败
由于我本次使用的是128*64大小的单色OLED屏幕,
屏幕大小为128*64共 8129bit(1KByte)数据
如果使用硬件spi 8M频率
传输完成一屏幕数据仅需要
8192bit / 8Mbps = 1.024ms
而IIC,即使使用400K频率传输也需要
8192bit / 400Kbp = 20.48ms
而且ch579也没有硬件iic,软件IIC更是达不到400kbps,这样的差距无论是系统稳定性还是从低功耗考虑,都是前者更优,所以采用硬件spi+dma方式
本篇文章主要针对ch579的硬件spi和DMA,涉及到OLED屏幕的请自行根据实际硬件调整
总体思路:
屏幕大小128*64,先在内存开设缓冲区 uint8_t OLED_GRAM[128][8];
然后在主循环将想要显示的内容填充到缓冲区
然后使用配置硬件SPI和DMA,将整个缓冲区传输到屏幕
当DMA传输完成,设置标志位OLED_DMA_IS_OK_Flag = 1;
主循环判断该标志位去准备下一屏数据
硬件连接说明:
由于屏幕只需要传输数据,因此只需要使用spi的SCL和MOSI即可
同时由于我的SPI上只挂在了一个屏幕.因此CS也不需要连接IO,屏幕的CS片选连接GND即可
CLK:PA13
MOSI:PA14
- 初始化IO口
void spi0_OLED_IO_Init(void)
{
GPIOA_ModeCfg(GPIO_Pin_13, GPIO_ModeOut_PP_20mA); //CLK
GPIOA_ModeCfg(GPIO_Pin_14, GPIO_ModeOut_PP_20mA); //MOSI
GPIOA_ModeCfg(GPIO_Pin_15, GPIO_ModeOut_PP_20mA); //C/D# //屏幕所需命令数据控制脚
GPIOA_SetBits( GPIO_Pin_13 );
GPIOA_SetBits( GPIO_Pin_14 );
GPIOA_SetBits( GPIO_Pin_15 );