问题出现过程
- 起初 方案验证使用的是使用是原子淘宝店的OLED产品,直接使用战舰开发板,运行正常。
- 后期自己做板子 后期改用自己做的板子,更换了一些端口,就发生了很难过的事情,OLED不能显示,RST一直是低电平,即便最初强行置高,RST为低,就是一直复位。
- 找BUG历程
- 多个板子现象复现
- 检查引脚端口配置无误
- 测量RST电平一直为低电平
- 软件仿真发现,一直置低
- 发现是某个函数的原因
OLED_Refresh_Gram();
- 原子给的历程中使用8080方式
- 深入函数
OLED_Refresh_Gram();
函数调用关系:
OLED_Refresh_Gram();
调用了OLED_WR_Byte();
OLED_WR_Byte();
调用了DATAOUT(x)
DATAOUT(x)
调用了GPIO_Write(GPIOC,x)
发现问题所在
GPIO_Write(GPIOC,x)
这个是给PORTx->ODR输出寄存器写值,每次写半字(u16)
因为我们使用的PC0~PC7作为输出,同时使用PC8作为RST引脚。在写值的过程中,因为使用OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA);
,其中第一个参数为8字节转换为16字节前边添加零,就会把PC8置低!
解决方案
- 直接操作寄存器修改值
- 原来的有问题的函数定义:
#define DATAOUT(x) GPIO_Write(GPIOC,x);
- 修改后的函数定义
//data:输出的数据
void DATAOUT(u8 data)
{
u16 dat = data & 0XFF; //PC[7:0]
GPIOC->ODR &= ~(0XFF); //清空0~7
GPIOC->ODR |= dat; //
}
- 基本节奏:一个BUG修一天。心累 ○( ^皿^)っHiahiahia…
苦中作乐