MSP430的IO口操作讲解及例程(寄存器)

        之前一直看到别人在写博客,自己也想要写一些,目前呢学习的其实主要就是单片机,51、32单片机都有学过,但是因为学得不怎么样,写出来的东西也可想而知。趁着假期慢慢地学MSP430,就是TI的那块板子。我一开始是跟着电赛培训网听的,教的是通过寄存器操作,后面再找资源的时候才发现有库函数,但是已经做了那么多笔记可不能浪费了,就索性寄存器一条路走到黑好了。


        进入正题吧,肯定是从IO口的操作说起了。

        想要通过寄存器来操控MSP430的话,只能8位一起读写,例如P1的P1.0~P1.7 这8个引脚就要整体地去赋值P1xxx(各种寄存器),是不能够对单独某位例如P1.0进行写数据的。像51单片机之所以可以进行位操作是因为它有特殊的关键字,这里就不详细展开,对计算机组成原理有兴趣的话可以了解一下看看。

        MSP430的IO口(还是以P1口为例)大概可以通过这些寄存器来进行配置,其中P1IN , P1OUT , P1DIR , P1REN , P1SEL 都算是很常用的,P1IES , P1IE , P1IFG 也偶尔会涉及到,接下来对它们逐一进行介绍。关于 P1IV 和 P1DS 我目前没有碰到过,就暂不讨论。

ccs里面在debug状态下可以直接查到对应寄存器的值标题

P1IN输入寄存器

        读取电平高低,0低1高。

P1DIR输出方向寄存器

        配置输入输出方向,0输入1输出。

P1REN用于控制上下拉电阻的寄存器

        配置是否启用上/下拉电阻,0禁用1启用

P1OUT输出寄存器

        这个需要分情况,当P1DIR设置为输出的时候就是简单的0输出低电平1高电平;但是当P1DIR配置为输入且启用上下拉电阻时,0下拉1上拉

P1SEL功能复用寄存器

        可以选择是否启用这个IO口的其他功能,比如说P1.2它就可以进行复用作为输入捕获(含定时器)。0禁用1启用

P1IES端口触发寄存器

        置0上升沿触发1下降沿

P1IE端口中断使能寄存器

        P1IES配置端口触发以后可以设置是否使能中断,不设置的话只更改P1IES没用。置1使能。

P1IFG端口中断状态寄存器

        用于标定是否发生过电平跳变,如果发生过且P1IE置1就可以跳到中断函数去,要注意P1IFG不会在中断函数结束后置1。


        在了解了每个寄存器的功能以后,接下来就是配置操作了。为了避免麻烦,比如说P1OUT第一位第三位第八位置1,其他置0,需要手算这种尴尬情况,TI有定义相关的“字位”(我也不知道这个应该如何称呼,如有不当请指正)。

如需要配置P1OUT的第一三五位就可以这么写:

P1OUT = BIT1 + BIT3 + BIT5 ;

如果P1OUT其他位已经有配置,不想影响到,则可以这样:

P1OUT |= BIT1 + BIT3 + BIT5 ;

想要取0的操作也很类似,就是

P1OUT &= ~( BIT0 + BIT1 ) ;    //就是将P1.0和P1.1两个位置0

有关的宏定义如图

利用宏定义减少麻烦

        有关IO口配置的知识就这么多,接下来就可以实操了。学单片机不点灯就好像学编程不来一行hello world,接下来我们尝试一下点灯。以我的板子MSP430F5529LP为例,如果跳线帽在的话是不需要任何接线的,直接操作就可以。

点亮红灯P1.0

#include <msp430.h> 
//现象为红灯常亮
int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// 停用看门狗

	P1DIR = BIT0;    //配置P1.0为输出
	P1OUT = BIT0;    //配置P1.0引脚电平为高电平

	return 0;
}

红灯P1.0闪烁

#include <msp430.h> 
//现象为每隔0.5s,红色LED闪烁
int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	//停用看门狗
	P1DIR = BIT0;
	while(1)
	{
	    P1OUT = BIT0;            //点亮
	    __delay_cycles(500000);  //延迟500000/1000 = 500ms
	    P1OUT &= ~BIT0;          //熄灭
	    __delay_cycles(500000);  //延迟
	}
	return 0;
}

两个灯(红灯P1.0绿灯P4.7)交替闪烁

#include <msp430.h> 
//现象为每隔0.5s两LED交替亮灭
int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// 停用看门狗
	P1DIR = BIT0 ;
	P4DIR = BIT7 ;
	while(1)
	{
	    P1OUT |= BIT0;
	    P4OUT &= ~BIT7;
	    __delay_cycles(500000);
	    P4OUT |= BIT7;
	    P1OUT &=~BIT0;
	    __delay_cycles(500000);
	}

	return 0;
}

        本篇的目的是大概把所有可能用到的寄存器都介绍一下,点灯只用到了 PxDIR 和 PxOUT ,接下来继续介绍其他端口寄存器,也是以实例的方式进行操作。


通过按键P1.1控制红灯P1.0亮灭,同样无需接线

        这里要注意,按键作为输入时一定要接上拉电阻,否则没有合适的参考电平,即便按键按下LED也不会有反应。

#include <msp430.h> 
//现象为当按键按下时红色LED灭,松开时长亮
//也可以自己动手改成按下时亮灭状况反转
int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	P1DIR = BIT0;
	P1REN = BIT1;               //启用上下拉电阻
	P1OUT = BIT0 + BIT1 ;       //P1.0设置输出 P1.1设置上拉电阻
	while(1)
	{
	    if(P1IN & BIT1) P1OUT = BIT0;
	    else P1OUT = ~BIT0;
	}

	return 0;
}

通过“输入捕获”引起外部中断

        这个实际上就是外部中断,没有用按键的原因就是为了避免我以前我一个错误认知:由于我之前学习51和32都是以按键为例讲述外部中断,导致我一度以为只有按键可以触发。本程序找一根杜邦线连接到P1.4上面,然后与GND连接再断开形成电平变化,可以观察到P1,0红灯闪烁。

#include <msp430.h>

int main(void)
{
    WDTCTL = WDTPW + WDTHOLD;            //停用看门狗
    P1DIR |= BIT0;                       //P1.0输出

    P1REN |= BIT4;                       // P1.4启用上下拉电阻
    P1OUT |= BIT4;                       // P1.4用上拉电阻
    P1IES |= BIT4;                       // 当P1.4有下降沿电平时触发
    P1IFG &= ~BIT4;                      // 清除P1.4位置上的中断标志位(是默认为1的)
    P1IE  |= BIT4;                       // 使能P1.4串口中断(其实就是外部中断) 
  
    while(1)
    {
        __no_operation();                //这个设置断点调试,可以方便你看寄存器的值
    }
}

#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
{
    if(P1OUT | BIT0 == P1OUT)
        P1OUT &= ~BIT0;
    else
        P1OUT |= BIT0;
                         
    P1IFG &= ~BIT4;                     // 要手动清除这个中断标志位,它是不会自动清零的
}

        这个中断服务函数前面那一段看着很长,也很抽象。实际上它们是可以简化的,但是为了避免一些编译的问题,最好加上。

#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
    if(P1OUT | BIT0 == P1OUT)
        P1OUT &= ~BIT0;
    else
        P1OUT |= BIT0;
                         
    P1IFG &= ~BIT4;                     // 要手动清除这个中断标志位,它是不会自动清零的
}

        有关中断的问题后面肯定会写的,这里使用中断只是为了介绍那几个寄存器。目前对于中断服务函数不必深究。


        有关MSP430的IO口寄存器,该写出来的应该都写差不多了,还有SEL这个用于复用功能的,这个涉及到了模数转换、定时器输入捕获、通信这些东西,放在后面一起说。

  • 9
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 串通信是一种常用的数据通信方式,常用于单片机与外部设备之间的数据传输。MSP430FR69是一款MSP430系列的微控制器,它具有丰富的外设和通信接,其中包括了串通信功能。下面我将用300字介绍一下MSP430FR69串通信寄存器例程MSP430FR69的串通信功能基于UART(Universal Asynchronous Receiver/Transmitter)模块实现。通过配置相关的寄存器,可以实现串通信的初始化、发送和接收操作。 首先,我们需要配置UART模块的相关寄存器,例如UCA0CTL1、UCA0BR0和UCA0BR1。UCA0CTL1用于设置UART的工作模式、波特率和数据位长度等,UCA0BR0和UCA0BR1用于设置波特率的分频值。 接下来,我们可以通过写入UCA0TXBUF寄存器来发送数据。将待发送的数据写入UCA0TXBUF寄存器,UART模块会自动将数据发送出去。可以通过检查UCA0TXIFG标志位来确认数据是否发送完成。 对于接收数据,我们可以通过检查UCA0RXIFG标志位来判断是否有数据接收到。当标志位被置位时,表示接收缓冲区UCA0RXBUF中有数据可供读取。我们可以读取UCA0RXBUF寄存器来获取接收到的数据。 需要注意的是,为了确保数据的稳定传输,我们需要在发送和接收之前进行相关配置,并使用适当的延时函数或中断来处理数据的发送和接收过程。此外,还应该根据实际需求设置正确的波特率和数据格式,以确保通信的准确性和可靠性。 综上所述,MSP430FR69串通信寄存器例程主要涉及到UART模块的配置和操作寄存器的读写,通过这些寄存器的设置,我们可以实现串通信的初始化、发送和接收操作。通过合理配置相关寄存器,并结合适当的延时函数或中断处理,可以实现稳定可靠的串通信。 ### 回答2: MSP430FR69是德州仪器公司生产的一款微控制器芯片,它集成了多个功能模块,其中包括可以进行串通信的模块。串通信是一种常用的通信方式,它允许设备之间通过串行线路进行数据传输。 实现MSP430FR69的串通信需要使用它的寄存器例程。通过配置相应的寄存器,可以使芯片实现串通信的功能。具体的寄存器例程如下: 首先,需要配置UART模块的控制寄存器UCAxCTLW0。通过设置该寄存器的不同位,可以选择波特率、数据位、停止位等串通信的参数。 然后,需要配置UART模块的波特率发生器寄存器UCAxBRW。通过设置该寄存器的值,可以确定串通信的波特率。 接下来,需要在代码中实现串发送和接收数据的函数。通过设置相应的发送寄存器UCAxTXBUF和接收寄存器UCAxRXBUF,可以分别发送和接收数据。 最后,可以在代码中编写相应的中断处理函数,用于处理串通信的中断事件。 通过以上寄存器例程的配置,就可以实现MSP430FR69的串通信功能了。开发人员可以根据具体的需求进行相应的寄存器配置,实现不同的串通信方式,如UART、SPI、I2C等。 需要注意的是,使用寄存器例程进行串通信需要对寄存器操作非常熟悉,且容易出错。因此,开发人员应该仔细阅读MSP430FR69的技术文档,并通过示例代码对寄存器例程进行正确的配置和应用。这样才能确保串通信的稳定和可靠性。 ### 回答3: msp430fr69是一款低功耗的微控制器,它支持串通信功能,可以通过寄存器来进行配置和控制。下面是一段示例代码,用于实现msp430fr69串通信的寄存器设置和例程。 首先,我们需要设置串的波特率。波特率定义了串数据传输的速度,可以通过波特率发生器设置。例如,我们可以通过以下代码将波特率设置为9600: ```c UCA0BR0 = 6; // 设置波特率为9600 UCA0BR1 = 0; UCA0MCTLW |= UCOS16; ``` 接下来,我们需要配置串的控制寄存器UCxxCTL0和UCxxCTL1。UCxxCTL0用于设置传输模式和数据位数等参数,UCxxCTL1用于设置通信模式和时钟源等参数。例如,以下代码设置了传输模式为UART模式,数据位数为8位: ```c UCA0CTLW0 |= UCSWRST; // 复位UART模块 UCA0CTLW0 = UCSSEL__SMCLK | UCSWRST; // 设置时钟源为SMCLK,并再次复位UART模块 UCA0CTLW0 &= ~UCSYNC; // 非同步模式 UCA0CTLW0 |= UCMSB | UC7BIT | UCMODE_0 | UCPAR; // 设置数据位数为8位,无校验位 UCA0CTL1 |= UCSSEL_2; // 设置时钟源为SMCLK UCA0CTL1 &= ~UCSWRST; // 释放UART模块的复位状态 ``` 然后,我们可以通过中断或轮询方式来发送和接收数据。例如,以下代码使用轮询方式发送一个字节的数据到串: ```c while(!(UCA0IFG & UCTXIFG)); // 等待串发送缓冲区空 UCA0TXBUF = data; // 将数据写入发送缓冲区 ``` 类似地,我们可以使用轮询方式从串接收数据。例如,以下代码读取一个字节的数据: ```c while(!(UCA0IFG & UCRXIFG)); // 等待串接收缓冲区非空 data = UCA0RXBUF; // 从接收缓冲区读取数据 ``` 以上就是一些关于msp430fr69串通信寄存器例程的示例代码。通过合理配置和操作这些寄存器,我们可以实现串通信,并实现数据的发送和接收。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值