stm32硬件i2c

I2C禁止输出强上拉的电平,采用外置弱上拉电阻加开漏输出的电路结构,外置上拉电阻阻值一般为4.7kΩ左右。
按引脚定义用相应的引脚就好。
OLED输出的一种优化方案:
原来的刷新屏幕:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void OLED_Refresh(void){
uint8_t i, j;
uint8_t OLED_BufferUpdFlag = OLED_BufferUpdLagFlag | OLED_BufferLineUpdFlag;
for (j = 0; j < 8; ++j){
if (OLED_BufferUpdFlag & 1){
OLED_SetCursor(0, j);
for (i = 0; i < 128; ++i){
OLED_WriteData(OLED_Buffer[i][j]);
OLED_Buffer[i][j] = 0;
}
}
OLED_BufferUpdFlag >>= 1;
}
OLED_BufferUpdLagFlag = OLED_BufferLineUpdFlag;
}

虽然有UpdFlag的优化,但是经过测试,它的最高帧率只能达到37fps左右。问题出在哪儿呢?问题就出在OLED_WriteData反复开始结束通讯消耗了大量无意义资源。
优化后,变成了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void OLED_Refresh(void){
uint8_t i, j;
uint8_t OLED_BufferUpdFlag = OLED_BufferUpdLagFlag | OLED_BufferLineUpdFlag;
for (j = 0; j < 8; ++j){
if (OLED_BufferUpdFlag & 1){
OLED_SetCursor(0, j);
OLED_I2C_Start();
OLED_I2C_SendByte(0x78); // 从机地址
OLED_I2C_SendByte(0x40); // 写数据
for (i = 0; i < 128; ++i){
OLED_I2C_SendByte(OLED_Buffer[i][j]);
OLED_Buffer[i][j] = 0;
}
}
OLED_I2C_Stop();
OLED_BufferUpdFlag >>= 1;
}
OLED_BufferUpdLagFlag = OLED_BufferLineUpdFlag;
}

虽然看上去不如之前的好看,但是它效率极高——直接达到了110fps!
但是!当我改用硬件I2C,它的效率不增反降……我先找找原因

用Tweeny实现丝滑动效

刘慈欣:“好的程序员不去造轮子。”
刘慈欣:“我没说过这句话。”
刘慈欣:“我说过这句话。”

阅读更多

stc51中断

基本原理这里不写了,这里就记一下各种寄存器位的作用。
以及一点点汇编:)

阅读更多

μVision错误合集

我会直接放上完整的错误名称,并在下面附上解决方案。

阅读更多

人力资源机器1-6满星攻略

《人力资源机器》(原名:Human Resource Machine,又译:程序员升职记)这款游戏,所使用的游戏规则接近于计算机的汇编,可视化了底层代码,去其繁,益其乐。无论是入坑编程还是初试算法思想都是非常好的选择。当然,仅仅是作为一款益智游戏也是蛮不错的。从一名基层员工,一步一步从基层爬上巅峰,是不是特别地有意思?

阅读更多
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×