上节课使用了driverlib API来实现了LED灯的点亮,在实际开发中,不可能这样写程序,效率太低。这时就需要把硬件的各种行为抽象出来,帮助开发人员更容易地,更符合人类思维的方式进行操作。
首先理解CC3220 SDK源码的架构,下面是目录结构:
一共这五个文件夹,展开后:
- 【devices】目录下的是最底层驱动,它直接跟硬件打交道。ROM内存放的API就是这一块,上篇日志我们使用的就是这里的函数。
- 【drivers】目录则是在最底层API的基础上进行包装,抽象出MCU的各种行为,方便开发人员使用。这里打个比方吧。比如接电话这个行为可分解为如下步骤:电话铃响-->接通电话-->通话-->挂电话。电话铃响、接通电话、通话、挂电话这些单独的动作组合在一起才成为“接电话”这个行为。drivers层的作用就是把devices层的单独动作组合成具体行为,供开发者使用。
- 【boards】从文件命名来看drivers层针对的是CC32XX系列的MCU,应该就是现有的CC3220、CC3220S、CC3220SF三款。三款功能绝大部分相同,只有少数差异,那么drivers层包含的仅为这几款MCU的相同部分的功能。另外,我们知道,大部分引脚是可以复用的。每个人拿到相同的芯片做的事情不一样,从而设计的开发板并不相同,甚至天差地别。所以这时就需要boards这一层,专门针对特定的开发板,在drivers层的基础上做进一步抽象,以方便开发人员使用。所以这一层文件的命名都以开发板为前缀,它也仅针对特定开发板使用。
今天,我们使用【drivers】层库函数来实现LED灯点亮。首先得分析GPIO相关部分源码。
一、GPIO_PinConfig
首先打开【drivers】根目录下的【GPIO.h】文件,首先找到这个声明:
/*!
* @brief GPIO pin configuration settings
*
* The upper 16 bits of the 32 bit PinConfig is reserved
* for pin configuration settings.
*
* The lower 16 bits are reserved for device-specific
* port/pin identifications
*/
typedef uint32_t GPIO_PinConfig;
一个引脚的名称、分组、GPIO配置信息都被包含在了这个32位整数GPIO_PinConfig里面了。它的高16位用于存放GPIO配置信息,而低16位用于存放引脚标识。下面分别讲解:
1、引脚标识
打开 【drivers】-->【gpio】下的GPIOCC32XX.h文件,找到下述代码:
//引脚为空
#define GPIOCC32XX_EMPTY_PIN 0x0000
//GPIO A0 port下的8个引脚
#define GPIOCC32XX_GPIO_00 0x000