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

[复制链接]
楼主: xlhtracy
| 2015-3-25 08:42 | 显示全部楼层
内容不错啊,排版也看着挺舒服的,很详细,一下就学会了,我还不知道都用什么寄存器呢,果然库函数好玩,希望下期来点模数转换或者串口的。
| 2015-3-25 13:37 | 显示全部楼层
楼主没哟设置成仅作者可见,不然会出现照抄的嫌疑啊。
| 2015-3-25 13:46 | 显示全部楼层
1.为什么关于中断边沿选择的函数GPIO_interruptEdgeSelect()的参数selectedPort可以有18个量可以选择,而不是像其他4个关于中断设置的函数,只有GPIO_PORT_P1GPIO_PORT_P2GPIO_PORT_PA三个量可以选择?
答:该系列单片机具备的I/O端口数量最高可达12组(P1P11,外加PJ端口)。大部分呢端口每组包含8个管脚;然后,一些端口可用的管脚较少,不足8个(端口包含可用管脚的具体情况需要查看对应芯片的数据手册)。每个I/O管脚可用分别配置为输入或输出,并且每个可用单独进行读/写操作。
       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
2.在表3中给出的selectedPort所选的18个量,我用不同颜色做了标记,根据本章2.1引言部分介绍,PA就是P1P2的合,那么在位的对应关系上,是怎样对应的,是高位在前还是低位在前?请结合手册找出该对应关系。
答:高位在前。
3.结合例程,使用库函数编写程序:P1.1配置为中断上升沿触发按钮,在P2上有8LED灯,初始时候灯是间隔点亮的,记为P2.0为亮。当按键触发时候全部灭掉,第二次中断触发的时候,轮流点亮。第三次触发的时候全部点亮。如此按键,将会循环上面的操作(即:全灭->轮流跑马灯->全亮)。

//定义标志位flag
Uint8  flag=0;
// 把P2设置为输出端口
GPIO_setAsOutputPin(GPIO_PORT_P2,GPIO_PIN0);
GPIO_setAsOutputPin(GPIO_PORT_P2,GPIO_PIN1);
GPIO_setAsOutputPin(GPIO_PORT_P2,GPIO_PIN2);
GPIO_setAsOutputPin(GPIO_PORT_P2,GPIO_PIN3);
GPIO_setAsOutputPin(GPIO_PORT_P2,GPIO_PIN4);
GPIO_setAsOutputPin(GPIO_PORT_P2,GPIO_PIN5);
GPIO_setAsOutputPin(GPIO_PORT_P2,GPIO_PIN6);
GPIO_setAsOutputPin(GPIO_PORT_P2,GPIO_PIN7);
GPIO_setOutputHighOnPin(GPIO_PORT_P2,GPIO_PIN0);
GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN1);
GPIO_setOutputHighOnPin(GPIO_PORT_P2,GPIO_PIN2);
GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN3);
GPIO_setOutputHighOnPin(GPIO_PORT_P2,GPIO_PIN4);
GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN5);
GPIO_setOutputHighOnPin(GPIO_PORT_P2,GPIO_PIN6);
GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN7);
// 把P1.1设置为输入端口
GPIO_setAsInputPin(GPIO_PORT_P1,GPIO_PIN1);
while (1)
{
if(GPIO_INPUT_PIN_HIGH== GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1))
{
//按键消抖
asm("nop");
asm("nop");
asm("nop");
// 第一次按键测试管脚P1.1
if((GPIO_INPUT_PIN_HIGH== GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1)&&flag==0))
{
GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN0);
GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN1);
GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN2);
GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN3);
GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN4);
GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN5);
GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN6);
GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN7);
flag=1;
}
//第二次按键测试管脚P1.1
else if ((GPIO_INPUT_PIN_HIGH== GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1)&&flag==1))
{
GPIO_ setOutputHighOnPin(GPIO_PORT_P2,GPIO_PIN0);
GPIO_ setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN0);
GPIO_ setOutputHighOnPin(GPIO_PORT_P2,GPIO_PIN1);
GPIO_ setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN1);
GPIO_ setOutputHighOnPin(GPIO_PORT_P2,GPIO_PIN2);
GPIO_ setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN2);
GPIO_ setOutputHighOnPin(GPIO_PORT_P2,GPIO_PIN3);
GPIO_ setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN3);
GPIO_ setOutputHighOnPin(GPIO_PORT_P2,GPIO_PIN4);
GPIO_ setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN4);
GPIO_ setOutputHighOnPin(GPIO_PORT_P2,GPIO_PIN5);
GPIO_ setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN5);
GPIO_ setOutputHighOnPin(GPIO_PORT_P2,GPIO_PIN6);
GPIO_ setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN6);
GPIO_ setOutputHighOnPin(GPIO_PORT_P2,GPIO_PIN7);
GPIO_ setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN7);
flag=2;
}
//第三次按键测试管脚P1.1
else ((GPIO_INPUT_PIN_HIGH== GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1)&&flag==2))
{
GPIO_ setOutputHighOnPin(GPIO_PORT_P2,GPIO_PIN0);
GPIO_ setOutputHighOnPin(GPIO_PORT_P2,GPIO_PIN1);
GPIO_ setOutputHighOnPin(GPIO_PORT_P2,GPIO_PIN2);
GPIO_ setOutputHighOnPin(GPIO_PORT_P2,GPIO_PIN3);
GPIO_ setOutputHighOnPin(GPIO_PORT_P2,GPIO_PIN4);
GPIO_ setOutputHighOnPin(GPIO_PORT_P2,GPIO_PIN5);
GPIO_ setOutputHighOnPin(GPIO_PORT_P2,GPIO_PIN6);
GPIO_ setOutputHighOnPin(GPIO_PORT_P2,GPIO_PIN7);
flag=0;
}
}
4.谈谈你对本库函数的认识,什么情况下使用方便,什么情况下使用不方便。
答:GPIO库函数比较实用,库函数中的每个函数的参数都是采用了单间易懂的英文大写,尤其是对C语言初学者和对MCU内部结构或者寄存去不是非常熟悉的情况下非常容易上手。
但是对于一些特殊应用需求(比如运行效率要求比较高的场合)下显得有些麻烦,尤其是有些函数的参数非常长,书写起来不是很方便。

| 2015-3-25 13:47 | 显示全部楼层
利用最原始的方法回答问题。
| 2015-3-25 14:04 | 显示全部楼层
谢谢楼主,您辛苦了!我在着手学习430呢!赞赞赞
 楼主 | 2015-3-25 14:25 | 显示全部楼层
songchenping 发表于 2015-3-25 13:37
楼主没哟设置成仅作者可见,不然会出现照抄的嫌疑啊。

教程是作者授权偶发布的,为了方便大家学习讨论,就不做过多限制啦  
| 2015-3-25 15:50 | 显示全部楼层
xlhtracy 发表于 2015-3-24 10:19
2.3  例程下面简单的例程用于展示如何使用GPIO API。// 把P1.0设置为输出端口GPIO_setAsOutputPin (GPIO_PO ...

问一下  CCS 需要注册码使用的吗?
| 2015-3-25 16:56 | 显示全部楼层
GPIO的功能选择  的 外围模块功能(就是最后一个功能)   是一个什么样的功能啊 ?   能具体出来吗?这样说 太抽象了
| 2015-3-25 17:43 | 显示全部楼层
本帖最后由 anvy178 于 2015-3-25 19:04 编辑

1.  2.0版本的库函数  好像并不存在 所提的 问题一   好像参量全部统一了   我对比了下头文件 ,还有那个函数的名称也改变了 。 看手册的 库函数的 寄存器手册 ,只有p1 ,p2端口存在独立的中断功能,独立的中断参数。所以,如果函数没封装好的话,会导致问题一的出现 。但是 我看了下 代码 ,发现其实除了1 2口 有定义地址之外   其它 的参数 应该都是返回0xffff的  ,好像没什么意义。
2.   p1 ,p2 假如这两个按照字来操作的话 ,从库函数 selectedPins <<= 8;可以看出    加入是 p1 p2结合操作的话 就是P2 在前。位并没有进行变动 ,那么就还是高位在前。
3.对于出东西来说  ,肯定是库函数 有优势,但是 就是相对于学习来说 ,从库函数入手  ,然后再到 底层 去看一下  学习一下 别人的做法 也未尝不是一件
好事  ,可能库函数对于某些操作比较频繁的东西 有锁欠缺,但是可以说 是 学习的 好帮手,出产品的利刃啊 。


| 2015-3-25 19:39 | 显示全部楼层

同求iar教程,一直用的iar,学起来比较容易上手.
| 2015-3-25 20:15 | 显示全部楼层
试了下第三个题,感觉比ARM的库函数简单,另外不知道这个的寄存器使用和中断服务函数,所以写的程序不一定正确,给大家交流交流哈

本帖子中包含更多资源

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

x
| 2015-3-25 21:12 | 显示全部楼层
xlhtracy 发表于 2015-3-24 10:57
2.5  问题提出1.为什么关于中断边沿选择的函数GPIO_interruptEdgeSelect()的参数selectedPort可以有18个量 ...

刚刚看了一下库函数,在2.0的库里没找到GPIO_interruptEdgeSelect().
后来发现,DriverLib1.97版里面是GPIO_interruptEdgeSelect(),DriverLib2.0版里面是GPIO_selectInterruptEdge().怎么库升级把函数名都变了啊?这岂不是给程序的移植制造麻烦吗?你觉得有必要吗?
| 2015-3-25 21:34 | 显示全部楼层
PDF档看起来更舒服。
| 2015-3-25 21:36 | 显示全部楼层
3qxj 发表于 2015-3-24 19:09
"断言"说的是"断点"吧?

断言是assert

| 2015-3-25 21:37 | 显示全部楼层
胡斯哲 发表于 2015-3-24 20:34
用库函数太复杂了点,觉得还是用寄存器好些

同感,库函数接口容易变动。。。
| 2015-3-25 21:40 | 显示全部楼层
gaoyang9992006 发表于 2015-3-25 08:21
是的,MSP430凭借独特的低功耗特性完胜手持设备,电池供电设备以及太阳能供电设备的其他主控MCU应用,低 ...

MSP430FRxxx

我在官网申请,客服说我现在的公司涉及军品,取消了。郁闷。

手上也没板子。
| 2015-3-25 22:20 | 显示全部楼层
不错。但是
1.iar什么版本支持这款单片机
2.有库函数手册吗
3.硬件平台如何获得
| 2015-3-25 22:55 | 显示全部楼层
xlhtracy 发表于 2015-3-24 10:57
2.5  问题提出1.为什么关于中断边沿选择的函数GPIO_interruptEdgeSelect()的参数selectedPort可以有18个量 ...

手册里讲端口中断时,只提到了P1和P2有中断功能(详见手册158页),不过后面补充说有些器件可能会有除这两个口以外的端口有中断功能.我想按手册上的意思应该这个系列只有这两个口有中断功能吧.手册里没有提到PA,可能PA就是所谓的“有些器件”,至于GPIO_interruptEdgeSelect()有18个量可以选,应该是有些问题的。
| 2015-3-26 01:37 | 显示全部楼层
xlhtracy 发表于 2015-3-24 10:57
2.5  问题提出1.为什么关于中断边沿选择的函数GPIO_interruptEdgeSelect()的参数selectedPort可以有18个量 ...

刚刚看了一下库函数的头文件定义以及在c文件中的调用,PA和P1的偏移地址是一样的,并且根据宏定义似乎无法判断PA和P1的区别。那PA是如何表示P1与P2的合呢?我还没弄明白。
| 2015-3-26 01:40 | 显示全部楼层
xlhtracy 发表于 2015-3-24 10:57
2.5  问题提出1.为什么关于中断边沿选择的函数GPIO_interruptEdgeSelect()的参数selectedPort可以有18个量 ...

这里给出的库函数在用来对单个引脚操作时没有直接操作寄存器方便,在按字或者字节读写数据时非常方便。
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

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

论坛热帖

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