查看: 1742|回复: 0

【LPC824Lite试用】2.再也不用被寄存器折磨了——ROM API

[复制链接]
  • TA的每日心情
    开心
    2018-6-21 08:39
  • 签到天数: 8 天

    连续签到: 2 天

    [LV.3]偶尔看看II

    发表于 2017-11-14 08:49:44 | 显示全部楼层 |阅读模式
    分享到:
    LPC824还有一个引人注目的地方,就是它提供了片内ROM驱动的支持。看到评测报告中“I2C和UART底层驱动不再占用闪存空间,操作这些外设时只需简单地调用API”的字样时,我真的是眼前一亮,这也是我申请这款开发板的一个主要原因。因为以前从来没接触过这种方式的驱动,感觉很神秘的样子。
    在网上没找到使用方法的相关文章,结果就在我查芯片资料的时候,惊喜地发现:原来ROM驱动的使用方法竟然在芯片的User Manual中!原本以为这种手册只会介绍硬件框架和寄存器,没想到竟然有ROM API的C使用说明。
    https://www.nxp.com/docs/en/user-guide/UM10800.pdf

    再仔细看SDK,发现里面居然也提供了ROM驱动demo,编了一个EEPROM的demo运行了一下没问题,这下用起来就有更底气了。

    仔细看了下代码和手册,发现ROM驱动其实就是固化在ROM固定地址的一段代码,使用的时候只需要知道API的地址和调用格式、用指针的方式调用就可以了,和普通firmware的API区别不大,但是看不到源码。以I2C为例,只需要以下步骤就可以使用它的ROM驱动了:

    • 首先需要在代码中直接或者间接地包含SDK中的common/chip/chip.h文件

    • 在代码中定义一个类型为(I2C_HANDLE_T *)的句柄,用来存放API返回的I2C设备描述符

    • 在代码中开辟一段内存用来给ROM API使用,具体大小可以通过i2c_get_mem_size获得
    然后就可以使用I2C对应的ROM API了,只需要看看User Manual中各个API的使用方法说明就能很方便地用起来,再也不用去关心硬件到底有哪些寄存器、每一位都代表了什么、初始化顺序是什么、中断来了该如何处理。。。这些细节了,比如I2C的ROM驱动提供了以下API

    最后,写完了I2C驱动,上层驱动只需要调用I2C标准的读、写、写+读三个接口就能完成EEPROM的读写了。调试中还发现了一个小问题,我写了一个写EEPROM然后回读比较的测试代码,但是我读4字节,最后只能读回3个字节,然后我依次试验了3、2字节,都是少一字节。

    最后定位发现,当要读取字节数大于1的时候,调用ROM驱动的API——i2c_master_tx_rx_intr时,传参的num_bytes_rec需要比期望的字节数多1,才能读回指定的字节数;要读取字节数等于1的时候,num_bytes_rec加不加1没有影响。这点和手册里的描述不一致,有可能是ROM API里缺少了dummy read的bug。

    改正了调用方式后,测试就正常了。

    至此,LPC824 ROM驱动的神秘面纱也揭开了,使用起来感觉确实方便不少。有她显而易见的优点:和调用普通firmware的API一样,而且不需要你去把firmware移植到工程中编译,也不会占用户的ROM空间;不过缺点也不是没有:没办法升级(也可能是我还没找到升级的办法),看不到源码不能用JTAG调试。总得来说,如果ROM驱动开发得足够好,确实能给用户带来不少便利,尤其是类似CortexM0+这种ROM空间有限的低端芯片,不占用户的代码空间还是很有吸引力的。
    附件中有打包的工程
    LPC824Lite-uCOS-III-2.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /5 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-12-20 22:34 , Processed in 0.125986 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.