CC3220开发板

来源:互联网 发布:游泳馆预约软件 编辑:程序博客网 时间:2024/06/04 23:24
思前考后,还是得从底层学起,弄清楚芯片。先要在TI-RTOS下搞清楚,再转到Zephyr。问题是TI-RTOS不支持CC3200,仅FreeRTOS支持它。TI-RTOS已经弄过一段,还算有点熟,再花时间学FreeRTOS感觉不太值得。所以还是搞一块CC3220来学吧。TI-RTOS支持它,也是TI最新的低功耗无线WIFI MCU。想来CC3200应该还是有些问题的,要不不会这么快就出新的解决方案来替代它。我买的是CC3220SF-LAUNCHXL开发板,它和CC3200最大的区别是MUC内置了一块1M的Flash,相信用起来会方便些。这几天在看CC3220的文档,前段翻译了大量英文文档,现在看英文文档感觉轻松很多,值得高兴的一件事。

在看到《SimpleLink? Wi-Fi? and Internet of Things CC3220 Programmer's Guide》文档时,其中有一章的内容为CC3220 ROM Services,看完这一章,解除了我之前学Zephyr的关于CC3200源码时的疑惑。所以还是把这一章翻译出来吧。当然,其中会加入大量其它文档的相关内容。

第6章 CC3220 ROM Services
CC3220 ROM是bootloader(引导程序)和外设驱动库的寄主。外设驱动库是抽象外设编程的程序集。此库可由ROM提供,以给开发者一个减少应用程序RAM占用的选项。

ROM内的外设驱动库(driverlib)所对应的库版本为1.50.1.00。

Bootloader服务可让用户升级应用程序的二进制镜像文件以及其它在串口flash上的用户文件,还负责从串口flash向MCU RAM装载用户应用程序。

6.1  CC3220 Bootloader
CC3220 bootloader内置于应用处理器的ROM内。它负责以下操作:
  • 更新和下载 --- bootloader让开发者可以将应用程序镜像文件从PC下载至CC3220设备(串口flash)。bootloader下载功能在主板处于UARTLOAD sense-on-power(SOP)模式时才能触发。
  • 引导程序 --- bootloader还负责在串口flash(对于CC3220设备来说)中扫描有效的应用程序二进制镜像文件,然后将其加载入内部RAM,并将执行控制权转给用户程序。

6.1.1  Bootloader模式 --- 受设备的SOP引脚影响

CC3220设备有三个SOP引脚。详细功能说明请参考CC3220x MCU Data Sheet。在引导程序上下文中,有三种模式:


  •  仅下载 --- 此模式对应SOP[2:0]的值为0b100,它让bootloader进入下载模式。此模式等待正在编程中的应用程序向UART发送的一个断点信号,接下来会将应用程序的一个镜像序列下载进设备的串口flash。
  • 下载/执行 --- 此模式对应SOP[2:0]的值为0b010。用户可在此模式下下载应用程序并执行它。
  • 执行 --- SOP[2:0]的值为0b000。对于CC3220S和CC3220设备来说,它会使bootloader将应用程序镜像从串口flash加载至MCU内部RAM。对于CC3200SF来说,bootloader会跳转至片内flash的应用程序镜像,并执行它。(这么说来,对CC3200、CC3220和CC3220S来说,程序是放在RAM上执行的;而对CC3220SF来说,程序是放在1M片内flash上执行的,这样可给RAM留更大的空间)。

——————————————————————————————
注意:
SOP设置为010或100需要镜像正通过UART进行编程。在开发和调试期间,可使用此SOP模式。

但是,一旦完成编程,在将设备变成最终产品前,TI推荐将SOP设置为000。如果设备不处于SOP的000状态,主机恢复出厂设置将可能不会在一个安全的方式下工作。以下列出了SOP的010或100模式的局限性和解决方法。

对于CC3220设备来说,如果SOP配置为010或100,将会出现下列情况:
局限:
  • 主机请求恢复到出厂设置
  • 如果在恢复出厂设置的过程中发生设备重启,设备可能会进入卡住状态。
解决方法:
  • 将SOP设为000。
  • POR设备,直到恢复出厂设置成功完成。(太坑爹了,啥叫POR?
——————————————————————————————

6.1.2  Bootloader和用户应用程序 --- 共享MCU RAM
bootloader使用了一部分MCU RAM用于自己的执行。对于CC3220S和CC2330变体来说,这部分RAM的数量是16KB,也就是说用户的应用程序镜像的大小对于256-KB MUC RAM来说,被限制为240KB。而CC3220SF变体的应用程序镜像被放置在片内flash中,应用程序可使用整个SRAM。对于开发者来说,在CC3220S和CC2330变体中工作有几个关键点:
  • MCU RAM地址0x20000000至0x20003FFF:此区域由应用程序和bootloader共享。开发者仅能定位应用程序数据段,因为数据段不是应用程序镜像的一部分。这确保了当bootloader在从串口flash加载应用程序镜像至RAM时,此内存区域由bootloader独占。一旦bootloader启动了应用程序,此内存区域就可用于应用程序数据段。
  • RAM地址0x2000400至结尾:此RAM区域为应用程序独占。应用程序镜像将常驻此区域,并开始于0x20004000。

6.2  ROM中的CC3220外设驱动库服务
外设驱动例程由CC3220 MCU ROM提供。这些例程的源码以及它们的项目文件,也可以在CC3220 SDK中作为一个库(driverlib)使用。开发者可选择将应用程序链接至这些例程中的任何一个。

本节聚集于如何使用这些例程,如何修补及扩展现在例程。TI推荐从ROM中使用这些例程,因为这节省了RAM空间。如果需要对这些例程进行任何修改,开发者可在库中进行修改,并将应用程序链接到修改后的库。

6.2.1  ROM的外设访问
ROM API由ROM映射的一块固定区域索引,它允许将来扩展并保持向后兼容。在将来版本的ROM中的API位置可能会改变,但API表将保持不变。

共有两级索引,这意味着在ROM中共有两个表来决定每个支持的API的入口点。主表针对每个外设有一个指针指向第二张表,第二张表又包含了针对那个外设的每个API的指针。

主表位于ROM地址0x0000040C。表6-1和表6-2列出了API表的一小部分。

 ROM_INTERRUPT表的内存地址为0x0000041C。ROM_intMasterEnable()函数在此表基础上位移0x4。在函数文档中,ROM_API_TABLE是一个位于0x0000040C的指针数组。

ROM_INTERRUPT表是位于ROM_API TABLE[4]的一个指针数组。
ROM_IntMasterEnable是一个位于ROM_INTERRUPT TABLE[1]的函数指针。

下面是位于【C:\ti\simplelink_cc32xx_sdk_1_30_01_03\source\ti\devices\cc32xx\driverlib】的【rom.h】文件中的ROM_API TABLE源码:
#define ROM_APITABLE            ((unsigned long *)0x0000040C)#define ROM_VERSION             (ROM_APITABLE[0])#define ROM_UARTTABLE           ((unsigned long *)(ROM_APITABLE[1]))#define ROM_TIMERTABLE          ((unsigned long *)(ROM_APITABLE[2]))#define ROM_WATCHDOGTABLE       ((unsigned long *)(ROM_APITABLE[3]))#define ROM_INTERRUPTTABLE      ((unsigned long *)(ROM_APITABLE[4]))#define ROM_UDMATABLE           ((unsigned long *)(ROM_APITABLE[5]))#define ROM_PRCMTABLE           ((unsigned long *)(ROM_APITABLE[6]))#define ROM_I2CTABLE            ((unsigned long *)(ROM_APITABLE[7]))#define ROM_SPITABLE            ((unsigned long *)(ROM_APITABLE[8]))#define ROM_CAMERATABLE         ((unsigned long *)(ROM_APITABLE[9]))#define ROM_FLASHTABLE          ((unsigned long *)(ROM_APITABLE[10]))#define ROM_PINTABLE            ((unsigned long *)(ROM_APITABLE[11]))#define ROM_SYSTICKTABLE        ((unsigned long *)(ROM_APITABLE[12]))#define ROM_UTILSTABLE          ((unsigned long *)(ROM_APITABLE[13]))#define ROM_I2STABLE            ((unsigned long *)(ROM_APITABLE[14]))#define ROM_HWSPINLOCKTABLE     ((unsigned long *)(ROM_APITABLE[15]))#define ROM_GPIOTABLE           ((unsigned long *)(ROM_APITABLE[16]))#define ROM_AESTABLE            ((unsigned long *)(ROM_APITABLE[17]))#define ROM_DESTABLE            ((unsigned long *)(ROM_APITABLE[18]))#define ROM_SHAMD5TABLE         ((unsigned long *)(ROM_APITABLE[19]))#define ROM_CRCTABLE            ((unsigned long *)(ROM_APITABLE[20]))#define ROM_SDHOSTTABLE         ((unsigned long *)(ROM_APITABLE[21]))#define ROM_ADCTABLE            ((unsigned long *)(ROM_APITABLE[22]))#define ROM_CPUTABLE            ((unsigned long *)(ROM_APITABLE[23]))
可以看到,数组的第一个元素用来放版本号了。其中每个外设占用一个元素位置,用来存放另一张表的指针。

下面列出的则是对应ROM_INTERRUPTTABLE的部分API
//*****************************************************************************//// Macros for calling ROM functions in the Interrupt API.////*****************************************************************************#if defined(USE_CC3200_ROM_DRV_API) || \    defined(USE_CC3220_ROM_DRV_API)#define ROM_IntEnable                                                         \        ((void (*)(unsigned long ulInterrupt))ROM_INTERRUPTTABLE[0])#endif#if defined(USE_CC3200_ROM_DRV_API) || \    defined(USE_CC3220_ROM_DRV_API)#define ROM_IntMasterEnable                                                   \        ((tBoolean (*)(void))ROM_INTERRUPTTABLE[1])#endif#if defined(USE_CC3200_ROM_DRV_API) || \    defined(USE_CC3220_ROM_DRV_API)#define ROM_IntMasterDisable                                                  \        ((tBoolean (*)(void))ROM_INTERRUPTTABLE[2])#endif#if defined(USE_CC3200_ROM_DRV_API) || \    defined(USE_CC3220_ROM_DRV_API)#define ROM_IntDisable                                                        \        ((void (*)(unsigned long ulInterrupt))ROM_INTERRUPTTABLE[3])#endif
每个数组元素都存放一个API指针。

6.2.2  将用户应用程序链接至ROM API
下列步骤描述了如何使用ROM driverlib API而不是RAM API。这些步骤适用于所有使用driverlib API的源码及项目文件。
——————————————————————————————
注意:以下步骤针对应用程序以及被应用程序所使用并依赖的库及项目。这些被应用程序所使用的库可能是simplelink、oslib、netapps、osal_tidrivers、ti_drivers和netapps库(http、mqtt、json、smtp、tftp、xmpp)。
——————————————————————————————
1. 在所有使用driverlib API的.c文件中顺序包含以下头文件:
#include "rom.h"
#include "rom_map.h"
2. 为所有项目文件添加全局预处理定义USE_CC3220_ROM_DRV_API。
3. 使用MAP_APIname而不是 APIname来调用所有的API。例如,使用MAP_UARTCharPut而不是 UARTCharPut。任何的更改或添加都应遵循此方法。
4. 重新编译所有相关库及项目。

6.2.3  给ROM API打补丁
以下步骤有选择地给ROM driverlib API打补丁。“打补丁”在此处表示使用RAM driverlib API而不是ROM driverlib API。
1. 为所有需要打补丁的API在【\driverlib\rom_patch.h】文件中添加一个入口。例如,为MAP_UARTCharPut和 AP_UARTBreakCtl打补丁,则在rom_patch.h文件添加如下条目:
#undef ROM_UARTCharPut
#undef ROM_UARTBreakCtl
2. 重新编译所有使用driverlib API的相关项目。

6.2.4  链接至基于RAM的外设驱动库
脱离ROM driverlib API转而使用RAM driverlib API,使用以下步骤:
1. 在所有使用driverlib API的项目文件中移除全局预处理定义 USE_CC3220_ROM_DRV_API。
2. 重新编译所有使用driverlib API的项目。

0 0
原创粉丝点击