[MSP430] 【MSP430i2xx教程第一讲】怎样使用库函数 & GPIO详解

[复制链接]
21037|243
 楼主 | 2015-3-24 09:40 | 显示全部楼层 ||阅读模式
本帖最后由 xlhtracy 于 2015-4-20 14:59 编辑

本教程作者为21ic网友@gaoyang9992006 ,回帖参与讨论、提问、分享,就能赢取超多丰厚奖励哦~  @gaoyang9992006 也将随时和大家交流学习中的问题。(PS:本教程未经允许谢绝转载

活动说明详见:【学教程,送奖励】GET新技能,和gaoyang一起学习MSP430i2xx

后续课程已发布:

【MSP430i2xx教程第二讲】时钟系统 & EUSCI_A_UART
欢迎继续学习讨论
~


序言
1.1  综述
    德州仪器®MSP430®外设驱动程序库是一组基于访问MSP430i2xx家族微控制器的外设驱动程序。虽然它们不是纯粹的操作系统意义上的驱动程序,但他们提供一种容易使用外设的机制。
    驱动的功能和 组织都是遵循以下设计目标:
  • 他们都是完全由C语言编写(除了那些C绝对不可能实现的功能外)。
  • 他们演示如何在常见的操作模式下使用外设。
  • 他们很容易理解。
  • 他们在内存和处理器的使用上是合理高效的。
  • 他们尽可能独立(模块化)。
  • 在可能的情况下,计算指令在编译时候执行,而不是在运行时完成(代码编译的高效性)。
  • 他们可以适用于不只一个的工具链构建(目前提供三种:CSSGCCIAR)。

基于以上的设计目标可能有以下不好的影响:
  • 从一个代码大小和执行速度来考虑,驱动程序不一定是高效的代码。而最有效的操作外设的代码是在应用程序有特定需求下进行量身定制而编写的。更进一步的对驱动程序代码尺寸优化将会使得驱动代码更难以理解。
  • 驱动程序不能够实现硬件的全部功能。一些外设提供的复杂功能不能通过本库函数提供的驱动程序实现。但是你可以使用现有代码作为参考来添加额外的功能支持。
  • API清除了所有错误校验代码。因为错误校验通常只是用于最初的程序开发期间,它可以被删除用于改善代码的大小和速度。

    对于许多应用程序,可以使用驱动程序来开发。单是在某些情况下,驱动程序为了满足应用程序的功能,存储或处理的需求将会增强或重写(代码的冗余度提高了)。如果是这样的情况,可以把现有的驱动程序作为操作外设的参考程序。
    一些驱动库API 取相应的外设的基地址作为第一个参数。这个基地址是是从MSP430单片机特点的头文件(或单片机数据表)获取的。各种外设的例程演示如何使用这些基地址。

    驱动库支持以下工具链:
  • IAR Embedded Workbench®
  • Texas Instruments Code Composer Studio™
    使用断言语句调试
    默认情况下禁用断言语句。
    要启用断言语句需要编辑hw_regaccess.h ,该文件在 inc 文件夹。对#define NDEBUG进行添加注释符号。变成//#define NDEBUG            
    也就是把#define NDEBUG这句注释掉。断言只有在项目优化尺寸时候才在CCS中起作用。

MSP430i2xx命名法则
该系列命名法则如下图所示,


具体参见下表
处理器家族
MSP=混合信号处理器;XMS=实验硅
430MCU平台
德州仪器微控制器平台
设备类型
特殊应用,i=工业级Flash
系列
2系列=频率可达16.384MHz
特型
集成多种标准在一个系列上
集温度可选范围
T = -40°C到105 C°
封装类型
包装类型
T=小卷包装;R=大卷包装;没有标记:管或盘
附加特性
EP=增强型(-40℃到150℃);HT=极端温度(-55到150℃);Q1=汽车级
       MSP430i2xx系列是一款工业级430产品。

版权声明:以上内容均翻译自TI英文版MSP430i2xx系列库函数使用手册引言部分。有不合理和错误之处,请回帖说明,在此谢谢各位网友,此文档内容版权还归TI所有。



  



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主 | 2015-3-24 10:04 | 显示全部楼层
本帖最后由 xlhtracy 于 2015-4-1 10:49 编辑

第一章  怎样使用库函数(CCS版)1.1  开发环境介绍
CCS6.1是目前CCStudio的最新版本,也是支持最全面的版本,本文档所有内容均在该版本下测试完成。经过作者测试CCS5系列还没有引入库函数概念,建议升级到最新版CCStudio6.1.
下载地址:
http://processors.wiki.ti.com/index.php/Download_CCS             或通过百度网盘下载
————————————————————————————————————————
启动CCS6,单击菜单栏的 View-> Resource ExplorerExamples

图1
我们看到CCS菜单栏View下第一个Resource explorer(Examples),单击。弹出窗口就是TI Resource Explorer。如图2,我们可以看到我们安装的MSP430ware/Lirbrary
如果你安装时候没有勾选安装MSP430ware,请通过Help/check for updatesApp Center升级安装
图2

点击 MSP430ware ,你将看到介绍页面. 通过左边的列表可以找到我们这里要介绍的MSP430i2xx系列的用户手册(Users Guide)、API编程手册(API Programmers Guide)以及创建空项目(emptyProject),还有例程(Example Projects)。看右侧的窗口有几个方块,我们单击第一个Driver Library。弹出如下窗口。单击蓝色字体的here,

图3
将会在CCS右侧的窗口弹出网页,如图4。在该页面可以下载到最新版的MSP430驱动库函数包。或登录http://www.ti.com/tool/mspdriverlib

图4
你可以在你的安装目录下找到本教程将要讲解的库函数源文件。
C:\ti\msp430\MSP430ware_1_97_00_47\driverlib\driverlib\MSP430i2xx
或者在CCSTI Resource Explorer里找到MSP430ware->Libraries->MSP430i2xx->API Programmers Guide
这时右边窗口会出现如下图所示。左边分别有三个选项:Modules(模块)、Data Structures(数据结构)、Files(文件)。如图5所示。

5
通过Modules(模块)可以查看该系列单片机所有外设模块的库函数介绍,如图6所示为GPIO_clearInterruptFlag函数的相关说明。

图6
通过Files选项我们可以看到头文件列表,我们找到gpio.h单击,右边就弹出该文件的内容,我们翻页找到上面对应 那个函数,通过函数的注释,我们也可以看懂该函数包含了两个参数,以及参数的取值范围,该函数的作用。我们发现默认的注释字体是红色的,如果你觉得CCS给的配色十分的不愉快,可以使用Notepad++

7

笔者经常使用Notepad++阅读代码的,在CCS里你也可以通过修改配置来改变代码显示的配色,具体方法这里不作介绍。

图8
1.2  怎么使用Driverlib(驱动库)创建一个新的用户工程
单击File->New->CCS Project,弹出新建工程窗口,如图9所示。
9
通过选项进行配置,如果图9所示,Target选择MSP430Ixxx Family,器件型号选择MSP430i2020。填入Project name(项目名字)。在Project templates and examples(项目模板和示例)选择MSP430 DriverLib下的Empty Project with DriverLib Source,之后单击Finish完成创建基于库函数的项目。并且弹出如下窗口。
图10

1.3  怎样给已经存在的项目添加库函数
在已存在的应用项目单击右键,单击Source -> Apply Project Template,如图11打开向导窗口,如图12

图11

在图12选择Add Local Copy of DriverLib. 单击Finish完成向现有的项目添加一个DriverLib MSP430i2xx副本
图12



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1威望 +2 收起 理由
地瓜patch + 2 2015年第一技术教程贴
 楼主 | 2015-3-24 10:05 | 显示全部楼层
本帖最后由 xlhtracy 于 2015-3-24 11:03 编辑

第二章  GPIO
    GPIOGeneral Purpose Input/Output(通用输入输出)的简称,是单片机最基本,最必须,最重要的外设,每个GPIO端口可通过软件分别配置成输入或输出。

    数字I/O(GPIO)APIApplication Programming Interface,应用程序编程接口)为使用MP430i2xx GPIO模块提供了一组函数。这些函数可以设置、使能使用I/O管脚(针脚、插脚),设置他们是否有中断,以及对管脚值的读和写。数字I / O功能包括:
  • 可对单独的I/O独立编程
  • 可对输入输出任意组合
  • 可单独配置P1P2端口中断,另外一些型号可能包含其他端口的中断。
  • 具有独立的输入和输出数据寄存器
  • 可单独配置上拉或下拉电阻

2
.1  本章引言
    该系列单片机具备的I/O端口数量最高可达12组(P1P11,外加PJ端口)。大部分呢端口每组包含8个管脚;然后,一些端口可用的管脚较少,不足8个(端口包含可用管脚的具体情况需要查看对应芯片的数据手册)。每个I/O管脚可用分别配置为输入或输出,并且每个可用单独进行读/写操作。

    端口P1P2都具备中断功能。P1P2两组端口的每一位管脚都可以单独配置成在输入一个上升沿或下降沿时候触发中断的功能。

    P1所有的管脚位中断源自一个单独的中断向量P1IV,P2所有的管脚中断院子另外一个单独的中断向量P2IV。在一些单片机中,可能具备额外中断功能的端口,且包含他们各自的中断向量(具体情况,需要从该型号单片机的数据手册中获取)。

    单个端口可以作为可以以字节宽度进行访问,也可以合二为一组合成字宽,以字的格式进行访问。P1/P2, P3/P4, P5/P6, P7/P8,四对端口分别对应PA、PB、PCPD。除了中断向量P1IVP2IV,所有的端口寄存器是按照这种命名约定方式处理的,也就是说不存在中断向量PAIV

    当以字为单位操作PA时候,所有的16位被写入端口。当用字节操作PA端口的低字节时候,高字节保持不变。同样,用字节指令写PA端口的高字节时候,低字节不变。当写端口时候,使用的位宽少于该端口的最大位宽时候,不用的位是不受影响的。端口PB、P、PD、PEPF也是类似的

    使用字操作读PA端口,可以读到16位管脚的全部状态。使用字节操作,读PA端口(P1P2)的低字节或高字节,分别只能读出低字节或高字节。使用字节操作,读PA端口,并存储到一个通用寄存器,本字节只被写入到寄存器的最低有效字节。目的寄存器的高位有效字节将自动被清除。端口PBPCPDPEPF类似。当读那些可能少于最大位宽的端口时候,未使用的位读作0(类似于端口PJ)。

    GPIO 管脚可使用函数GPIO_setAsOutputPin()GPIO_setAsInputPin()配置为一个I/O管脚。使用外设分配函数GPIO_setAsPeripheralModuleFunctionOutputPin()
GPIO_setAsPeripheralModuleFunctionInputPin().可以把GPIO管脚替换成外围模块功能(即使用管脚I/O功能外的其他功能)。

    这个驱动程序包含在gpio.c文件里,gpio.h头文件包含该应用程序使用的API定义
2.2  函数总览
1
void GPIO_setAsOutputPin (uint8_t selectedPort, uint16_t selectedPins)
该函数可以配置所选管脚作为输出管脚
2
void GPIO_setAsInputPin (uint8_t selectedPort, uint16_t selectedPins)
该函数可以配置所选管脚作为输入管脚
3
void GPIO_setAsPeripheralModuleFunctionOutputPin (uint8_t selectedPort, uint16_t selectedPins, uint8_t mode)
该函数配置所选管脚上输出方向的外设
4
void GPIO_setAsPeripheralModuleFunctionInputPin (uint8_t selectedPort, uint16_t selectedPins, uint8_t mode)
该函数配置所选管脚上输入方向的外设
5
void GPIO_setOutputHighOnPin (uint8_t selectedPort, uint16_t selectedPins)
该函数在所选管脚上输出高电平
6
void GPIO_setOutputLowOnPin (uint8_t selectedPort, uint16_t selectedPins)
该函数在所选管脚上输出低电平
7
void GPIO_toggleOutputOnPin (uint8_t selectedPort, uint16_t selectedPins)
该函数翻转所选管脚的输出电平
8
uint8 t GPIO_getInputPinValue (uint8_t selectedPort, uint16_t selectedPins)
该函数可以获取所选管脚的输入值

9
void GPIO_enableInterrupt (uint8_t selectedPort, uint16_t selectedPins)
该函数使能所选管脚的端口中断功能
10
void GPIO_disableInterrupt (uint8_t selectedPort, uint16_t selectedPins)
该函数禁用所选管脚端口的中断
11
uint16 t GPIO_getInterruptStatus (uint8_t selectedPort, uint16_t selectedPins)
该函数可以获取被选中的端口的中断状态
12
void GPIO_clearInterruptFlag (uint8 t selectedPort, uint16 t selectedPins)
该函数可以清除所选管脚的中断标志
13
void GPIO_interruptEdgeSelect (uint8_t selectedPort, uint16_t selectedPins, uint8_t edgeSelect)
该函数可以对所选管脚的中断触发边沿类型进行选择(是上升沿触发还是下降沿触发)


详细描述
    GPIO API函数分为三组:配置GPIO管脚的、处理中断的和访问管脚电平值的。
    配置GPIO管脚的有:
  • GPIO_setAsOutputPin()
  • GPIO_setAsInputPin()
  • GPIO_setAsInputPinWithPullDownresistor()
  • GPIO_setAsInputPinWithPullUpresistor()
  • GPIO_setAsPeripheralModuleFunctionOutputPin()
  • GPIO_setAsPeripheralModuleFunctionInputPin()
    处理GPIO中断的有:
  • GPIO_enableInterrupt()
  • GPIO_disableInterrupt()
  • GPIO_clearInterruptFlag()
  • GPIO_getInterruptStatus()
  • GPIO_interruptEdgeSelect()
管脚状态访问的:
  • GPIO_setOutputHighOnPin()
  • GPIO_setOutputLowOnPin()
  • GPIO_toggleOutputOnPin()
  • GPIO_getInputPinValue()

函数文档


void GPIO_clearInterruptFlag (uint8 t selectedPort, uint16 t selectedPins)
  该函数可以清除所选管脚的中断标志。需要注意的是只针对端口12A有效。因为只有P1,P2,PA(前面说过P1P2组合后作为字标记为PA)有效
     该函数具有两个参数:selectedPort(所选端口)和selectedPins(所选管脚)。
     selectedPort可选的有效值有三个:GPIO_PORT_P1、GPIO_PORT_P2、GPIO_PORT_PA
     selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0GPIO_PIN1、GPIO_PIN2……GPIO_PIN15等十六个值的逻辑或
     该函数是通过修改寄存器PxIFG实现,返回值 None(空)


void GPIO_disableInterrupt (uint8_t selectedPort, uint16_t selectedPins)
  该函数禁用所选管脚的端口中断。需要注意的是,只有端口P1,P2,PA具有该功能
     该函数具有两个参数:selectedPort(所选端口)和selectedPins(所选管脚)。
     selectedPort可选的有效值有三个:GPIO_PORT_P1、GPIO_PORT_P2、GPIO_PORT_PA
     selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0GPIO_PIN1、GPIO_PIN2……GPIO_PIN15等十六个值的逻辑或
     该函数是通过修改寄存器PxIE实现,返回值 None(空)


void GPIO_enableInterrupt (uint8_t selectedPort, uint16_t selectedPins)
  该函数使能所选管脚的端口中断。需要注意的是,只有端口P1,P2,PA具有该功能
     该函数具有两个参数:selectedPort(所选端口)和selectedPins(所选管脚)。
     selectedPort可选的有效值有三个:GPIO_PORT_P1、GPIO_PORT_P2、GPIO_PORT_PA
     selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0GPIO_PIN1、GPIO_PIN2……GPIO_PIN15等十六个值的逻辑或
     该函数是通过修改寄存器PxIE实现,返回值 None(空)

 楼主 | 2015-3-24 10:06 | 显示全部楼层
本帖最后由 xlhtracy 于 2015-3-24 11:14 编辑

uint8 t GPIO_getInputPinValue (uint8_t selectedPort, uint16_t selectedPins)
  该函数获取所选管脚的输入值。
     该函数具有两个参数:selectedPort(所选端口)和selectedPins(所选管脚)。
     selectedPort可选的有效值有1811+7)个:GPIO_PORT_P1、GPIO_PORT_P2……GPIO_PORT_P11,GPIO_PORT_PA、         GPIO_PORT_PBGPIO_PORT_PCGPIO_PORT_PD、GPIO_PORT_PE、GPIO_PORT_PF、GPIO_PORT_PJ。
    注意:数字标记的为以字节为操作位宽(8位)的,字母标记的为以字为位宽(16位)操作的。
    selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0GPIO_PIN1、GPIO_PIN2……GPIO_PIN15等十六个值的逻辑或
    返回值:GPIO_INPUT_PIN_HIGHGPIO_INPUT_PIN_LOW二者中之一。即管脚的状态值。


uint16 t GPIO_getInterruptStatus (uint8_t selectedPort, uint16_t selectedPins)
  该函数用于获取所选管脚的中断状态。需要注意的是只有P1、P2、PA具有该功能
     该函数具有两个参数:selectedPort(所选端口)和selectedPins(所选管脚)。
     selectedPort可选的有效值有三个:GPIO_PORT_P1、GPIO_PORT_P2、GPIO_PORT_PA
     selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0、GPIO_PIN1、GPIO_PIN2……GPIO_PIN15等十六个值的逻辑或
     返回值: GPIO_PIN0、GPIO_PIN1、GPIO_PIN2……GPIO_PIN15等十六个值的逻辑或。用于显示所选管脚的中断状态(默认值:0)。


void GPIO_interruptEdgeSelect (uint8_t selectedPort, uint16_t selectedPins, uint8_t edgeSelect)
  该函数选择什么边沿触发中断,即选择是上升沿还是下降沿触发所选管脚中断。
     该函数具有三个参数:selectedPort(所选端口)、selectedPins(所选管脚)和edgeSelect(边沿选择)。
     selectedPort可选的有效值有1811+7)个:GPIO_PORT_P1、     GPIO_PORT_P2……GPIO_PORT_P11,GPIO_PORT_PA、GPIO_PORT_PBGPIO_PORT_PCGPIO_PORT_PD、GPIO_PORT_PE、GPIO_PORT_PF、GPIO_PORT_PJ。
     注意:数字标记的为以字节为操作位宽(8位)的,字母标记的为以字为位宽(16位)操作的。
     selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0GPIO_PIN1、GPIO_PIN2……GPIO_PIN15等十六个值的逻辑或
     edgeSelect是对中断触发边沿的选择。其值有两个,GPIO_HIGH_TO_LOW_TRANSITION(下降沿触发)和GPIO_LOW_TO_HIGH_TRANSITION上升沿触发)。
     该函数是通过修改寄存器PxIES实现,返回值 None(空)

void GPIO_setAsInputPin (uint8_t selectedPort, uint16_t selectedPins)
  该函数把所选管脚配置为输入管脚。
     该函数具有两个参数:selectedPort(所选端口)和selectedPins(所选管脚)。
     selectedPort可选的有效值有1811+7)个:GPIO_PORT_P1、GPIO_PORT_P2……GPIO_PORT_P11,GPIO_PORT_PA、GPIO_PORT_PBGPIO_PORT_PCGPIO_PORT_PD、GPIO_PORT_PE、GPIO_PORT_PF、GPIO_PORT_PJ。
     注意:数字标记的为以字节为操作位宽(8位)的,字母标记的为以字为位宽(16位)操作的。
     selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0GPIO_PIN1、GPIO_PIN2……GPIO_PIN15等十六个值的逻辑或
     该函数是通过修改寄存器PxDIRPxREN、和PxSEL的位实现,返回值 None(空)


void GPIO_setAsOutputPin (uint8_t selectedPort, uint16_t selectedPins)
  该函数把所选管脚配置为输出管脚。
     该函数具有两个参数:selectedPort(所选端口)和selectedPins(所选管脚)。
     selectedPort可选的有效值有1811+7)个:GPIO_PORT_P1、GPIO_PORT_P2……GPIO_PORT_P11,GPIO_PORT_PA、GPIO_PORT_PBGPIO_PORT_PCGPIO_PORT_PD、GPIO_PORT_PE、GPIO_PORT_PF、GPIO_PORT_PJ。
     注意:数字标记的为以字节为操作位宽(8位)的,字母标记的为以字为位宽(16位)操作的。
     selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0GPIO_PIN1、GPIO_PIN2……GPIO_PIN15等十六个值的逻辑或
     该函数是通过修改寄存器PxDIR和PxSEL的位实现,返回值 None(空)


void GPIO_setAsPeripheralModuleFunctionInputPin (uint8_t selectedPort, uint16_t selectedPins, uint8_t mode)
  该函数配置所选管脚上输入方向的外设功能,要么第一功能模块,要么第二功能模块,要么第三功能模块。需要注意的是MSP430F5xx/MSP4306xx家族不支持这个函数模式
      该函数具有三个参数:selectedPort(所选端口)、selectedPins(所选管脚)和mode(模式)。
      selectedPort可选的有效值有1811+7)个:GPIO_PORT_P1、GPIO_PORT_P2……GPIO_PORT_P11,GPIO_PORT_PA、GPIO_PORT_PBGPIO_PORT_PCGPIO_PORT_PD、GPIO_PORT_PE、GPIO_PORT_PF、GPIO_PORT_PJ。
      注意:数字标记的为以字节为操作位宽(8位)的,字母标记的为以字为位宽(16位)操作的。
      selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0GPIO_PIN1、GPIO_PIN2……GPIO_PIN15等十六个值的逻辑或
     mode 所选端口处的外设选择,一般端口提供了三种模式的外设模块,通过该参数可以进行选择使用。可选的值是GPIO_PRIMARY_MODULE_FUNCTION、GPIO_SECONDARY_MODULE_FUNCTION和GPIO_TERNARY_MODULE_FUNCTION。
     如果不知道这三种外设模式分别是什么,可以查看多选单片机的技术手册的管脚分布图。
     该函数是通过修改寄存器PxDIR和PxSEL的位实现,返回值 None(空)


void GPIO_setAsPeripheralModuleFunctionOutputPin (uint8_t selectedPort, uint16_t selectedPins, uint8_t mode)
  该函数配置所选管脚上输出方向的外设功能,要么第一功能模块,要么第二功能模块,要么第三功能模块。需要注意的是MSP430F5xx/MSP4306xx家族不支持这个函数模式
     该函数具有三个参数:selectedPort(所选端口)、selectedPins(所选管脚)和mode(模式)。
      selectedPort可选的有效值有1811+7)个:GPIO_PORT_P1、GPIO_PORT_P2……GPIO_PORT_P11,GPIO_PORT_PA、GPIO_PORT_PBGPIO_PORT_PCGPIO_PORT_PD、GPIO_PORT_PE、GPIO_PORT_PF、GPIO_PORT_PJ。
     注意:数字标记的为以字节为操作位宽(8位)的,字母标记的为以字为位宽(16位)操作的。
     selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0GPIO_PIN1、GPIO_PIN2……GPIO_PIN15等十六个值的逻辑或
     mode 所选端口处的外设选择,一般端口提供了三种模式的外设模块,通过该参数可以进行选择使用。可选的值是GPIO_PRIMARY_MODULE_FUNCTION、GPIO_SECONDARY_MODULE_FUNCTION和GPIO_TERNARY_MODULE_FUNCTION。
     如果不知道这三种外设模式分别是什么,可以查看多选单片机的技术手册的管脚分布图。
     该函数是通过修改寄存器PxDIR和PxSEL的位实现,返回值 None(空)


void GPIO_setOutputHighOnPin (uint8_t selectedPort, uint16_t selectedPins)
  该函数在所选端口的管脚配置为输出高电平。
     该函数具有两个参数:selectedPort(所选端口)和selectedPins(所选管脚)。
     selectedPort可选的有效值有1811+7)个:GPIO_PORT_P1、GPIO_PORT_P2……GPIO_PORT_P11,GPIO_PORT_PA、GPIO_PORT_PBGPIO_PORT_PCGPIO_PORT_PD、GPIO_PORT_PE、GPIO_PORT_PF、GPIO_PORT_PJ。
     注意:数字标记的为以字节为操作位宽(8位)的,字母标记的为以字为位宽(16位)操作的。
     selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0GPIO_PIN1、GPIO_PIN2……GPIO_PIN15等十六个值的逻辑或
     该函数是通过修改寄存器PxOUT的位实现,返回值 None(空)


void GPIO_setOutputLowOnPin (uint8_t selectedPort, uint16_t selectedPins)
  该函数在所选端口的管脚配置为输出低电平。
     该函数具有两个参数:selectedPort(所选端口)和selectedPins(所选管脚)。
     selectedPort可选的有效值有1811+7)个:GPIO_PORT_P1、GPIO_PORT_P2……GPIO_PORT_P11,GPIO_PORT_PA、GPIO_PORT_PBGPIO_PORT_PCGPIO_PORT_PD、GPIO_PORT_PE、GPIO_PORT_PF、GPIO_PORT_PJ。
     注意:数字标记的为以字节为操作位宽(8位)的,字母标记的为以字为位宽(16位)操作的。
     selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0GPIO_PIN1、GPIO_PIN2……GPIO_PIN15等十六个值的逻辑或
     该函数是通过修改寄存器PxOUT的位实现,返回值 None(空)

void GPIO_toggleOutputOnPin (uint8_t selectedPort, uint16_t selectedPins)
  该函数在所选端口的管脚进行电平的翻转,进行高低电平切换。
     该函数具有两个参数:selectedPort(所选端口)和selectedPins(所选管脚)。
     selectedPort可选的有效值有1811+7)个:GPIO_PORT_P1、GPIO_PORT_P2……GPIO_PORT_P11,GPIO_PORT_PA、GPIO_PORT_PBGPIO_PORT_PCGPIO_PORT_PD、GPIO_PORT_PE、GPIO_PORT_PF、GPIO_PORT_PJ。
     注意:数字标记的为以字节为操作位宽(8位)的,字母标记的为以字为位宽(16位)操作的。
     selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0GPIO_PIN1、GPIO_PIN2……GPIO_PIN15等十六个值的逻辑或
     该函数是通过修改寄存器PxOUT的位实现,返回值 None(空)

 楼主 | 2015-3-24 10:19 | 显示全部楼层
本帖最后由 xlhtracy 于 2015-3-25 11:32 编辑

2.3  例程
下面简单的例程用于展示如何使用GPIO API
// 把P1.0设置为输出端口
GPIO_setAsOutputPin (GPIO_PORT_P1, GPIO_PIN0);
// 把P1.4设置为输入端口
GPIO_setAsInputPin (GPIO_PORT_P1, GPIO_PIN4);
while (1)
{
// 测试管脚P1.4
if (GPIO_INPUT_PIN_HIGH == GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN4))
GPIO_setOutputHighOnPin (GPIO_PORT_P1, GPIOPIN0);     // 如果P1.4输入高电平,置位P1.0。
else
GPIO_setOutputLowOnPin (GPIO_PORT_P1, GPIO_PIN0);     //否则,管脚P1.0输清零
}

2.4  本章小结
本章节介绍了GPIO相关的13个操作函数,这些函数的参数变量有:selectedPort、selectedPinmode。其中只有在使用IO管脚内的非IO功能的外设时候才使用第三个 参数mode进行选择功能。
1和表2给出了只使用两个参变量selectedPort、selectedPins的函数,参变量所选范围的列表。
表3给出了使用三个变量selectedPort、selectedPins、mode的函数,参变量的所选范围。
表1
[size=11.0000pt] GPIO_setAsOutputPin()
[size=11.0000pt] GPIO_setAsInputPin()
[size=11.0000pt] GPIO_setAsPeripheralModuleFunctionOutputPin()
[size=11.0000pt] GPIO_setAsPeripheralModuleFunctionInputPin()
[size=11.0000pt] GPIO_setOutputHighOnPin()
[size=11.0000pt] GPIO_setOutputLowOnPin()
[size=11.0000pt] GPIO_toggleOutputOnPin()
[size=11.0000pt] GPIO_getInputPinValue()
[size=11.0000pt] GPIO_interruptEdgeSelect()
selectedPort
selectedPins
GPIO_PORT_P1
GPIO_PORT_P2
GPIO_PORT_P3
GPIO_PORT_P4
GPIO_PORT_P5
GPIO_PORT_P6
GPIO_PORT_P7
GPIO_PORT_P8
GPIO_PORT_P9
GPIO_PORT_P10
GPIO_PORT_P11
GPIO_PORT_PA
GPIO_PORT_PB
GPIO_PORT_PC
GPIO_PORT_PD
GPIO_PORT_PE
GPIO_PORT_PF
GPIO_PORT_PJ
GPIO_PIN0
GPIO_PIN1
GPIO_PIN2
GPIO_PIN3
GPIO_PIN4
GPIO_PIN5
GPIO_PIN6
GPIO_PIN7
GPIO_PIN8
GPIO_PIN9
GPIO_PIN10
GPIO_PIN11
GPIO_PIN12
GPIO_PIN13
GPIO_PIN14
GPIO_PIN15

表2
GPIO_enableInterrupt()
GPIO_disableInterrupt()
GPIO_getInterruptStatus()
GPIO_clearInterruptFlag()
selectedPort
selectedPins
GPIO_PORT_P1
GPIO_PORT_P2
GPIO_PORT_PA
GPIO_PIN0
GPIO_PIN1
GPIO_PIN2
GPIO_PIN3
GPIO_PIN4
GPIO_PIN5
GPIO_PIN6
GPIO_PIN7
GPIO_PIN8
GPIO_PIN9
GPIO_PIN10
GPIO_PIN11
GPIO_PIN12
GPIO_PIN13
GPIO_PIN14
GPIO_PIN15

表3
[size=11.0000pt] GPIO_setAsPeripheralModuleFunctionOutputPin()
[size=11.0000pt] GPIO_setAsPeripheralModuleFunctionInputPin()
selectedPort
selectedPins
mode
GPIO_PORT_P1
GPIO_PORT_P2
GPIO_PORT_P3
GPIO_PORT_P4
GPIO_PORT_P5
GPIO_PORT_P6
GPIO_PORT_P7
GPIO_PORT_P8
GPIO_PORT_P9
GPIO_PORT_P10
GPIO_PORT_P11
GPIO_PORT_PA
GPIO_PORT_PB
GPIO_PORT_PC
GPIO_PORT_PD
GPIO_PORT_PE
GPIO_PORT_PF
GPIO_PORT_PJ
GPIO_PIN0
GPIO_PIN1
GPIO_PIN2
GPIO_PIN3
GPIO_PIN4
GPIO_PIN5
GPIO_PIN6
GPIO_PIN7
GPIO_PIN8
GPIO_PIN9
GPIO_PIN10
GPIO_PIN11
GPIO_PIN12
GPIO_PIN13
GPIO_PIN14
GPIO_PIN15







GPIO_PRIMARY_MODULE_FUNCTION
GPIO_SECONDARY_MODULE_FUNCTION
GPIO_TERNARY_MODULE_FUNCTION

我们注意到函数的命名规则是:
 以函数
uint8_t GPIO_getInputPinValue        (uint8_t selectedPort,uint16_t selectedPins )        为例
    我们看到函数名以大些的GPIO开头,然后下划线,接着小写的get开头,后面的单子分别是大写字母打头。在引用库函数时候要注意到这些细节。另外看函数参变量类似,均告诉了你该值的类型与位宽。

    另外注意到跟中断有关的函数只有一个GPIO_interruptEdgeSelect()中断边沿选择的selectedPort是可以有18个值可以选择,其余只有3个值可以选择。

    另外要记住,对于管脚变量selectedPins输入时候是可以使用可选值的逻辑或运算的。

    我们观察函数名,发现按照字面意思就可以知道该函数的作用,也就是属于自然语言表达的函数名。
例如:GPIO_setOutputLowOnPin (GPIO_PORT_P1, GPIO_PIN0);   
GPIO_   表示这个函数属于GPIO外设族的,后面set(设置)Output(输出)Low(低电平)On()Pin(管脚)……,连起来读就是:设置输出低电平在管脚(xx,xx)只需要我们在参数里天上我们指定的管脚就行了,根本不用管关心需要操作什么寄存器,毕竟寄存器名字读起来没有自然语言表达更清楚明了。



希望大家踊跃发言参与本次学习活动,跟版主一起学习,并提出你的观点,本版主虚心接受大家的批评和建议,并愿和大家一起学习进步。活动结束将会根据网友提出的宝贵建议更新本文档,并将完整版上传给大家下载学习。
 楼主 | 2015-3-24 10:57 | 显示全部楼层
本帖最后由 xlhtracy 于 2015-3-24 11:27 编辑

2.5  问题提出
1为什么关于中断边沿选择的函数GPIO_interruptEdgeSelect()的参数selectedPort可以有18个量可以选择,而不是像其他4个关于中断设置的函数,只有GPIO_PORT_P1、
GPIO_PORT_P2GPIO_PORT_PA 三个量可以选择

2.在表3中给出的selectedPort所选的18个量,我用不同颜色做了标记,根据本章2.1引言部分介绍,PA就是P1P2的合,那么在位的对应关系上,是怎样对应的,是高位在前还是低位在前?请结合手册找出该对应关系。

3.结合例程,使用库函数编写程序:P1.1配置为中断上升沿触发按钮,在P2上有8LED灯,初始时候灯是间隔点亮的,记为P2.0为亮。当按键触发时候全部灭掉,第二次中断触发的时候,轮流点亮。第三次触发的时候全部点亮。如此按键,将会循环上面的操作(即:全灭->轮流跑马灯->全亮)。

4.谈谈你对本库函数的认识,什么情况下使用方便,什么情况下使用不方便。


本科内容主要学习了解基于CCStudio6的库函数开发过程,学会阅读库函数,以及了解GPIO_相关的13个函数的功能和使用方法。另外请关注本帖,学习的同时跟帖与网友做好学习交流。
 楼主 | 2015-3-24 10:59 | 显示全部楼层
本帖最后由 xlhtracy 于 2015-3-24 11:45 编辑

资料下载:
第一讲完整课件内容下载:


官方的文件,库函数,应用手册,例程, 包括最新版2.0的下载地址和内容。


MSP430i2xx系列单片机用户手册:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评论

gurong60 2015-3-25 10:28 回复TA
建议楼主发开发板,这样大家对照的玩,才有兴趣,光将没练手,不合适 
 楼主 | 2015-3-24 11:01 | 显示全部楼层
占楼
| 2015-3-24 12:16 | 显示全部楼层
没有片子,只能观望
| 2015-3-24 14:03 | 显示全部楼层
非常全面的资料整理啊
| 2015-3-24 14:40 | 显示全部楼层
网页上的表单没有框框,还好有PDF下载,谢谢分享,下载学习一下,参加活动拿大奖。
| 2015-3-24 14:47 | 显示全部楼层
iar的教程有没有
| 2015-3-24 15:02 | 显示全部楼层

目前还没有,如果需要我下载个IAR for MSP430研究一下,到时候制作成教程发出来。
| 2015-3-24 15:11 | 显示全部楼层
给力呢
| 2015-3-24 15:40 | 显示全部楼层
本帖最后由 数码小叶 于 2015-3-24 15:42 编辑

有这么一段话:“单个端口可以作为可以以字节宽度进行访问,也可以合二为一组合成字宽,以字的格式进行访问。P1/P2, P3/P4, P5/P6, P7/P8,四对端口分别对应PA、PB、PC、PD。除了中断向量P1IV和P2IV外,所有的端口寄存器是按照这种命名约定方式处理的,也就是说不存在中断向量PAIV。”后半句不理解:”除了中断向量P1IV和P2IV外,所有的端口寄存器是按照这种命名约定方式处理的,也就是说不存在中断向量PAIV“不太理解这块,还有那个”断言语句“第一次了解
| 2015-3-24 15:47 | 显示全部楼层
数码小叶 发表于 2015-3-24 15:40
有这么一段话:“单个端口可以作为可以以字节宽度进行访问,也可以合二为一组合成字宽,以字的格式进行访问 ...

灰常好,
       编程断言:编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设。断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。
       以上是百度百科里讲的。我是根据TI的英文版说明直接翻译的,但是我觉得这个断言应该是指的断点调试相关的东西吧。所以需要和网友互动,大家一起讨论其中的疑点。
另外一个关于中断向量的问题,因为在IO端口使用上,我们可以使用P1,P……,也可以使用PA,PB,, 另外前面说PA是字的宽度(16bits)P1,P2分别是字节宽度(8bits),另外PA=P1和P2,而中断向量里只定义了对应P1,和P2宽度的,没有定义对应PA宽度的。

| 2015-3-24 15:58 | 显示全部楼层
gaoyang9992006 发表于 2015-3-24 15:47
灰常好,
       编程断言:编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设。断 ...

我也百度了一下,ccs还在更新,虽然是ccs6,发现没i2系列,寄存器定义,等更新完了,看下就清楚了
| 2015-3-24 16:03 | 显示全部楼层
本帖最后由 地瓜patch 于 2015-3-24 16:04 编辑

围观技术高
| 2015-3-24 16:04 | 显示全部楼层
第一个问题中的函数名,在2.0的手册中,名字已经更改了:void GPIO selectInterruptEdge ( uint8 t selectedPort, uint16 t selectedPins, uint8 t
edgeSelect )
| 2015-3-24 16:12 | 显示全部楼层
对于这样库函数,我感觉,在IO口操作时,选择寄存器,会来的更方便,在操作外设,比如定时器,ADC的时候,函数写起来就更方便了
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

分享 快速回复 返回顶部 返回列表