在线时间464 小时
UID3547866
注册时间2022-4-24
NXP金币3162
TA的每日心情 | 开心 13 小时前 |
---|
签到天数: 1096 天 连续签到: 14 天 [LV.10]以坛为家III
金牌会员
 
- 积分
- 5762
- 最后登录
- 2025-7-22
|
本帖最后由 suncat0504 于 2024-6-10 13:34 编辑
为了调试程序以及显示测试信息,给LPC845赔了一个OLED的显示。使用P0.16和 P0.17作为SCL和SDA驱动0.96英寸的OLED。
程序可以参考其他ARM32下。在把程序弄到工程里,并进行必要的改编后,运新程序并没有获得想要的结果。
静下心来考虑了下,觉得是时序匹配问题的可能性最大。于是修改脉冲时序,加上以前常用的循环延时处理,结果依然不成功。本来觉的十拿九稳的事情,结果在折腾了几个小时后,终于还是使用示波器检查。在检查中发现,那种无实质代码的延时处理,没有任何效果,在示波器上看到有没有延时,代码之间的延时都是几十纳秒级别的,OLED根本无法及时响应传输指令和数据。
于是把延时处理,改成利用系统滴答器产生的延时。这个延时最低是1ms。再次烧录程序,终于看到OLED的显示有了变化。虽然清屏处理和显示字符串能成功了,但由于1模式的延时,对整个处理,还是太慢了,所以显示的速度是无法忍受的。但着至少证明接口没有问题了。下一步就是如何加快延时,以适应OLED的接口时序了。
尝试使用定时器来实现延时。由于延时很短,挂上定时器后,对于微妙级别的处理,等于是主程序还没咋运行呢,大量的处理都花在了定时器的中断处理上了。看来这个方式也不行啊。
有仔细考虑了下,无有效代码的延迟无效,是不是编译器变的结果呢?如果加上有效的处理代码,但对程序运行有没有影响的话,会怎么样呢。修改延迟处理代码,在空循环中加入一个读取Pin状态值的代码,然后替换给OLED的处理时序中,编译、下载程序。
void delayclk(uint32_t n) {
uint32_t i,j;
for (i=0;i<n;i++) {
for (j=0;j<5;j++) {
GPIO_PinRead(GPIO, 0U, 16U);
}
}
}
这次看到结果是有效的了。
|
|