OLED模块------原子例程到实际应用中的BUG

问题出现过程

  • 起初 方案验证使用的是使用是原子淘宝店的OLED产品,直接使用战舰开发板,运行正常。
  • 后期自己做板子 后期改用自己做的板子,更换了一些端口,就发生了很难过的事情,OLED不能显示,RST一直是低电平,即便最初强行置高,RST为低,就是一直复位。
  • 找BUG历程
    1. 多个板子现象复现
    2. 检查引脚端口配置无误
    3. 测量RST电平一直为低电平
    4. 软件仿真发现,一直置低
    5. 发现是某个函数的原因OLED_Refresh_Gram();
    6. 原子给的历程中使用8080方式
    7. 深入函数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…

苦中作乐

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值