大家好,在编写这次博客文章之前,大家可以看看我的第一篇博客,那里有我为什么编写这篇文章的目的,在之前说过,由于该最小系统板的内存容量非常小,ram和flash都很小,那么此时移植过去就会导致我的内存溢出,爆炸。然后我就想通过将我的字库文件移植到W25Q64外置flash中,这样我的最小系统板的flash就能让出空间移植LVGL,移植一个LVGL的所有文件。首先lvgl的最小要求flash大于等于64KB,而最小系统板的flash容量为64KB,那么如何完成这个压缩,我初步尝试是通过W25Q64,那么在编写底层代码的过程中,遇到了几个问题和大家共勉。
首先第一个问题,在驱动代码的时候,经常会忘记一件事,那就是等待忙结束的标志位,翻看了数据手册,在每个页编程以及擦除内存的代码中,都需要进行等待忙的标志位,才能进行下一次操作。
接着第二个问题,首先我的lcd底层驱动代码和w25驱动代码采用的是同一种spi外设资源,然后我发现,当我将spi的分频参数改为2分配,也就是此时SPI的时钟频率达到36Mhz,这时就能正常工作。查看数据手册后发现,它一般是18MHZ,也就是4分频,这个状态下发现,lcd屏幕一开始并不会卡死,之后当我将校准屏的校准参数保存至W25的flash中发现,此时就会出现LCD屏幕卡死不动,而通过串口发现while循环的内部程序仍在正常运行,那么此时更改为2分频,也就是36Mhz,此时发现设备却可以正常运行,校准参数成功写入到W25的flash,这个问题初次排查是认为spi的底层驱动代码的问题,我在尝试把lcd代码注释后,单独用W25进行驱动,此时发现并不会出现频率影响,那么可以断定是LCD的底层驱动代码导致的问题。
接下来就是分析LCD底层代码到底哪里出现的问题,通过问ai发现,是由于我的LCD驱动代码在编写时,并没有清空返回的数据,接受寄存器中的数据一直保存,并没有处理,那么在w25没有使用的情况下,lcd屏幕正常是不会卡死的。
解决方法:
1:重新修改LCD的底层SPI驱动代码,添加SPI接受数据代码,避免在W25发送数据并接受到之前没有删除干净的数据。
2:后续发现是由于LCD屏幕的底层spi驱动代码导致的问题,在发送命令或数据的同时,并没有清空接受缓冲区,并且在等待清空标志位的同时,弄错了标志位的参数,导致卡死,修改以后,无论spi底层的时钟频率设置多小或多大都可以正常工作,只是屏幕的刷新变化。(这里的死等循环是不是需要设置为状态机比较好。)