MSP430F5529串口通信-寄存器

7/5/2022 单片机C/C++

电赛可能会限制使用TI公司的芯片
因此为了不让自己丢掉以前的知识
最好做个笔记,免得忘了就难受。

# MSP430F5529串口通信-寄存器

# 开发环境

CCS v10.4.0 (Code Composer Studio 10.4.0)
软件是免费的,随便百度一下就有了

# 硬件

MSP-EXP430F5529LP 即 MSP430F5529 特点
以上! 手册pdf (opens new window)
板子是这个
原理图如下

板载仿真器

# 串口通信

先看原理图

UCA0与UCA1就是串口了
由于板载仿真器与MSP430相连串口1即UCA1
那就拿串口一实验吧

# 初始化

从原理图可知UCA1通信IO口为P4.4 TX / P4.5 RX
所以我们选择P44与P45
深层的原理就不讲了,毕竟配置的寄存器
寄存器一些参数网上也都有看着代码来理解吧

void UCA1_Init(void)
{
    P4SEL |= BIT4+BIT5;                 // 选择引脚 P4.4TX & P4.5RX
    UCA1CTL1 |= UCSWRST;                // 软件复位-置1: 0禁止(USCI复位释放)/ 1使能(复位状态保持)
    UCA1CTL1 |= UCSSEL_2;               // 时钟选择-SMCLK:: 0UCLK | 1ACLK | 2MCLK  SMCLK默认1MHz
    UCA1BR0 = 0x06;                     // 波特率寄存器0 (存整数的低八位)   计算: (1M/9600)/16 = 6.51 => 6
    UCA1BR1 = 0x00;                     // 波特率寄存器1 (存整数的高八位)
    UCA1MCTL |= UCBRS_0 + UCBRF_13;     // 设置波特率。如果 SMCLK 速度或波特率分别配置为 8 MHz 和 28.8 kbps 以外的任何值,则必须进行调整。有关说明,请参阅 bcUart.h
    UCA1MCTL |= UCOS16;                 // 0|1 \ 低频|高频模式
    UCA1CTL1 &= ~UCSWRST;               // 软件复位-清0: 0禁止(USCI复位释放)/ 1使能(复位状态保持)
    UCA1IE |= UCRXIE;                   // UCA1使能: RX使能|   UCTXIE: TX使能  UCSTTIE: 启动条件中断使能  UCSTPIE: 停止条件中断使能
    _EINT();                            // 使能总中断 => 等价_enable_interrupt()
}
1
2
3
4
5
6
7
8
9
10
11
12
13

串口初始化跟51单片机差不多,可以按照51寄存器配置串口思路来配置MSP430的串口

# 中断处理

串口必然有中断,MSP430的中断跟51有点差别,但思路都是一样的

unsigned short RxDataBuf[100];
unsigned short RxDataLen = 0;
unsigned short RxDataFlag = 0;
unsigned short RxChar;
#pragma vector = USCI_A1_VECTOR
__interrupt void USCI_ISR()
{
    switch(_even_in_range(UCA1IV,4))              // 在[0,4]区间内对UCA1IV进行遍历,提高switch的效率
    {
        case 0:break;                             // Vector 0 - No interrupt
        case 2:                                   // Vector 2 - RXIFG
        {
            while (!(UCA0IFG&UCTXIFG));           // 等待TX标志位
            UCA1TXBUF = UCA1RXBUF;                // 发送接收到的数据

            UCA1IFG &= ~UCRXIFG;                  // 清除中断标志
            RxChar = UCA1RXBUF;                   // 缓存接收的数据(接收一次完整的数据)防止接收的数据不完整
            RxDataBuf[RxDataLen] = RxChar;
            RxDataLen++;
            if(RxChar == '\n')
            {
                RxDataFlag = 1;
            }
            break;
        }
        case 4: break;
        default: break;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

# 发送一个字节数据与发送字符串

初始化完成后,我们就能使用了

/*发送一个字节数据*/
void sendChar(char c)
{
    UCA1TXBUF = c;
    while(!( UCA1IFG & UCTXIFG ));      //等待发送标志位
}
/*发送一个字符串*/
void sendStr(unsigned char *pstr)
{
    while(*pstr != '\0')
    {
        while(!(UCA1IFG & UCTXIFG));    //等待发送标志位
        UCA1TXBUF = *pstr++;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 整合后的代码

最后附上全代码,主要看懂原理,而非完全copy。

#include <msp430.h>

void sendChar(char c);
void sendStr(unsigned char *sptr);
void UCA1_Init(void);

unsigned short RxDataBuf[100];
unsigned short RxDataLen = 0;
unsigned short RxDataFlag = 0;
unsigned short RxChar;

void main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	        // 关闭看门狗
	UCA1_Init();
	while(1)
	{
	    //sendStr("Hello!\r\n");
	}
}

void UCA1_Init(void)
{
    P4SEL |= BIT4+BIT5;                 // 选择引脚 P4.4TX & P4.5RX
    UCA1CTL1 |= UCSWRST;                // 软件复位-置1: 0禁止(USCI复位释放)/ 1使能(复位状态保持)
    UCA1CTL1 |= UCSSEL_2;               // 时钟选择-SMCLK:: 0UCLK | 1ACLK | 2MCLK  SMCLK默认1MHz
    UCA1BR0 = 0x06;                     // 波特率寄存器0 (存整数的低八位)   计算: (1M/9600)/16 = 6.51 => 6
    UCA1BR1 = 0x00;                     // 波特率寄存器1 (存整数的高八位)
    UCA1MCTL |= UCBRS_0 + UCBRF_13;     // 设置波特率。如果 SMCLK 速度或波特率分别配置为 8 MHz 和 28.8 kbps 以外的任何值,则必须进行调整。有关说明,请参阅 bcUart.h
    UCA1MCTL |= UCOS16;                 // 0|1 \ 低频|高频模式
    UCA1CTL1 &= ~UCSWRST;               // 软件复位-清0: 0禁止(USCI复位释放)/ 1使能(复位状态保持)
    UCA1IE |= UCRXIE;                   // UCA1使能: RX使能|   UCTXIE: TX使能  UCSTTIE: 启动条件中断使能  UCSTPIE: 停止条件中断使能
    _EINT();                            // 使能总中断 => 等价_enable_interrupt()
}

void sendChar(char c)
{
    UCA1TXBUF = c;
    while(!( UCA1IFG & UCTXIFG ));
}

void sendStr(unsigned char *pstr)
{
    while(*pstr != '\0')
    {
        while(!(UCA1IFG & UCTXIFG));
        UCA1TXBUF = *pstr++;
    }
}

// 串口中断服务函数
#pragma vector = USCI_A1_VECTOR
__interrupt void USCI_ISR()
{
    switch(_even_in_range(UCA1IV,4))              // 在[0,4]区间内对UCA1IV进行遍历,提高switch的效率
    {
        case 0:break;                             // Vector 0 - No interrupt
        case 2:                                   // Vector 2 - RXIFG
        {
            while (!(UCA0IFG&UCTXIFG));           // 等待TX标志位
            UCA1TXBUF = UCA1RXBUF;                // 发送接收到的数据

            UCA1IFG &= ~UCRXIFG;                  // 清除中断标志
            RxChar = UCA1RXBUF;                   // 缓存接收的数据(接收一次完整的数据)防止接收的数据不完整
            RxDataBuf[RxDataLen] = RxChar;
            RxDataLen++;
            if(RxChar == '\n')
            {
                RxDataFlag = 1;
            }
            break;
        }
        case 4: break;
        default: break;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76

# 运行效果图

串口持续输出Hello!

串口助手发送Hello World,返回Hello World

# 补充

TI公司那个MSP-EXP430F5529LP板(也就是此教程的板子)串口0不与仿真器直连
如果需要测试串口0可以使用USB转TTL(CH340芯片)模块将TX与板子RX,RX与板子TX相连
再去测试串口。

# 疑问

UCA1MCTL |= UCBRS_0 + UCBRF_13; // 设置波特率。
这个我也不是很懂是怎么配置的,配置表格我没在用户手册看到
四处查阅别的大佬才知道这样配置的

最近更新: 11/24/2024, 10:03:25 AM