)
大家好在编写这次博客文章之前大家可以看看我的第一篇博客那里有我为什么编写这篇文章的目的在之前说过由于该最小系统板的内存容量非常小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底层的时钟频率设置多小或多大都可以正常工作只是屏幕的刷新变化。这里的死等循环是不是需要设置为状态机比较好。