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

作者: jasonwangse
上传时间为: 2017-11-14 08:49 AM
2017-11-14
阅读:

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驱动了:

  1. 首先需要在代码中直接或者间接地包含SDK中的common/chip/chip.h文件
  2. 在代码中定义一个类型为(I2C_HANDLE_T *)的句柄,用来存放API返回的I2C设备描述符
  3. 在代码中开辟一段内存用来给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

相关经验
作者其它经验
全部评论 ()
条评论
写评论

创建讨论帖子

登录 后参与评论
系统提示