【MSP430i2xx教程第一讲】怎样使用库函数 & GPIO详解
本帖最后由 zhangmangui 于 2020-3-19 22:37 编辑后续课程已发布:
【MSP430i2xx教程第二讲】时钟系统 & EUSCI_A_UART 【MSP430i2xx教程第三讲】24-BitΣ-Δ 模数转换器 & FlashCtl-Flash存储控制器【MSP430i2xx教程第四讲】电源管理模块 & TLV
欢迎继续学习讨论~
版主补充资料:
MSP430开发教程(含代码)
序言
1.1综述 德州仪器®MSP430®外设驱动程序库是一组基于访问MSP430i2xx家族微控制器的外设驱动程序。虽然它们不是纯粹的操作系统意义上的驱动程序,但他们提供一种容易使用外设的机制。 驱动的功能和 组织都是遵循以下设计目标:
[*] 他们都是完全由C语言编写(除了那些C绝对不可能实现的功能外)。
[*] 他们演示如何在常见的操作模式下使用外设。
[*] 他们很容易理解。
[*] 他们在内存和处理器的使用上是合理高效的。
[*] 他们尽可能独立(模块化)。
[*] 在可能的情况下,计算指令在编译时候执行,而不是在运行时完成(代码编译的高效性)。
[*] 他们可以适用于不只一个的工具链构建(目前提供三种:CSS、GCC、IAR)。
基于以上的设计目标可能有以下不好的影响:
[*] 从一个代码大小和执行速度来考虑,驱动程序不一定是高效的代码。而最有效的操作外设的代码是在应用程序有特定需求下进行量身定制而编写的。更进一步的对驱动程序代码尺寸优化将会使得驱动代码更难以理解。
[*] 驱动程序不能够实现硬件的全部功能。一些外设提供的复杂功能不能通过本库函数提供的驱动程序实现。但是你可以使用现有代码作为参考来添加额外的功能支持。
[*] 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°
封装类型请查看:www.ti.com/packaging
包装类型T=小卷包装;R=大卷包装;没有标记:管或盘
附加特性EP=增强型(-40℃到150℃);HT=极端温度(-55到150℃);Q1=汽车级
MSP430i2xx系列是一款工业级430产品。
版权声明:以上内容均翻译自TI英文版MSP430i2xx系列库函数使用手册引言部分。有不合理和错误之处,请回帖说明,在此谢谢各位网友,此文档内容版权还归TI所有。
本帖最后由 xlhtracy 于 2015-4-1 10:49 编辑
第一章怎样使用库函数(CCS版)1.1开发环境介绍CCS6.1是目前CCStudio的最新版本,也是支持最全面的版本,本文档所有内容均在该版本下测试完成。经过作者测试CCS5系列还没有引入库函数概念,建议升级到最新版CCStudio6.1.下载地址:http://processors.wiki.ti.com/index.php/Download_CCS 或通过百度网盘下载http://pan.baidu.com/s/1dDhaY0T————————————————————————————————————————启动CCS6,单击菜单栏的 View-> Resource Explorer(Examples)
图1我们看到CCS菜单栏View下第一个Resource explorer(Examples),单击。弹出窗口就是TI Resource Explorer。如图2,我们可以看到我们安装的MSP430ware/Lirbrary如果你安装时候没有勾选安装MSP430ware,请通过Help/check for updates或App Center升级安装。图2
点击 MSP430ware ,你将看到介绍页面. 通过左边的列表可以找到我们这里要介绍的MSP430i2xx系列的用户手册(User’s Guide)、API编程手册(API Programmer’s 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或者在CCS的TI Resource Explorer里找到MSP430ware->Libraries->MSP430i2xx->API Programmer’s Guide。这时右边窗口会出现如下图所示。左边分别有三个选项:Modules(模块)、Data Structures(数据结构)、Files(文件)。如图5所示。
图5通过Modules(模块)可以查看该系列单片机所有外设模块的库函数介绍,如图6所示为GPIO_clearInterruptFlag函数的相关说明。
图6通过Files选项我们可以看到头文件列表,我们找到gpio.h单击,右边就弹出该文件的内容,我们翻页找到上面对应 那个函数,通过函数的注释,我们也可以看懂该函数包含了两个参数,以及参数的取值范围,该函数的作用。我们发现默认的注释字体是红色的,如果你觉得CCS给的配色十分的不愉快,可以使用Notepad++。
图7
笔者经常使用Notepad++阅读代码的,在CCS里你也可以通过修改配置来改变代码显示的配色,具体方法这里不作介绍。
图81.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
本帖最后由 xlhtracy 于 2015-3-24 11:03 编辑
第二章GPIO GPIO是General Purpose Input/Output(通用输入输出)的简称,是单片机最基本,最必须,最重要的外设,每个GPIO端口可通过软件分别配置成输入或输出。
数字I/O(GPIO)API(Application Programming Interface,应用程序编程接口)为使用MP430i2xx GPIO模块提供了一组函数。这些函数可以设置、使能使用I/O管脚(针脚、插脚),设置他们是否有中断,以及对管脚值的读和写。数字I / O功能包括:
[*] 可对单独的I/O独立编程
[*] 可对输入输出任意组合
[*] 可单独配置P1和P2端口中断,另外一些型号可能包含其他端口的中断。
[*] 具有独立的输入和输出数据寄存器
[*] 可单独配置上拉或下拉电阻
2.1本章引言 该系列单片机具备的I/O端口数量最高可达12组(P1至P11,外加PJ端口)。大部分呢端口每组包含8个管脚;然后,一些端口可用的管脚较少,不足8个(端口包含可用管脚的具体情况需要查看对应芯片的数据手册)。每个I/O管脚可用分别配置为输入或输出,并且每个可用单独进行读/写操作。
端口P1和P2都具备中断功能。P1和P2两组端口的每一位管脚都可以单独配置成在输入一个上升沿或下降沿时候触发中断的功能。
P1所有的管脚位中断源自一个单独的中断向量P1IV,P2所有的管脚中断院子另外一个单独的中断向量P2IV。在一些单片机中,可能具备额外中断功能的端口,且包含他们各自的中断向量(具体情况,需要从该型号单片机的数据手册中获取)。
单个端口可以作为可以以字节宽度进行访问,也可以合二为一组合成字宽,以字的格式进行访问。P1/P2, P3/P4, P5/P6, P7/P8,四对端口分别对应PA、PB、PC、PD。除了中断向量P1IV和P2IV外,所有的端口寄存器是按照这种命名约定方式处理的,也就是说不存在中断向量PAIV。
当以字为单位操作PA时候,所有的16位被写入端口。当用字节操作PA端口的低字节时候,高字节保持不变。同样,用字节指令写PA端口的高字节时候,低字节不变。当写端口时候,使用的位宽少于该端口的最大位宽时候,不用的位是不受影响的。端口PB、P、PD、PE和PF也是类似的。
使用字操作读PA端口,可以读到16位管脚的全部状态。使用字节操作,读PA端口(P1或P2)的低字节或高字节,分别只能读出低字节或高字节。使用字节操作,读PA端口,并存储到一个通用寄存器,本字节只被写入到寄存器的最低有效字节。目的寄存器的高位有效字节将自动被清除。端口PB、PC、PD、PE和PF类似。当读那些可能少于最大位宽的端口时候,未使用的位读作0(类似于端口PJ)。
GPIO 管脚可使用函数GPIO_setAsOutputPin() 或GPIO_setAsInputPin()配置为一个I/O管脚。使用外设分配函数GPIO_setAsPeripheralModuleFunctionOutputPin()或GPIO_setAsPeripheralModuleFunctionInputPin().可以把GPIO管脚替换成外围模块功能(即使用管脚I/O功能外的其他功能)。
这个驱动程序包含在gpio.c文件里,gpio.h头文件包含该应用程序使用的API定义。2.2函数总览
1void GPIO_setAsOutputPin (uint8_t selectedPort, uint16_t selectedPins)
该函数可以配置所选管脚作为输出管脚
2void GPIO_setAsInputPin (uint8_t selectedPort, uint16_t selectedPins)
该函数可以配置所选管脚作为输入管脚
3void GPIO_setAsPeripheralModuleFunctionOutputPin (uint8_t selectedPort, uint16_t selectedPins, uint8_t mode)
该函数配置所选管脚上输出方向的外设
4void GPIO_setAsPeripheralModuleFunctionInputPin (uint8_t selectedPort, uint16_t selectedPins, uint8_t mode)
该函数配置所选管脚上输入方向的外设
5void GPIO_setOutputHighOnPin (uint8_t selectedPort, uint16_t selectedPins)
该函数在所选管脚上输出高电平
6void GPIO_setOutputLowOnPin (uint8_t selectedPort, uint16_t selectedPins)
该函数在所选管脚上输出低电平
7void GPIO_toggleOutputOnPin (uint8_t selectedPort, uint16_t selectedPins)
该函数翻转所选管脚的输出电平
8uint8 t GPIO_getInputPinValue (uint8_t selectedPort, uint16_t selectedPins)该函数可以获取所选管脚的输入值
9void GPIO_enableInterrupt (uint8_t selectedPort, uint16_t selectedPins)
该函数使能所选管脚的端口中断功能
10void GPIO_disableInterrupt (uint8_t selectedPort, uint16_t selectedPins)
该函数禁用所选管脚端口的中断
11uint16 t GPIO_getInterruptStatus (uint8_t selectedPort, uint16_t selectedPins)
该函数可以获取被选中的端口的中断状态
12void GPIO_clearInterruptFlag (uint8 t selectedPort, uint16 t selectedPins)
该函数可以清除所选管脚的中断标志
13void 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)
该函数可以清除所选管脚的中断标志。需要注意的是只针对端口1、2、A有效。因为只有P1,P2,PA(前面说过P1和P2组合后作为字标记为PA)有效。 该函数具有两个参数:selectedPort(所选端口)和selectedPins(所选管脚)。 selectedPort可选的有效值有三个:GPIO_PORT_P1、GPIO_PORT_P2、GPIO_PORT_PA。 selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0、GPIO_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_PIN0、GPIO_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_PIN0、GPIO_PIN1、GPIO_PIN2……GPIO_PIN15等十六个值的逻辑或。 该函数是通过修改寄存器PxIE实现,返回值 None(空)。
本帖最后由 xlhtracy 于 2015-3-24 11:14 编辑
uint8 t GPIO_getInputPinValue (uint8_t selectedPort, uint16_t selectedPins)
该函数获取所选管脚的输入值。 该函数具有两个参数:selectedPort(所选端口)和selectedPins(所选管脚)。 selectedPort可选的有效值有18(11+7)个:GPIO_PORT_P1、GPIO_PORT_P2……GPIO_PORT_P11,GPIO_PORT_PA、 GPIO_PORT_PB、GPIO_PORT_PC、GPIO_PORT_PD、GPIO_PORT_PE、GPIO_PORT_PF、GPIO_PORT_PJ。 注意:数字标记的为以字节为操作位宽(8位)的,字母标记的为以字为位宽(16位)操作的。 selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0、GPIO_PIN1、GPIO_PIN2……GPIO_PIN15等十六个值的逻辑或。 返回值:GPIO_INPUT_PIN_HIGH或GPIO_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可选的有效值有18(11+7)个:GPIO_PORT_P1、 GPIO_PORT_P2……GPIO_PORT_P11,GPIO_PORT_PA、GPIO_PORT_PB、GPIO_PORT_PC、GPIO_PORT_PD、GPIO_PORT_PE、GPIO_PORT_PF、GPIO_PORT_PJ。 注意:数字标记的为以字节为操作位宽(8位)的,字母标记的为以字为位宽(16位)操作的。 selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0、GPIO_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可选的有效值有18(11+7)个:GPIO_PORT_P1、GPIO_PORT_P2……GPIO_PORT_P11,GPIO_PORT_PA、GPIO_PORT_PB、GPIO_PORT_PC、GPIO_PORT_PD、GPIO_PORT_PE、GPIO_PORT_PF、GPIO_PORT_PJ。 注意:数字标记的为以字节为操作位宽(8位)的,字母标记的为以字为位宽(16位)操作的。 selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0、GPIO_PIN1、GPIO_PIN2……GPIO_PIN15等十六个值的逻辑或。 该函数是通过修改寄存器PxDIR、PxREN、和PxSEL的位实现,返回值 None(空)。
void GPIO_setAsOutputPin (uint8_t selectedPort, uint16_t selectedPins)
该函数把所选管脚配置为输出管脚。 该函数具有两个参数:selectedPort(所选端口)和selectedPins(所选管脚)。 selectedPort可选的有效值有18(11+7)个:GPIO_PORT_P1、GPIO_PORT_P2……GPIO_PORT_P11,GPIO_PORT_PA、GPIO_PORT_PB、GPIO_PORT_PC、GPIO_PORT_PD、GPIO_PORT_PE、GPIO_PORT_PF、GPIO_PORT_PJ。 注意:数字标记的为以字节为操作位宽(8位)的,字母标记的为以字为位宽(16位)操作的。 selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0、GPIO_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可选的有效值有18(11+7)个:GPIO_PORT_P1、GPIO_PORT_P2……GPIO_PORT_P11,GPIO_PORT_PA、GPIO_PORT_PB、GPIO_PORT_PC、GPIO_PORT_PD、GPIO_PORT_PE、GPIO_PORT_PF、GPIO_PORT_PJ。 注意:数字标记的为以字节为操作位宽(8位)的,字母标记的为以字为位宽(16位)操作的。 selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0、GPIO_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可选的有效值有18(11+7)个:GPIO_PORT_P1、GPIO_PORT_P2……GPIO_PORT_P11,GPIO_PORT_PA、GPIO_PORT_PB、GPIO_PORT_PC、GPIO_PORT_PD、GPIO_PORT_PE、GPIO_PORT_PF、GPIO_PORT_PJ。 注意:数字标记的为以字节为操作位宽(8位)的,字母标记的为以字为位宽(16位)操作的。 selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0、GPIO_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可选的有效值有18(11+7)个:GPIO_PORT_P1、GPIO_PORT_P2……GPIO_PORT_P11,GPIO_PORT_PA、GPIO_PORT_PB、GPIO_PORT_PC、GPIO_PORT_PD、GPIO_PORT_PE、GPIO_PORT_PF、GPIO_PORT_PJ。 注意:数字标记的为以字节为操作位宽(8位)的,字母标记的为以字为位宽(16位)操作的。 selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0、GPIO_PIN1、GPIO_PIN2……GPIO_PIN15等十六个值的逻辑或。 该函数是通过修改寄存器PxOUT的位实现,返回值 None(空)。
void GPIO_setOutputLowOnPin (uint8_t selectedPort, uint16_t selectedPins)
该函数在所选端口的管脚配置为输出低电平。 该函数具有两个参数:selectedPort(所选端口)和selectedPins(所选管脚)。 selectedPort可选的有效值有18(11+7)个:GPIO_PORT_P1、GPIO_PORT_P2……GPIO_PORT_P11,GPIO_PORT_PA、GPIO_PORT_PB、GPIO_PORT_PC、GPIO_PORT_PD、GPIO_PORT_PE、GPIO_PORT_PF、GPIO_PORT_PJ。 注意:数字标记的为以字节为操作位宽(8位)的,字母标记的为以字为位宽(16位)操作的。 selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0、GPIO_PIN1、GPIO_PIN2……GPIO_PIN15等十六个值的逻辑或。 该函数是通过修改寄存器PxOUT的位实现,返回值 None(空)。
void GPIO_toggleOutputOnPin (uint8_t selectedPort, uint16_t selectedPins)
该函数在所选端口的管脚进行电平的翻转,进行高低电平切换。 该函数具有两个参数:selectedPort(所选端口)和selectedPins(所选管脚)。 selectedPort可选的有效值有18(11+7)个:GPIO_PORT_P1、GPIO_PORT_P2……GPIO_PORT_P11,GPIO_PORT_PA、GPIO_PORT_PB、GPIO_PORT_PC、GPIO_PORT_PD、GPIO_PORT_PE、GPIO_PORT_PF、GPIO_PORT_PJ。 注意:数字标记的为以字节为操作位宽(8位)的,字母标记的为以字为位宽(16位)操作的。 selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0、GPIO_PIN1、GPIO_PIN2……GPIO_PIN15等十六个值的逻辑或。 该函数是通过修改寄存器PxOUT的位实现,返回值 None(空)。
本帖最后由 xlhtracy 于 2015-3-24 11:27 编辑
2.5问题提出1.为什么关于中断边沿选择的函数GPIO_interruptEdgeSelect()的参数selectedPort可以有18个量可以选择,而不是像其他4个关于中断设置的函数,只有GPIO_PORT_P1、GPIO_PORT_P2、GPIO_PORT_PA 三个量可以选择?
2.在表3中给出的selectedPort所选的18个量,我用不同颜色做了标记,根据本章2.1引言部分介绍,PA就是P1和P2的合,那么在位的对应关系上,是怎样对应的,是高位在前还是低位在前?请结合手册找出该对应关系。
3.结合例程,使用库函数编写程序:P1.1配置为中断上升沿触发按钮,在P2上有8个LED灯,初始时候灯是间隔点亮的,记为P2.0为亮。当按键触发时候全部灭掉,第二次中断触发的时候,轮流点亮。第三次触发的时候全部点亮。如此按键,将会循环上面的操作(即:全灭->轮流跑马灯->全亮)。
4.谈谈你对本库函数的认识,什么情况下使用方便,什么情况下使用不方便。
本科内容主要学习了解基于CCStudio6的库函数开发过程,学会阅读库函数,以及了解GPIO_相关的13个函数的功能和使用方法。另外请关注本帖,学习的同时跟帖与网友做好学习交流。 本帖最后由 xlhtracy 于 2015-3-24 11:45 编辑
资料下载:
第一讲完整课件内容下载:
官方的文件,库函数,应用手册,例程, 包括最新版2.0的下载地址和内容。
MSP430i2xx系列单片机用户手册:
占楼 没有片子,只能观望 非常全面的资料整理啊 网页上的表单没有框框,还好有PDF下载,谢谢分享,下载学习一下,参加活动拿大奖。 iar的教程有没有 gaochy1126 发表于 2015-3-24 14:47
iar的教程有没有
目前还没有,如果需要我下载个IAR for MSP430研究一下,到时候制作成教程发出来。 给力呢 本帖最后由 数码小叶 于 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:40
有这么一段话:“单个端口可以作为可以以字节宽度进行访问,也可以合二为一组合成字宽,以字的格式进行访问 ...
灰常好,
编程断言:编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设。断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。
以上是百度百科里讲的。我是根据TI的英文版说明直接翻译的,但是我觉得这个断言应该是指的断点调试相关的东西吧。所以需要和网友互动,大家一起讨论其中的疑点。
另外一个关于中断向量的问题,因为在IO端口使用上,我们可以使用P1,P……,也可以使用PA,PB,, 另外前面说PA是字的宽度(16bits)P1,P2分别是字节宽度(8bits),另外PA=P1和P2,而中断向量里只定义了对应P1,和P2宽度的,没有定义对应PA宽度的。
gaoyang9992006 发表于 2015-3-24 15:47
灰常好,
编程断言:编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设。断 ...
我也百度了一下,ccs还在更新,虽然是ccs6,发现没i2系列,寄存器定义,等更新完了,看下就清楚了 本帖最后由 地瓜patch 于 2015-3-24 16:04 编辑
围观技术高 第一个问题中的函数名,在2.0的手册中,名字已经更改了:void GPIO selectInterruptEdge ( uint8 t selectedPort, uint16 t selectedPins, uint8 t
edgeSelect ) 对于这样库函数,我感觉,在IO口操作时,选择寄存器,会来的更方便,在操作外设,比如定时器,ADC的时候,函数写起来就更方便了 数码小叶 发表于 2015-3-24 16:04
第一个问题中的函数名,在2.0的手册中,名字已经更改了:void GPIO selectInterruptEdge ( uint8 t selecte ...
嗯,你很细心啊,那个问题就是他们制作库函数时候的一个失误,不过最新版的CCS给的是1.97,这几天刚更新了2.0,所以我赶紧传上来供大家找问题时候看看他们是否纠正,当时我做课件时候对这一点就很怀疑了,所以放在问题里了。