上篇文章,花了很大的力气用直接访问内存的方式实现了跑马灯。那么在
CC3220学习笔记---ROM Services
这篇文章中,我们得知,TI公司为CC3220实现了一个外设驱动库
driverlib API,专门用于此MUC的使用。此驱动库可在RAM中调用,也可在ROM中直接调用。那么今天我们就用驱动库的这两种调用方式直接实现跑马灯。
使用上篇文章创建工程的方式无法访问驱动库,搞半天也不得法。最后没办法,只能在现有工程基础上写程序了。这些细节以后有机会再弄清楚吧。
一、导入example项目【timerled】
在菜单中单击【Project】-->【Import CCS Projects】,单击【Browse】按钮,选择【C:\ti\simplelink_cc32xx_sdk_1_30_01_03\examples\rtos\CC3220SF_LAUNCHXL\drivers\timerled\tirtos\ccs】文件夹,然后单击【finish】按钮将timeled项目导入Project Explorer。
在Project Exploer中的【timerled】项目上点右键,选择【Copy】菜单,然后在Project Exploer空白处右键选择【Paste】菜单,在弹出的窗口中,填入新项目的名称“demo_gpio_lib”。点确定后,生成一个新的项目。
展开拷贝过来的项目,删!删!删!,最后剩下如下图所示文件:
打开【main_tirtos.c】文件,删除里面的代码,然后拷贝如下代码:
#include <ti/devices/cc32xx/inc/hw_memmap.h>
#include <ti/devices/cc32xx/inc/hw_types.h>#include <ti/devices/cc32xx/driverlib/gpio.h>
#include <ti/devices/cc32xx/driverlib/pin.h>
#include <ti/devices/cc32xx/driverlib/prcm.h>void delay(int temp)
{int i = 0;for (i = 0; i < temp; i++);
}int main(void)
{//开启GPIOA1时钟PRCMPeripheralClkEnable(PRCM_GPIOA1, PRCM_RUN_MODE_CLK);//设置3个LED引脚为输出方向GPIODirModeSet(GPIOA1_BASE, 0x0E, GPIO_DIR_MODE_OUT);//配置3个LED引脚为GPIO,电流强度为2mAPinTypeGPIO(PIN_64, PIN_MODE_0, false);PinTypeGPIO(PIN_01, PIN_MODE_0, false);PinTypeGPIO(PIN_02, PIN_MODE_0, false);int flag = 2;while(1){//写GPIOGPIOPinWrite(GPIOA1_BASE, 0x0E, flag);flag = (flag == 8) ? 2 : flag << 1;delay(0xfffff);}
}
编译,运行,跑马灯实现。这次时间调快了些。代码我就不细讲了,和寄存器版基本一样,只是拿库函数替代了寄存器的直接访问,这些函数也就是实现访问寄存器的功能。这个版本的代码访问的是RAM内的库函数。
下面来实现访问ROM内库函数版本的跑马灯,其实很简单,首先包含以下头文件:
#include <ti/devices/cc32xx/driverlib/rom.h>
#include <ti/devices/cc32xx/driverlib/rom_map.h>
然后给库函数加上“MAP_”前缀。
最终代码如下:
#include <ti/devices/cc32xx/inc/hw_memmap.h>
#include <ti/devices/cc32xx/inc/hw_types.h>
//这两行为新添加的头文件
#include <ti/devices/cc32xx/driverlib/rom.h>
#include <ti/devices/cc32xx/driverlib/rom_map.h>#include <ti/devices/cc32xx/driverlib/gpio.h>
#include <ti/devices/cc32xx/driverlib/pin.h>
#include <ti/devices/cc32xx/driverlib/prcm.h>void delay(int temp)
{int i = 0;for (i = 0; i < temp; i++);
}int main(void)
{//开启GPIOA1时钟MAP_PRCMPeripheralClkEnable(PRCM_GPIOA1, PRCM_RUN_MODE_CLK);//设置3个LED引脚为输出方向MAP_GPIODirModeSet(GPIOA1_BASE, 0x0E, GPIO_DIR_MODE_OUT);//配置3个LED引脚为GPIO,电流强度为2mAMAP_PinTypeGPIO(PIN_64, PIN_MODE_0, false);MAP_PinTypeGPIO(PIN_01, PIN_MODE_0, false);MAP_PinTypeGPIO(PIN_02, PIN_MODE_0, false);int flag = 2;while(1){//*((volatile unsigned long *)(0x40005000 + 0x038)) = flag;MAP_GPIOPinWrite(GPIOA1_BASE, 0x0E, flag);flag = (flag == 8) ? 2 : flag << 1;delay(0xfffff);}
}
编译,运行。实现同样的功能。