CC3200的所有数字引脚和部分模拟引脚可作为通用输入/输出(GPIO)使用,GPIO分为4组(GPIOA0~3),每组8个(具体引脚分配参见表D.1)。
● GPIOA0:GPIO_00~GPIO_07,对应GPIOA0.0~GPIOA0.7。
● GPIOA1:GPIO_08~GPIO_15,对应GPIOA1.0~GPIOA1.7。
● GPIOA2:GPIO_16~GPIO_23,对应GPIOA2.0~GPIOA2.7。
● GPIOA3:GPIO_24~GPIO_31,对应GPIOA3.0~GPIOA3.7。
CC3200 GPIO具有下列特性。
● 根据功能引脚的配置不同,GPIO的数量多达27个。
● 所有GPIO引脚具有中断能力。
✧ 电平有效或边沿有效。
✧ 上升沿或下降沿。
✧ 可选择中断屏蔽。
● 可以用于触发DMA操作。
● 可选择作为唤醒源。
● 可编程引脚配置。
✧ 内部10μA上拉或下拉。
✧ 2 mA、4 mA、6 mA、8 mA、10 mA、12 mA、14 mA可配置驱动能力。
✧ 开漏模式。
● 可通过高速内部总线矩阵进行GPIO寄存器读操作。
GPIO示例程序在“example\blinky”目录中,Blinky项目CC3200 LaunchPad电路如图3.1所示。
图3.1 Blinky项目CC3200 LaunchPad电路图
两个用户按键SW2和SW3分别通过GPIO_22(PIN_15)和GPIO_13(PIN_04)与CC3200相连,按键未按下时GPIO为低电平,按键按下时GPIO为高电平。
3个用户LED D5~D7分别通过驱动电路和GPIO_11(PIN_02)、GPIO_10(PIN_01)和GPIO_09(PIN_64)与CC3200相连,GPIO输出低电平时LED熄灭,GPIO输出高电平时LED点亮。
(1)将CC3200 LaunchPad通过USB线与PC连接。
(2)参考2.1.2节中的“CCS使用”,将Blinky项目导入CCS,在“Project Explorer”(项目浏览器)视图中可以看出,Blinky项目包含下列4个程序文件。
● main.c:主程序文件。
● pinmux.c:PinMux应用程序生成的GPIO引脚配置程序文件。
● gpio_if.c:GPIO接口驱动程序文件。
● startup_ccs.c:CCS启动程序文件。
Blinky项目程序流程图如图3.2所示。
图3.2 Blinky项目程序流程图
(3)在CCS中单击“Project”(项目)→“Properties”(属性)或右击“Project Explorer”(项目浏览器)中的Blinky项目,在弹出菜单中单击“Properties”(属性),打开“属性”对话框,确认“Device”(器件)选择CC3200,选择“Compiler version”(编译器版本)为TI v5.2.2,参见图2.17。
(4)单击“View”(视图)→“Target Configuration”(目标配置),打开“目标配置”视图,确认默认的目标配置为CC3200.ccxml,如图3.3所示。
图3.3 Blinky项目“目标配置”视图
(5)在 CCS 中单击“Run”(运行)→“Debug”(调试)或按“F11”键,CCS首先编译生成目标文件blinky.out,然后将目标文件blinky.out下载到CC3200并进入调试界面。
(6)单击“Run”(运行)→“Resume”(运行)或单击调试工具栏中的“Resume”(运行)按钮
或按“F8”键,运行程序,开发板上的3个用户LED首先全部熄灭,然后红LED、黄LED和绿LED依次循环闪烁。
(7)单击调试工具栏中的“Suspend”(暂停)按钮
暂停程序的运行。
(8)单击调试工具栏中的“Restart”(重新开始)按钮
,程序停在main()函数的开始处,如图3.4所示。
图3.4 Blinky项目main()函数
注意:在程序的分析过程中,可随时单击“Restart”(重新开始)按钮
复位程序。下面详细介绍程序的分析步骤,主要包括下列内容。
● 初始化开发板:BoardInit()。
● 引脚复用配置:PinMuxConfig()。
● LED操作。
单击调试工具栏中的“Step Into”(单步进入)按钮
两次,进入BoardInit()函数,如图3.5所示。
图3.5 Blinky项目BoardInit()函数
从图3.5中可以看出,初始化开发板BoardInit()包括下列内容。
● 设置中断向量表:IntVTableBaseSet()。
● 允许处理器中断:IntMasterEnable()。
● 允许中断:IntEnable()。
● 初始化MCU:PRCMCC3200MCUInit()。
(1)设置中断向量表IntVTableBaseSet()。
功能:设置中断向量表基地址。
参数说明:ulVtableBase,中断向量表基地址,中断向量表在startup_ccs.c中定义。
IntVTableBaseSet()的声明在interrupt.h中,代码在interrupt.c中。
(2)允许处理器中断IntMasterEnable()。
功能:允许处理器中断。
IntMasterEnable()调用CPUcpsie()实现允许处理器中断操作,其声明在interrupt.h中,代码在interrupt.c中。
功能:允许CPU中断。
CPUcpsie()调用汇编语言程序段实现允许CPU中断操作,其声明在cpu.h中,代码在cpu.c中。
(3)允许中断IntEnable()。
功能:允许中断。
参数说明:ulInterrupt,中断号,FAULT_SYSTICK是SysTick的中断号常量,中断号是15,在hw_ints.h中定义。
IntEnable()的声明在interrupt.h中,代码在interrupt.c中。
(4)初始化MCU PRCMCC3200MCUInit()。
功能:初始化MCU。
加电启动或从低功耗休眠模式退出时,应用程序应该通过调用PRCMCC3200MCUInit()配置MCU参数。PRCMCC3200MCUInit()的声明在prcm.h中,代码在prcm.c中。
单击调试工具栏中的“Step Return”(单步返回)按钮
,运行上述函数,然后退出BoardInit()函数,回到main()函数的PinMuxConfig()语句。
引脚复用配置程序由PinMux应用程序根据设计须自动生成,程序代码在pinmux.c或rom_pin_mux_config.c中,其中调用了相应的PRCM、PIN和GPIO API函数。
单击调试工具栏中的“Step Into”(单步进入)按钮
,进入 PinMuxConfig()函数,如图3.6所示。
图3.6 Blinky项目PinMuxConfig()函数
从图中可以看出:GPIO引脚复用配置包括下列内容。
● 允许GPIO时钟:PRCMPeripheralClkEnable()。
● 配置GPIO引脚:PinTypeGPIO()。
● 配置GPIO方向:GPIODirModeSet()。
(1)允许GPIO时钟PRCMPeripheralClkEnable()。
① 单击调试工具栏中的“Step Into”(单步进入)按钮
两次,进入PRCMPeripheralClk Enable()函数,如图3.7所示。
图3.7 Blinky项目PRCMPeripheralClkEnable()函数
从图3.7中可以看出,PRCMPeripheralClkEnable()等API函数通过硬件寄存器操作HWREG()实现相应的功能。
功能:允许外设时钟。
参数说明:
● ulPeripheral:外设号,GPIOA0~3的外设号是6~9,在prcm.h中定义。
● ulClkFlags:时钟标志,设置值是PRCM_RUN_MODE_CLK(运行模式时钟)。ulClkFlags包括下列值。
✧ PRCM_RUN_MODE_CLK:运行模式时钟,0x0000 0001。
✧ PRCM_SLP_MODE_CLK:睡眠模式时钟,0x0000 0100。
✧ PRCM_DSLP_MODE_CLK:深睡眠模式时钟,0x0001 0000。
PRCMPeripheralClkEnable()的声明在prcm.h中,代码在prcm.c中。
② 单击调试工具栏中的“Step Return”(单步返回)按钮
,运行上述函数,然后退出函数,返回到PinMuxConfig()函数的MAP_PinTypeGPIO()语句。
(2)配置GPIO引脚PinTypeGPIO()。
① 单击调试工具栏中的“Step Into”(单步进入)按钮
,进入PinTypeGPIO()函数,如图3.8所示。
图3.8 Blinky项目PinTypeGPIO()函数
功能:配置GPIO引脚。
参数说明:
● ulPin:引脚号,PIN_01~64,在pin.h中定义。
● ulPinMode:引脚模式,PIN_MODE_0为GPIO模式。
● bOpenDrain:开漏输出,true表示是,false表示否。
PinTypeGPIO()的声明在pin.h中,代码在pin.c中。PinTypeGPIO()通过调用PinConfigSet()和PinModeSet()实现引脚类型的配置。
功能:设置引脚类型。
参数说明:
● ulPin:引脚号,PIN_01~64,在pin.h中定义。
● ulPinStrength:引脚强度,引脚的输出驱动电流(2 mA、4 mA或6 mA等)。
● ulPinType:引脚类型,设置值是 PIN_TYPE_STD(标准输入输出)。ulPinType 主要包括下列值。
✧ PIN_TYPE_STD:标准输入输出,0x0000 0000。
✧ PIN_TYPE_OD:开漏输出,0x0000 0010。
✧ PIN_TYPE_ANALOG:模拟引脚,0x1000 0000。
PinConfigSet()的声明在pin.h中,代码在pin.c中。
功能:设置引脚模式。
参数说明:
● ulPin:引脚号,PIN_01~64,在pin.h中定义。
● ulPinMode:引脚模式,PIN_MODE_0为GPIO模式。
PinModeSet()的声明在pin.h中,代码在pin.c中。
② 单击调试工具栏中的“Step Return”(单步返回)按钮
,运行上述函数,然后退出函数,返回到PinMuxConfig()函数的MAP_GPIODirModeSet()语句。
(3)配置GPIO方向GPIODirModeSet()。
① 单击调试工具栏中的“Step Into”(单步进入)按钮
,进入GPIODirModeSet()函数,如图3.9所示。
功能:配置GPIO方向。
图3.9 Blinky项目GPIODirModeSet()函数
参数说明:
● ulPort:GPIO端口基地址,在hw_memmap.h中定义。
● ucPins:引脚位权,4个GPIO组(GPIOA0~3)中8个GPIO的引脚位权从低到高依次为0x01、0x02、0x04、0x08、0x10、0x20、0x40和0x80。
● ulPinIO:GPIO引脚方向,包括下列值。
✧ GPIO_DIR_MODE_IN:输入,0x0000 0000。
✧ GPIO_DIR_MODE_OUT:输出,0x0000 0001。
GPIODirModeSet()的声明在gpio.h中,代码在gpio.c中。
② 单击调试工具栏中的“Step Return”(单步返回)按钮
,运行上述函数,然后退出函数,返回到PinMuxConfig()函数的MAP_PinTypeGPIO()语句。
③ 单击调试工具栏中的“Step Return”(单步返回)按钮
,对其他引脚进行配置,然后退出函数,返回main()函数的GPIO_IF_LedConfigure()语句。
LED操作主要包括下列内容。
● 配置LED:GPIO_IF_LedConfigure()。
● 熄灭LED:GPIO_IF_LedOff()(GPIOPinWrite())。
● 点亮LED:GPIO_IF_LedOn()(GPIOPinWrite())。
程序代码在gpio_if.c中,其中调用了相应的GPIO API函数,主要是GPIOPinWrite(),和GPIOPinWrite()对应的是GPIOPinRead()。
(1)配置LED函数GPIO_IF_LedConfigure()。
① 单击调试工具栏中的“Step Into”(单步进入)按钮
,进入GPIO_IF_LedConfigure()。
功能:配置LED。
参数说明:ucPins表示引脚定义。
GPIO_IF_LedConfigure()通过调用GPIO_IF_GetPortNPin()获得LED使用GPIO的端口基地址和引脚位权,用于后续的LED操作。
② 单击调试工具栏中的“Step Into”(单步进入)按钮
三次,进入GPIO_IF_GetPortN Pin(),如图3.10所示。
图3.10 Blinky项目GPIO_IF_GetPortNPin()函数
功能:根据引脚名称号获取端口基地址和引脚位权。
参数说明:
● ucPin:引脚名称号,GPIO0~39。
●*puiGPIOPort:GPIO端口基地址指针,端口基地址通过数组ulReg[]获得,数组下标是引脚名称号ucPin整除8,取值为0~4,对应GPIOA0~4。
●*pucGPIOPin:GPIO引脚位权指针,引脚位权是1左移0~7位,左移位数是引脚名称号ucPin余除8,取值为0~7,对应GPIOAx.0~7。
③ 单击调试工具栏中的“Step Return”(单步返回)按钮
两次,获取端口基地址和对应的引脚位权,然后退出函数,返回main()函数的GPIO_IF_LedOff()语句。
(2)熄灭LED函数GPIO_IF_LedOff()。
① 单击调试工具栏中的“Step Into”(单步进入)按钮
,进入GPIO_IF_LedOff()。
功能:熄灭LED。
参数说明:ledNum,LED标识,MCU_ALL_LED_IND表示红黄绿3个LED。
GPIO_IF_LedOff()通过调用GPIO_IF_Set()熄灭LED。
② 单击调试工具栏中的“Step Into”(单步进入)按钮
三次,进入GPIO_IF_Set()。
功能:根据引脚名称号、端口基地址和引脚位权设置GPIO引脚的值。
参数说明:
● ucPin:引脚名称号,GPIO0~31。
● uiGPIOPort:GPIO端口基地址。
● ucGPIOPin:GPIO引脚位权。
● ucGPIOValue:GPIO引脚值,0或1对于CC3200 LaunchPad,0表示LED熄灭,1表示LED点亮。
GPIO_IF_Set()通过调用GPIO API函数GPIOPinWrite()对GPIO引脚进行写操作。
(3)写GPIO引脚GPIOPinWrite()。
① 单击调试工具栏中的“Step Into”(单步进入)按钮
三次,进入 GPIOPinWrite(),如图3.11所示。
图3.11 Blinky项目GPIOPinWrite()函数
功能:根据端口基地址和引脚位权写GPIO引脚。
参数说明:
● ulPort:GPIO端口基地址。
● ucPins:GPIO引脚位权,4个GPIO组(GPIOA0~3)中8个GPIO的引脚位权从低到高依次为0x01、0x02、0x04、0x08、0x10、0x20、0x40和0x80。
● ucVal:GPIO引脚值。
GPIOPinWrite()的声明在gpio.h中,代码在gpio.c中。
和写GPIO引脚GPIOPinWrite()对应的读GPIO引脚GPIOPinRead()的函数格式为
功能:根据端口基地址和引脚位权读GPIO引脚。
参数说明:
● ulPort:GPIO端口基地址。
● ucPins:GPIO引脚位权。
返回值:GPIO引脚值。
GPIOPinRead()的声明在gpio.h中,代码在gpio.c中。
② 单击调试工具栏中的“Step Return”(单步返回)按钮
,运行写GPIO引脚,开发板上的绿LED熄灭,然后退出GPIOPin Write()函数,返回GPIO_IF_Set()函数。
③ 再单击调试工具栏中的“Step Return”(单步返回)按钮
,退出GPIO_IF_Set()函数,返回GPIO_IF_LedOff()函数的第二条GPIO_IF_Set()语句。
④ 单击调试工具栏中的“Step Over”(单步跨越)按钮
,运行第二条 GPIO_IF_Set()语句,开发板上的黄LED熄灭。
⑤ 再单击调试工具栏中的“Step Over”(单步跨越)按钮
,运行第三条GPIO_IF_Set()语句,开发板上的红LED熄灭(默认已熄灭)。
⑥ 单击调试工具栏中的“Step Return”(单步返回)按钮
,退出GPIO_IF_LedOff()函数,返回main()函数的LEDBlinkyRoutine()语句。
(4)LED闪烁LEDBlinkyRoutine()。LED闪烁通过延时熄灭LED和延时点亮LED实现。
① 单击调试工具栏中的“Step Into”(单步进入)按钮
,进入 LEDBlinkyRoutine()函数,如图3.12所示。
图3.12 Blinky项目LEDBlinkyRoutine()函数
② 单击调试工具栏中的“Step Over”(单步跨越)按钮
,运行 GPIO_IF_LedOff()和UtilsDelay()。
③ 单击调试工具栏中的“Step Into”(单步进入)按钮
,进入GPIO_IF_LedOn()。
功能:点亮LED。
参数说明:ledNum,LED标识,包括下列值。
● MCU_RED_LED_GPIO:红LED。
● MCU_ORANGE_LED_GPIO:黄(橙)LED。
● MCU_GREEN_LED_GPIO:绿LED。
GPIO_IF_LedOn()也通过调用GPIO_IF_Set()和GPIO API GPIOPinWrite()点亮LED。
注意:GPIO_IF_LedOn()和GPIO_IF_LedOff()都通过调用GPIO_IF_Set()设置LED,但调用GPIO_IF_Set()的第4个参数ucGPIOValue的值不同。
④ 单击调试工具栏中的“Step Return”(单步返回)按钮
,运行GPIO_IF_LedOn()语句,开发板上的红LED点亮。
⑤ 单击调试工具栏中的“Step Over”(单步跨越)按钮
两次,运行 UtilsDelay()和GPIO_IF_LedOff()语句,开发板上的红LED熄灭。
⑥ 单击调试工具栏中的“Step Over”(单步跨越)按钮
两次,运行 UtilsDelay()和GPIO_IF_LedOn()语句,开发板上的黄LED点亮。
⑦ 单击调试工具栏中的“Step Over”(单步跨越)按钮
两次,运行 UtilsDelay()和GPIO_IF_LedOff()语句,开发板上的黄LED熄灭。
⑧ 单击调试工具栏中的“Resume”(运行)按钮
运行程序,开发板上的3个LED循环闪烁。
⑨ 单击调试工具栏中的“Terminate”(结束)按钮
,结束调试返回编辑界面。
综上所述,Blinky项目使用的API函数如表3.1所示。
表3.1 Blinky项目使用的API函数
GPIO的使用主要包括引脚复用配置和GPIO读写操作等。
引脚复用配置包括允许GPIO时钟PRCMPeripheralClkEnable()、配置GPIO引脚类型PinTypeGPIO()和配置GPIO引脚方向GPIODirModeSet(),API声明如下。
PinTypeGPIO()的ulPin参数与GPIODirModeSet()的ulPort和ucPins参数的关系为:首先根据ulPin(引脚号)从附录C中找到对应的引脚名称号,然后根据引脚名称号确定ulPort(端口基地址)和ucPins(引脚位权),参见GPIO_IF_GetPortNPin()内容。
例如,PIN_01对应的引脚名称是GPIO10,GPIO10是第2组的第3个引脚,所以引脚的端口基地址是GPIOA1_BASE,引脚位权是2 3-1 =4,参见PinMuxConfig()内容。
GPIODirModeSet()的ulPinIO参数包括下列值。
● GPIO_DIR_MODE_IN:输入,0x0000 0000。
● GPIO_DIR_MODE_OUT:输出,0x0000 0001。
GPIO读写操作分别使用读GPIO引脚GPIOPinRead()和写GPIO引脚GPIOPinWrite()实现,API声明如下。
在GPIO示例程序的基础上稍加修改,可以用按键控制LED的闪烁时间,同时直接使用GPIO API对GPIO进行操作,具体步骤如下。
在pinmux.c文件的PinMuxConfig()函数中添加下列语句,实现按键接口的配置。
修改main()函数的内容如下。
运行程序,3个LED延时闪烁。按下SW3,3个LED闪烁延时时间逐遍缩短,闪烁8次后,延时时间最短。按下SW2,3个LED闪烁延时时间逐遍加长,闪烁8次后,延时时间恢复到最长。因为主程序采用查询方式检测按键,3个LED闪烁一遍后按键才能再起作用,所以按键反应比较迟钝。为了及时响应按键操作,可以采用中断方式检测按键。
如果开发板上的用户按键和用户LED使用的GPIO引脚与CC3200 LaunchPad不同,例如,两个用户按键使用GPIO7和GPIO8,3个用户LED分别使用GPIO22、GPIO28和GPIO30,可以像3.1.3节中”修改PinMuxConfig()函数”一样直接修改PinMuxConfig()函数的内容,但TI强烈建议使用CC3200引脚复用实用工具PinMux获得需要的引脚配置。
(1)打开TI Pin Mux Tool,选择CC3200器件,单击“Start”按钮,如图3.13所示。
图3.13 Pin Mux选择器件
(2)单击“Available Peripherals”(可用外设)下“GPIO”右边的加号“+”添加“My GPIO 1”,单击“My GPIOs”下的“GPIO Signals”(GPIO信号),消除所有信号引脚前的对号(不选择所有信号),如图3.14所示。
图3.14 Pin Mux可用外设
(3)单击“GPIO07”和“GPIO08”,选择这两个输入引脚;单击“GPIO22”、“GPIO28”和“GPIO30”,选择这三个输出引脚,并单击信号右边的“Output”(输出)项,如图3.15所示。
图3.15 Pin Mux输入引脚和输出引脚
(4)单击“Generate”(生成)按钮,打开“浏览文件夹”对话框,浏览到“D:\TI\CC3200 SDK_1.1.0\example\blinky”文件夹,如图3.16所示。
(5)单击“确定”按钮,在“blinky”文件夹生成下列4个文件。
● pin_mux_config.c:引脚复用配置源文件。
● pin_mux_config.h:引脚复用配置头文件。
● rom_pin_mux_config.c:ROM引脚复用配置源文件。
● summary.csv:引脚复用配置表。
(6)关闭Pin Mux,单击“Yes”(是)。
(1)在CCS的“Project Explorer”视图中右击blinky项目下的“pinmux.c”,在弹出菜单中单击“Delete”(删除)将pinmux.c从项目中删除,在弹出对话框中单击“OK”按钮确认删除。
(2)在CCS的“Project Explorer”视图中右击“blinky [Active-Release]”,在弹出菜单中单击“Add Files…”(添加文件),选择rom_pin_mux_config.c,在弹出对话框“File Operation”(文件操作)中选择“Copy files”(复制文件),单击“OK”按钮,将rom_pin_mux_config.c添加到项目中,如图3.17所示。
图3.16 Pin Mux“浏览文件夹”对话框
图3.17 Blinky项目替换引脚复用配置文件
(3)重复步骤(1)和步骤(2),将pinmux.h替换为pin_mux_config.h。
(4)将main.c中包含的头文件名pinmux.h修改为pin_mux_config.h。