概述
理论上来说,在不进行端口功能复用的情况下,每一个端口都能用作普通GPIO口用。其中P1和P2端口可以用作外部中断端口。其余的端口作用可以参考开发板自带的端口功能图。
这里介绍外部中断和普通作用GPIO口寄存器和配置。
430f5529使用的是宏定义的引脚名称。
这里用P1口做例子:
1.P1IN 可以读取当前P1端口某引脚上的信号值,用于读取电平信号,比如检测按键输入,通过读取P1IN 的值判断按键是否按下,如果按下了检测到的都是低电平,返回的就是0,反之1。
用法: if (P1IN & BIT0),此为读取P1.0引脚上电平信号
2.P1OUT 可以决定引脚的输出,比如在点亮Led灯的时候就需要让输出高电平
用法:P1OUT |= BIT0 ,此为P1.0输出高电平,可以驱动开发板上的LED等或者外加的发光二极管。
3.P1DIR 决定某引脚的方向,比如在输出模式时,方向置1;输入模式,方向置0。注意,在做GPIO使用的时候,方向是一定要定义的。
用法:P1DIR |= BIT0 ,输出模式; P1DIR &=~BIT0,输入模式。
4.P1REN 用于设置引脚电阻,上拉电阻置一,下拉电阻置0。在用作输入的时候要设置上拉电阻,不然貌似会出一些问题。
用法:P1REN |=BIT0,P1.0设置上拉电阻。
5.P1DS 设置驱动力?没用过
6.P1SEL 额外功能选择,开发板左半边的引脚一般都有特殊功能,要启用特殊功能,这个寄存器需要置一。写法和上面差不多,具体哪些引脚有功能参考自带的功能图。
7.P1IES 选择外部中断触发的方向,置一为下降沿触发,置零为上升沿触发。
8.P1IE 中断使能寄存器,置一为开启某引脚外部中断,默认为零,不开启。
9.P1IFG 中断标志位寄存器,当中断被触发以后,会自动置一,可以通过读取对应引脚上的标志位确定是否触发了中断。这个寄存器在置一以后不会自动清零,需要手动清零,即软件写零。在置一的情况下即使触发了中断也进不去中断函数。
例程1.点灯
#include <msp430.h>
void main(void){
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
P1DIR |= BIT0;
while(1){
P1OUT ^= BIT0;
}
}
例程2.外部中断
#include<msp430.h>
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
P1DIR |= BIT0; //将LED1对应的IO口P1.0设置为输出
P1OUT &= ~BIT0; //初始化该灯设置为灭
P1DIR &=~BIT1 ; //将按键1对应的IO口P1.1设置为输入
P1IFG = 0x00; //初始化清空中断标志位(清空所有位)
P1IE |= BIT1; //P1.1中断使能
P1IES |= BIT1; //下降沿产生中断
P1IN |= BIT1; //输入拉高?加着也没啥问题
P1REN |= BIT1;//上拉电阻
P1OUT |= BIT1;//输出拉高
// __enable_interrupt();//开启总中断,很重要!
_EINT(); //开启总中断的简化写法
while(1){
}
}
#pragma vector = PORT1_VECTOR //固定格式,声明中断向量地址,不能变
__interrupt void LED(void) //函数名,可以任意定义
{
switch(__even_in_range(P1IV,18))
{
case 0: break; /* No Interrupt pending */
case 2: break; /* P1IV P1IFG.0 */
case 4: /* P1IV P1IFG.1 */
P1OUT ^= BIT0;
P1IFG &=~BIT1;//手动清空标志位
break;
case 6: break; /* P1IV P1IFG.2 */
case 8: break; /* P1IV P1IFG.3 */
case 10: break; /* P1IV P1IFG.4 */
case 12: break; /* P1IV P1IFG.5 */
case 14: break; /* P1IV P1IFG.6 */
case 16: break; /* P1IV P1IFG.7 */
default: break;
}
}
最后
以上就是妩媚饼干为你收集整理的MSP430f5529-GPIO简介的全部内容,希望文章能够帮你解决MSP430f5529-GPIO简介所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复