打印
[MCU]

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

[复制链接]
楼主: xlhtracy
手机看帖
扫描二维码
随时随地手机跟帖
161
uestc_zyd| | 2015-3-31 17:40 | 只看该作者 回帖奖励 |倒序浏览
在2.2小节中的“函数文档”部分很多函数都提到了“selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PIN0、GPIO_PIN1、GPIO_PIN2……GPIO_PIN15等十六个值的逻辑或。该函数是通过修改寄存器PxOUT的位实现,返回值 None(空)。”这里我有些不明白。
我的理解是selectedPins应该是0~15个pin中的某一个,但是这里说的“掩码值”指什么呢?是“十六个值的逻辑或”?那我的理解是GPIO_PINn(n=0~15)就是16位的寄存器,selectedPins是几就在那一位上置1,最后将16个寄存器的16位值逻辑或,得到一个寄存器的16位表示,第几位是1就表示第几个pin被选。
比如说selectedPins=pin0,那GPIO_PIN0=0x1000_0000_0000_0000,其余的GPIO_PIN=0x0000_0000_0000_0000.

但是如果真是这样的话,感觉好浪费寄存器。我的理解是不是不对啊?

使用特权

评论回复
162
fjjjnk1234| | 2015-3-31 18:19 | 只看该作者
本帖最后由 fjjjnk1234 于 2015-3-31 20:39 编辑
uestc_zyd 发表于 2015-3-31 17:40
在2.2小节中的“函数文档”部分很多函数都提到了“selectedPins是所选端口上的管脚。其掩码值可以是GPIO_PI ...

"那GPIO_PIN0=0x1000_0000_0000_0000,其余的GPIO_PIN=0x0000_0000_0000_0000."这句话表述就有错了,0x代表16进制数。不会浪费寄存器,GPIO_PINn(n=0~15)在头文件中被宏定义,比如:0x0001、0x0002、0x0004、0x0008······,操作的时候只要运用逻辑运算将寄存器的某些位置1或清0就行。

使用特权

评论回复
163
uestc_zyd| | 2015-3-31 20:03 | 只看该作者
fjjjnk1234 发表于 2015-3-31 18:19
"那GPIO_PIN0=0x1000_0000_0000_0000,其余的GPIO_PIN=0x0000_0000_0000_0000."这句话表述就有错了,0x代 ...

0x那是我表述错了。
只说了我的理解,想看下我的理解是不是不对,因为按我的理解是相当浪费i寄存器了。只有16种情况,用1个4位的寄存器就可以表示清楚的,为什么用了16个16位的寄存器呢?不过按我所说的理解,只用1个4位的寄存器还需要提供些解码电路设计。

期待正确的理解。

使用特权

评论回复
164
uestc_zyd| | 2015-3-31 20:09 | 只看该作者
uestc_zyd 发表于 2015-3-31 20:03
0x那是我表述错了。
只说了我的理解,想看下我的理解是不是不对,因为按我的理解是相当浪费i寄存器了。只 ...

不过还是用版主最后的话来解释比较好——“根本不用管关心需要操作什么寄存器,毕竟寄存器名字读起来没有自然语言表达更清楚明了。”

也是,通过例程来看,使用这些GPIO驱动库函数时根本不需要去关注操纵什么寄存器那些的。

使用特权

评论回复
165
fjjjnk1234| | 2015-3-31 20:17 | 只看该作者
uestc_zyd 发表于 2015-3-31 20:03
0x那是我表述错了。
只说了我的理解,想看下我的理解是不是不对,因为按我的理解是相当浪费i寄存器了。只 ...

原来你的“浪费寄存器”是这个意思啊,那只是1个16位的寄存器,不是16个。

使用特权

评论回复
166
uestc_zyd| | 2015-3-31 20:28 | 只看该作者
版主的第一个问题“1.为什么关于中断边沿选择的函数GPIO_interruptEdgeSelect()的参数selectedPort可以有18个量可以选择,而不是像其他4个关于中断设置的函数,只有GPIO_PORT_P1、GPIO_PORT_P2、GPIO_PORT_PA 三个量可以选择?”


第一:是因为在12个端口中只有端口P1和P2具备中断功能,其余端口都不具有中断功能,而P1/P2对端口对应PA,所以PA端口也具备中断功能;
第二:处理GPIO中断的有:GPIO_enableInterrupt()、GPIO_disableInterrupt()、GPIO_clearInterruptFlag()、GPIO_getInterruptStatus()、GPIO_interruptEdgeSelect(),前四个(使能中断+禁用中断、清除中断标志+获取中断状态)从其名称上看,明显是只有具备中断功能的端口才能适用的,试想一个没有中断功能的端口怎么去使能其中断,怎么去清除其中断标志位?而第五个是中断沿翻转,每个端口都可以请求中断,这就决定了每个端口都可以选择其请求的中断是什么沿触发。

个人理解,未涉及到寄存器,只从其字面含义去理解,如若有错欢迎指出。

使用特权

评论回复
167
uestc_zyd| | 2015-3-31 20:31 | 只看该作者
fjjjnk1234 发表于 2015-3-31 20:17
原来你的“浪费寄存器”是这个意思啊,那只是1个16位的寄存器,不是16个。 ...

即使是一个16位的,我也不明白那段话,你能详细说一下吗?
“其掩码值可以是GPIO_PIN0、GPIO_PIN1、GPIO_PIN2……GPIO_PIN15等十六个值的逻辑或。”这逻辑或之后怎么去表示是哪个pin被选中了呢?

使用特权

评论回复
168
fjjjnk1234| | 2015-3-31 20:41 | 只看该作者
uestc_zyd 发表于 2015-3-31 20:31
即使是一个16位的,我也不明白那段话,你能详细说一下吗?
“其掩码值可以是GPIO_PIN0、GPIO_PIN1、GPIO_ ...

16位的寄存器,每一位控制一个引脚,GPIO_PIN0就是0000 0000 0000 0001,与寄存器进行逻辑或操作后,寄存器的0bit不就置1选中了吗,以此类推。

使用特权

评论回复
169
gaon2| | 2015-4-1 16:17 | 只看该作者
楼主这搞法,活动结束就可以出书了

使用特权

评论回复
170
pywmiss| | 2015-4-1 16:21 | 只看该作者
CCS...当初安装过....后来进不了了....安装时还费了好大的力气..哎
现在专用IAR

使用特权

评论回复
171
数码小叶| | 2015-4-1 16:54 | 只看该作者
sharknarduo 发表于 2015-3-31 14:10
不同型号的msp430用的库函数不同例如msp430g2553用的就是msp430g2553.h

2553目前还没固件库吧:L

使用特权

评论回复
172
数码小叶| | 2015-4-1 16:59 | 只看该作者
强仔00001 发表于 2015-3-29 14:42
已经出了吧,MSP432,好像有一套

和432不是一个级别的,根本就没有可比性:L

使用特权

评论回复
173
数码小叶| | 2015-4-1 17:00 | 只看该作者
gaoyang9992006 发表于 2015-3-29 15:36
是的,已经出了,还有FR系列,功能很强大的。

本来就不是一个级别的,楼上的居然放在一起比较

使用特权

评论回复
174
数码小叶| | 2015-4-1 17:02 | 只看该作者
fjjjnk1234 发表于 2015-3-31 16:39
采用库函数当然会影响代码的执行效率,但是这得看具体的应用是否需要那么高的代码执行效率。建议库函数和 ...

犹如C和汇编一个道理:lol:lol:lol

使用特权

评论回复
175
月下飞鸿| | 2015-4-1 20:32 | 只看该作者
这个对IO口配置的函数还是很好理解的,但是还是想学习一下430的外围硬件电路,如果对硬件电路顺便讲解一下就更好了。
最后的问题的确也是我想问的,不知道在后边会不会公布答案。新手上路,请多关照

使用特权

评论回复
176
强仔00001| | 2015-4-1 23:06 | 只看该作者
数码小叶 发表于 2015-4-1 16:59
和432不是一个级别的,根本就没有可比性

就是,觉得这是用来打压M0+的

使用特权

评论回复
177
51xlf| | 2015-4-1 23:35 | 只看该作者
高大上的东西

使用特权

评论回复
178
数码小叶| | 2015-4-2 08:38 | 只看该作者
强仔00001 发表于 2015-4-1 23:06
就是,觉得这是用来打压M0+的

还没看价格,M0+那么便宜

使用特权

评论回复
179
gaoyang9992006| | 2015-4-2 09:47 | 只看该作者
294479435 发表于 2015-3-25 20:15
试了下第三个题,感觉比ARM的库函数简单,另外不知道这个的寄存器使用和中断服务函数,所以写的程序不一定 ...

参考例程文件,里面有那个中断函数。

使用特权

评论回复
180
gaoyang9992006| | 2015-4-2 09:48 | 只看该作者
112207301219 发表于 2015-3-25 21:12
刚刚看了一下库函数,在2.0的库里没找到GPIO_interruptEdgeSelect().
后来发现,DriverLib1.97版里面是GPIO ...

以后使用最新版。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则