美文网首页
灯厂们背后的MCU,看LPC如何花式点灯(之二)

灯厂们背后的MCU,看LPC如何花式点灯(之二)

作者: MagicoePaper | 来源:发表于2020-07-26 14:13 被阅读0次

    上一篇,我们介绍了WS281x系列LED灯的基本属性,驱动方法以及如何用SPI的方式点WS281x灯带。这一篇是开始介绍如何用EZH,双核以及SCT的方式实现,最后做一个四种方式的优缺点的总结以及花式流水灯。

    EZH介绍

    EZH是LPC家族的一个特色IP,类似一个超精简的内核,强在单周期控制GPIO,独立于ARM内核之外运行,可以“比较方便的”实现串/并行接口,数据搬移转换(类似DMA),弱点就是只能写汇编且需要借助KEIL或者MCUXpresso等IDE帮助生成机器码,一夜回到了51编程的时代。

    EZH实现WS2812 数据发送

    在介绍EZH代码前,我们先要交代下,EZH作为一个内核需要有运行代码的空间,一般来讲Flash肯定给了MCU的主核运行代码了,所以EZH智能偏安到一块小的RAM区域里了,这也是为什么LPC55系列的MCU有多个RAM区块。代码中我们通过编译器的attribute((setion("EZH_SECT")))来把EZH的代码分配到EZH_SECT这个区域运行,所以在实际的工程中我们要在.sct分散加载文件中设定这个EZH_SECT区域,最后实际工程会有介绍。

    EZH代码通过分散加载设定到RAM中运行

    程序我们附在这论坛的帖子中,基本都是中文注释,理解起来应该不难,这里我们贴下程序执行的流程图,帮助各位看官消化。


    EZH数据发送流程图

    实际程序中,我们会把这段EZH代码封装成库,如下图所示。直接调用我们声明的EZH_WS2812这个函数即可。

    在工程的分散加载文件中,我们需要在声明一个EZ_SECT的RAM区域,在KEIL IDE中如下:


    分散加载文件中的EZ_SECT段

    这一段说明了EZH_SECT段起始在0x20040000,大小为0x00020000。
    看官可以在KEIL工程的配置选项的中找到sct文件,手动修改即可。


    KEIL下修改分散加载sct文件

    实际工程代码实现

    在实际的工程中,我们统一了WS2812数据发送的API,即WS2812_StripShow(),我们只要把EZH实现数据发送的相关功能填写进这个函数即可,
    在开始EZH发送之前,我们先要停止EZH这个外设EZH_Stop(),然后完成EZH初始化EZH_Init(),初始化完成后别忘了配置对应的IO口为EZH模式。
    完成EZH相关配置后,我们需要把实际的WS2812数据发送长度(按byte计算的)填写进WS2812TxBuf。
    设定好EZH的栈空间,以及将WS2812TxBuf传递给EZH。
    最后调用EZH_Boot()启动EZH发送数据功能,完成一次WS2812等待灯带数据发送。


    WS2812 显示函数

    点灯

    在点灯实现上,我们所有的demo代码都是统一API的
    WS2812_StripInit() 初始化WS2812点灯的功能
    WS2812_StripClear() 清空WS2812数据组
    WS2812_StripPixelSet(n, color, bn) 设置第n个灯显示颜色color,亮度为bn,最终的颜色数据会放到WS2812数据组
    WS2812_StripShow() 发送WS2812数据组


    WS2812点灯工程API例程

    相关文章

      网友评论

          本文标题:灯厂们背后的MCU,看LPC如何花式点灯(之二)

          本文链接:https://www.haomeiwen.com/subject/oxewlktx.html