MSP430F5529-串口介绍

        开发板一共有两个串口,分别为P4.4,P4.5和P3.3,P3.4

        其中P4的串口是开发板上面用短接套套起来的那个,套上短接套进行相关以后就可以和电脑进行串口通信,也可以拆下短接套和其他外设或芯片进行串口通信。

        不同频率第四步的配置的数据不同,其他配置应该没什么差别。

        对于串口0的配置顺序也是这样的,只要把UCA后面的1改成0就行了。

        注:截取的送药车代码,没测试过。

        配置过程为:

        1.特殊功能相关引脚

        2.串口1功能配置寄存器(UCA1CTL1)中置位 UCSWRST 以进行接下来的配置,不置位不能正常配置串口。

        3.功能配置寄存器选择时钟源。

        4.根据用户手册配置UCA1BR0和UCA1BR1,以及UCA1MCTL寄存器中的相关位。

参考https://www.ti.com.cn/cn/lit/ug/slau208q/slau208q.pdf?ts=1636704386650&ref_url=https%253A%252F%252Fwww.ti.com.cn%252Fproduct%252Fcn%252FMSP430F5529%253FkeyMatch%253DMSP430F5529%2BLAUNCHPAD

第1041页,选择对应的配置信息

        5.选择校验位

        6.选择数据位

        7.选择停止位

        8.复位UCA1CTL1中的UCSWRST位,以完成串口

        9.打开中断,打开中断以后就可以触发接收或者发送中断。接收到数据的时候就会触发接收中断,这个时候可以在接收中断里处理接收到的数据。发送则需要先打开发送中断,然后写入相关数据,随后会触发发送中断把数据发送出去。

        中断收发标志位应该会自动清零,所以无需关注

        串口接收到的数据都放在UCA1RXBUF中

        串口发送的数据都写入UCA1TXBUF中

        在读取或者写入数据后,都会触发相应的中断以便将数据接收/发送出去。

        例程.简易串口收发

#include <msp430.h>

void initClockTo16MHz()
{
    UCSCTL3 |= SELREF_2;                      // Set DCO FLL reference = REFO
    UCSCTL4 |= SELA_2;                        // Set ACLK = REFO
    __bis_SR_register(SCG0);                  // Disable the FLL control loop
    UCSCTL0 = 0x0000;                         // Set lowest possible DCOx, MODx
    UCSCTL1 = DCORSEL_5;                      // Select DCO range 16MHz operation
    UCSCTL2 = FLLD_0 + 487;                   // Set DCO Multiplier for 16MHz
                                              // (N + 1) * FLLRef = Fdco
                                              // (487 + 1) * 32768 = 16MHz
                                              // Set FLL Div = fDCOCLK
    __bic_SR_register(SCG0);                  // Enable the FLL control loop

    // Worst-case settling time for the DCO when the DCO range bits have been
    // changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx
    // UG for optimization.
    // 32 x 32 x 16 MHz / 32,768 Hz = 500000 = MCLK cycles for DCO to settle
    __delay_cycles(500000);//
    // Loop until XT1,XT2 & DCO fault flag is cleared
    do
    {
        UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // Clear XT2,XT1,DCO fault flags
        SFRIFG1 &= ~OFIFG;                          // Clear fault flags
    }while (SFRIFG1&OFIFG);                         // Test oscillator fault flag
}

void UART_Init( char Parity, char DataBits, char StopBits)
{
    P4SEL = BIT4 + BIT5;                        // P4.4,5 = USCI_A0 TXD/RXD
    UCA1CTL1 |= UCSWRST;                      // **Put state machine in reset**
    UCA1CTL1 |= UCSSEL_2;                     // SMCLK 25mhz
    UCA1BR0 = 8;                              // 16MHz 115200 (see User's Guide)
    UCA1BR1 = 0;                              // 16MHz 115200
    UCA1MCTL = UCBRS_0 + UCBRF_11 + UCOS16;   // Modln UCBRSx=0, UCBRFx=0,

    //------------------------------设置校验位------------------------------
    switch (Parity)
    {
    case 'n':
    case 'N':
        UCA1CTL0 &= ~UCPEN;
        break;          //无校验
    case 'p':
    case 'P':
        UCA1CTL0 |= UCPEN + UCPAR;
        break;    //偶校验
    case 'o':
    case 'O':
        UCA1CTL0 |= UCPEN;
        break;          //奇校验
        //default:  return (0);                                 //参数错误
    }
    //------------------------------设置数据位------------------------------
    switch (DataBits)
    {
    case 7:
    case '7':
        UCA1CTL0 |= UC7BIT;
        break;         //7位数据位
    case 8:
    case '8':
        UCA1CTL0 &= ~UC7BIT;
        break;         //8位数据位
        //default:  return (0);                                 //参数错误
    }
    //------------------------------设置停止位------------------------------
    switch (StopBits)
    {
    case 1:
    case '1':
        UCA1CTL0 &= ~UCSPB;
        break;          //1位停止位
    case 2:
    case '2':
        UCA1CTL0 |= UCSPB;
        break;          //2位停止位
        //default:  return (0);                                 //参数错误
    }

    // over sampling
    UCA1CTL1 &= ~UCSWRST;                   // **Initialize USCI state machine**
    UCA1IE |= UCRXIE; //接收中断

}

int main(void) {

    WDTCTL = WDTPW | WDTHOLD;                 // Stop watchdog timer
    initClockTo16MHz();                        //配置系统时钟为16Mhz,不配置串口不能正确收发
    UART_Init('n',8,1);
    _EINT();//开启总中断

    while(1){

    }

}


#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{
    switch (__even_in_range(UCA1IV, 4))
    {
    case 0:
        break;                 // Vector 0 - no interrupt
    case 2:                       // Vector 2 - RXIFG
        if (UCA1RXBUF == 'a'){
            UCA1IE |= UCTXIE; //开启发送中断
            UCA1TXBUF='a';    //如果收到一个a,就发回去一个a
        }
        break;
    case 4:                       // Vector 4 - TXIFG

        break;
    default:
        break;
    }
}

  • 7
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值