NXP FRDM-MCXN236开发板ST7789屏幕实践

【DigiKey好物畅享】NXP FRDM-MCXN236开发板ST7789屏幕实践.docx (546.3 KB)

前言

上一期我们使用了 FRDM-MCXN236 开发版完成了 PulseSensor 的使用,从 ADC 与 CTIMER 模块入手窥见了这款开发版丰富的功能。这一次,我将移植之前在 STM32F103 上实现的简易 ST7789 驱动,并借此探索这款 MCU 的性能潜力。

驱动硬件抽象层

之前所写的 ST7789 驱动是将硬件抽象层与驱动分离开的,这使得我们的移植非常方便。硬件抽象层主要由各个模块的初始化与去初始化、发送指令(SPI)、引脚的输出电平控制组成的。其中,本次我们主要关注 SPI 的配置,其他地方将简略介绍。

引脚配置

由于篇幅限制,这里只给出引脚的连接表:

屏幕 单片机 功能
SDI P4_0 SDO 主机发、从机收
SDO P4_2 SDI 主机收、从机发(本驱动事实上未用到)
CS P4_3 PCS(0) 片选信号控制
SCK P4_1 SCK SPI时钟信号
LED P1_5 控制屏幕背光开启/关闭
DC P1_7 控制屏幕处于数据/指令接收模式
RST P1_19 屏幕复位

SPI 配置

基础配置

我们选用的是 FLEXCOMM2 模块,并使用 CMSIS SPI API 来使用 SPI,其底层是 LPSPI 驱动。
最基础的配置就是使用 Interrupt 模式、12MHz 时钟频率(FLEXCOMM模块的默认时钟)、500000bps(默认波特率,可以说相当保守了),片选信号将由模块自动处理(PCS)。综上,可以把所有模块初始化的函数都导向统一的 InitPins 函数(由配置工具管理),SPI 发送函数的实现调用 CMSIS SPI API 即可。
完成上述配置后,在主程序里调用便可以点亮屏幕并显示内容。不过填充屏幕时即可发现,速度不是一般的慢,所以我们接下来要探索一下这块板子的潜力了。

eDMA

我们都知道,STM32 上具有 DMA 模块,在 MCXN236 上一样也是有的,即 eDMA 模块。eDMA 模块可以帮助快速搬移数据,减少 CPU 的压力。要启用 eDMA 模式,只需要在配置工具中开启 DMA0 外设,并将 SPI 外设的工作模式修改为 eDMA 即可。
开启之后,就可以观察到刷新速度相比中断模式快了很多,但是仍然不够快,波特率设置的太保守了,能不能再快点呢?

时钟超频

还记得上一篇文章中提到的时钟配置吗?借助配置工具,时钟配置起来十分简单。通过观察 FLEXCOMM 模块的时钟来源可知,FLEXCOMM模块的默认时钟源来自于 FRO_12M,仅能提供 12MHz 的时钟,这还没有 STM32F103 APB2 的默认时钟快呢。但是我们可以选择 pll_clk_div 作为时钟源,pll_clk_div 可以提供 pll0_clk (150MHz) /1 (分频系数为1) 的时钟(即 150MHz),由此我们切换到 pll_clk_div 作为源,在进行 CLKDIV 分频之后就可以作为 FLEXCOMM 模块的时钟源了。

经过测试,在分频系数为 /2 (75MHz) 时 SPI 仍可以正常工作,不过 ST7789 处理能力有限,其实开到 /3 (50MHz) 即可,重新设置波特率,就可以发现现在刷屏速度非常之快。

总结

经过对 ST7789 驱动移植的探索,我深深的体会到了这款开发板的功能与性能之强大。在未来,这款开发版一定能借助其出色的扩展性与强大的性能大有所为。