CC3220开发板

思前考后,还是得从底层学起,弄清楚芯片。先要在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的项目。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
CC2540是一款蓝牙低功耗芯片,可以用来实现蓝牙设备的开发。在进行开发之前,需要先了解CC2540开发的使用方法。 首先,我们需要准备一个CC2540开发,如下图所示: ![CC2540开发](https://img-blog.csdn.net/20180416113413996?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JhaW5ib3g=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/80) 接下来,我们将通过点亮LED来进行简单的实验。 首先,我们需要连接开发和电脑,如下图所示: ![连接开发和电脑](https://img-blog.csdn.net/20180416113643557?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JhaW5ib3g=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/80) 然后,我们需要安装CC2540开发环境。可以通过以下网址下载并安装:https://www.ti.com/tool/CCSTUDIO。 在安装完成后,打开CCS,点击File -> New -> CCS Project,如下图所示: ![新建CCS Project](https://img-blog.csdn.net/20180416114258105?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JhaW5ib3g=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/80) 然后,选择CC2540,如下图所示: ![选择CC2540](https://img-blog.csdn.net/20180416114402654?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JhaW5ib3g=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/80) 接下来,填写项目名称和路径,如下图所示: ![填写项目名称和路径](https://img-blog.csdn.net/20180416114500558?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JhaW5ib3g=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/80) 然后,选择SimpleBLEPeripheral,并设置为Debug状态,如下图所示: ![选择SimpleBLEPeripheral](https://img-blog.csdn.net/20180416114647467?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JhaW5ib3g=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/80) 在完成以上步骤后,我们就可以开始进行编程了。 首先,打开SimpleBLEPeripheral.c文件,并在main函数中添加以下代码: ``` // P1.0口输出高电平,点亮LED P1DIR |= BIT0; P1OUT |= BIT0; ``` 然后,点击Project -> Build Project进行编译,在编译完成后,点击Debug -> Debug Active Project进行调试。 最后,我们就可以看到LED点亮了!如下图所示: ![LED点亮](https://img-blog.csdn.net/20180416115558662?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JhaW5ib3g=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/80) 以上就是CC2540开发学习笔记的第一篇,希望对大家有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值