今天起晚了,大约吃了午饭开始干的活.....
主要完成了 微雪2.9寸电子墨水屏的代码迁移。 官方提供的代码是 基于STM32F103的,我对他进行了 代码的迁移,使之能运行在Stm32F407上。 这里是代码的下载地址。
墨水屏是从立创商城上买的,正常价格大概100元左右。 商城活动 大约 40块钱入手
这是刚来的时候的样子,排线让我弄丢了,直接拆了插槽 把杜邦线焊上去了、、、、
这是 运行demo 时候的样子
墨水屏看起来真的很好看。 进入正题,代码的迁移:
毫无疑问第一步肯定是修改 IO了,我在 readme 文件里面看到了引脚的定义。 这款屏一共用到了六个IO 其中四个是通用IO
两个是作为 SPI协议的 MOSI 和CLK线的 虽然这款屏是标准的 四线SPI,但是屏幕貌似是不需要给单片机回传什么数据的,所以我们只是需要用到 MOSI 和clk线,当然 CS 和GND 也少不了的。在STM32F4的程序中,我借鉴了 正点原子的 SPI实验,其中对于SPI的配置是用的 SPI1 对应IO 分别是 PB3 PB4 PB5 ; PB3是CLK; PB5 是 MOSI ; PB4 暂时没有用到。
通用IO方面没什么好说的,就是拉高拉低,我在最小系统板上面选取了几个 相对不是很重要的,距离PB3 PB5 比较近的IO
避开了可能用到的 PD2 和PD5 我选择了 PD0 PD1 PD3 PD4 这四个通用IO 作用如下
初始化代码如上,其中要注意的是 busy 引脚是输入引脚, 单片机需要读取这个引脚的状态判断 墨水屏是否忙
其余引脚是输出引脚。
针对于官方给出的 一些IO操作的部分,我给修改成了 寄存器的位带操作。
因为我只用一款屏幕所以没有去考虑后期的迁移等问题。。。 这里只是简单粗暴的修改了最底层的 IO操作代码
这里 有一点和官方的有一点区别
针对于官方代码的 UBYTE 我没有使用 宏定义去修改 而知直接查找 替换。。。 这一点确实有一点欠考虑了 以后代码可能会比较混乱吧
官方的debug 语句 我感觉用不上,也懒得去删除 于是 我用了这种方法
这里切记一点就是不要去替换 整个工程!!!这里切记 会出很多错误的! 你猜我咋知道的。。。
在处理完了这一部分的问题以后 接下来的问题就是 官方代码的编码风格。
这样的编写代码的方式,我一开始 并不知道怎么去解决,只能 一个一个的去改,将变量的声明拖到代码的头部去。在写这篇博客的时候才发现了原来是这里!
官方的代码,勾选了C99 的格式、、、、 而且编译起来确实是没有问题的
当我发现 可以通过勾选这个 C99 解决问题的时候我已经完成了 将变量声明拖到 函数前面去。 这算的上是一个新的发现。
接下来 我又遇到了报错
bing 上搜索了一下 发现了我想要的答案 解决方法连接
这个问题解决了,问题产生的原因大概就是因为官方代码里面的调试部分 printf 出了问题。
接下来的一个问题时程序不运行发现程序卡死在串口的发送部分, 得了 调试屏幕用到的串口还没初始化
初始化完了串口 程序总算是可以跑起来了
串口调试起来还确实是挺方便的,我之前一直都用OLED作为调试工具的,看样子以后要多试试串口
通过查找问题 错误提示 我找到了问题所在,官方代码还非常好心的提示了可能会有堆内存不够的情况
很明显 这里是 malloc 肯定用的是堆内存 heap
总结: 今天遇到的bug 主要是 程序的编译部分, C99 这个问题可以避免
另外就是 UBYTE 转换成 u8 今天做的欠考虑了 可以直接宏定义转的
然后就是堆栈 堆是程序员 可以分配的,栈是编译器操作的
欢迎指出问题,如果您在迁移代码时候遇到了问题我也会尽量帮忙。
后续可能会考虑迁移一些其他的代码进去,比如显示 double HEX bin 之类的数字,暂时还是就这样吧,有需求了再去尝试