历史上的今天
今天是:2025年03月31日(星期一)
2020年03月31日 | MSP430使用指南12 -> GPIO
2020-03-31 来源:eefocus
GPIO即通用输入输出接口,是MCU最基本的功能,可以控制I/O口的高低电平,输入输出或映射到其他模块等功能。
如下图所示,为MSP430FR2355芯片的引脚图:

在图中,每个引脚后标注的则是每个引脚具备的复用功能,GPIO是基本功能,除去电源,地,时钟等引脚,每个引脚都可作为通用IO口使用,那么如何按照自己的要求配置每个引脚的功能呢?
下面就描述下GPIO引脚相关的寄存器(MSP430FR2xx/FR4xx):
注:并非每个MSP430 MCU都包含下属所有的寄存器,根据MCU功能的复杂性决定,具体包含的寄存器名称和数量,请查看每个芯片的datasheet和user’s guide。
首先先整体看一下GPIO口总共有哪些寄存器:

因为P1,P2,P3等寄存器名字都相似,因此,下面讲述时采用Px表示。
PxIN

输入寄存器(只读),代表的是当前GPIO接口的状态,0时代表低电平,1时代表高电平。
因此,在将IO口设置成输入状态时,通过这个寄存器去了解IO口的电平状态。
PxOUT

输出寄存器(读写),有两个功能:
1.在IO口为输出状态时,决定IO口输出的状态,0时输出低电平,1时输出高电平,且可以读取此寄存器来了解当前设置的IO输出电平状态。
2.在IO口为输入状态时,决定IO口的上拉或下拉状态,不过必须上/下拉使能寄存器使能时,才能实现上拉或下拉的效果。
PxDIR

方向寄存器(读写),1时表示output,0时表示input,默认是0。
PxREN

上/下拉电阻使能寄存器,当IO口作为输入使用时,可以使能内部的上/下拉电阻,此寄存器为使能,决定上拉还是下拉的寄存器是PxOUT。
PxSEL0

功能选择寄存器0,选择复用功能,和PxSEL1配合,最多可以选择三个复用功能,一般来说在因脚伤复用功能按照顺序描述,比如:P2.0/TB1.1/COMP0.O,表示TB1.1是第一复用功能,COMP0.O是第二复用功能,因此:P2SEL0 0bit = 1,P2SEL1 0bit = 0时选择TB1.1功能;P2SEL0 0bit = 0,P2SEL1 0bit = 1时选择COMP0.O功能。每个引脚具体的功能,请查看datasheet。
PxSEL1

功能选择寄存器1,选择复用功能,和PxSEL0配合使用,并非所有MCU都有此寄存器,一些简单的,每个引脚最多只有一个服用功能的MCU不会有这个寄存器,具体情况请查看每个MCU的datasheet。
PxSLEC

编码选择寄存器,简单来说,这个寄存器是和PxSEL0,PxSEL1配合使用的,因为在设置功能过程中,需要设定这两个寄存器,因此会有个先后顺序,可能在设置了PxSEL0后产生了中断,在执行中断函数时,并没有设置PxSEL1寄存器,因此这段时间可能会出现用户不想看到的问题,PxSELC这个寄存器就是解决同步问题的,当PxSELC这个寄存器对应的位置1时,那么会同时把PxSEL0和PxSEL1寄存器的值写入,避免出现上述问题。
PxIES

中断边沿选择寄存器,当使能IO口中断时,此寄存器决定着中断触发的方式,0表示上升沿触发,1表示下降沿触发。
PxIE

中断使能寄存器,置1时使能相应引脚的中断。
PxIFG

中断标志寄存器,在产证满足PxIES所描述的状态时,会置位这个标志位,即使不使能中断PxIE寄存器,也会置位这个PxIFG标志寄存器,PxIE指示决定会不会产生中断而已。
同时需要注意PxIFG在一些情况下可能会置位,比如:

PxIV

中断向量寄存器(只读),MSP430 MCU的GPIO中断对于Px口是一个向量,因此在进入后需要判断时Px口中的哪一个产生的,比如Px.0, 故需要查询这个寄存器,从上图描述中也可以看到,Px.0-Px.7的中断优先级是不一致的,0位最高,7位最低。
最最需要注意的一点:对于FR系列MCU,在设置完GPIO口功能后,一定要清除PM5CTL0寄存器中的LOCKLPM5位,这一位默认是1,即设置所有IO口位高阻态,不清除的话,GPIO功能无法使用,Flash系列的默认是0,因此不需要清除。
清除程序:
PM5CTL0 &= ~LOCKLPM5;
在讲解完GPIO相关的寄存器后,我们给一个例程,功能是通过一个输入口中断方式去驱动一个输出口改变电平状态:
#include int main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer // Configure GPIO P1OUT &= ~BIT0; // Clear P1.0 output latch for a defined // power-on state P1DIR |= BIT0; // Set P1.0 to output direction P1OUT |= BIT3; // Configure P1.3 as pulled-up P1REN |= BIT3; // P1.3 pull-up register enable P1IES |= BIT3; // P1.3 Hi/Low edge P1IE |= BIT3; // P1.3 interrupt enabled // Disable the GPIO power-on default high-impedance mode // to activate previously configured port settings PM5CTL0 &= ~LOCKLPM5; P1IFG &= ~BIT3; // P1.3 IFG cleared while(1) { __bis_SR_register(LPM3_bits | GIE); // Enter LPM3 w/interrupt __no_operation(); // For debug P1OUT ^= BIT0; // P1.0 = toggle } } // Port 1 interrupt service routine #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) #pragma vector=PORT1_VECTOR __interrupt void Port_1(void) #elif defined(__GNUC__) void __attribute__ ((interrupt(PORT1_VECTOR))) Port_1 (void) #else #error Compiler not supported! #endif { P1IFG &= ~BIT3; // Clear P1.3 IFG __bic_SR_register_on_exit(LPM3_bits); // Exit LPM3 }
史海拾趣
|
现在个人能够想到的就是这些啦,可能还是受到了很多的限制,自己了解的有限,以后也主要是弄这一块的,这个板块你希望还看到什么话题,希望找到什么的,我们会尽量满足,大家提提,还有这么多的版主一定能够解决你的疑问的!… 查看全部问答> |
|
看到DIY示波器的礼品是Shuffle,眼馋了好一阵子呢,看到了一篇文章,给大伙看看,实际上,别看外观那么好话,拆解完也没啥(吃不着葡萄说下葡萄酸),嘿嘿 第1页:跟U盘一样大 新iPod shuffle曝光 苹果昨天发布了第三代iPod shuffle超迷你音乐播 ...… 查看全部问答> |
|
自己编了个wince 6.0的模拟器,下载了一个flash播放器,在开发板的真实硬件环境可以跑起来并且运行flash,但是在模拟器上只能运行flash播放器,无法运行flash文件,请问是不是需要什么库或者组件的支持?谢谢!!… 查看全部问答> |
|
非常期待能够申请到板子。我是深圳清华研究院电子信息研究所的,最近所里有物联网的项目研究,这要是智能家居部分,看看能不能用这块板子作为开发平台 [ 本帖最后由 fqzxw 于 2010-10-18 09:56 编辑 ]… 查看全部问答> |
|
:)小弟初次用STM32做的板子,请高人看看如何才能做到8位机的 小弟年前匆匆忙忙帮朋友做的小东西, 当时还没完工时的照片. 请大家看看是否做到了类似配置的8位机的成本: 6 开关量输入 6 继电器接点出 6&n ...… 查看全部问答> |




