电赛可能会限制使用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
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
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
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
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; // 设置波特率。
这个我也不是很懂是怎么配置的,配置表格我没在用户手册看到
四处查阅别的大佬才知道这样配置的