【MSP430F149学习】16 异步串行通信
准备工具:电脑;TS8900--MSP430F149开发板;USB转TTL模块;USB线两根
开发环境:IAR EW for MSP430 V5.30
异步串行通信模块概述
串口是系统与外界联系的重要手段,在嵌入式系统开发和应用中,经常需要上位机实现
系统调试及现场数据的采集和控制。一般是通过上位机本身配置的串行口,通过串行通信技
术,和嵌入式系统进行连接通信。
异步串行通信模块原理图
USART 模块结构上图所示。该模块包含 4 个部分:
n 波特率部分:控制串行通信数据接收和发送的速度。
n 接收部分:接收串行输入的数据。
n 发送部分:发送串行输出的数据。
n 接口部分:完成并/串、串/并转换
串口控制寄存器
PENA:校验允许位
0 校验禁止;
1 校验允许。
校验允许时,发送端发送校验,接收端接收该校验。地址位多机模式中,地址位包含校验操作。
PEV:奇偶位校验位,该位在校验允许时有效
0 奇校验;
1 偶校验。
SPB:停止位选择。决定发送的停止位数,但接收时接收器只检测 1 位停止位。
01 位停止位
12 位停止位。
CHAR:字符长度
07 位
18 位。
LISTEN:反馈选择。选择是否讲发送数据由内部反馈给接收器
0 无反馈
1 有反馈,发送信号由内部反馈给接收器。
SYNC:USART 模块的模式选择
0 UART 模式(异步)
1 SPI 模式(同步) 。
MM:多机模式选择位
0 线路空闲多机协议;
1 地址多机协议。
SWRST:控制位
该位的状态影响着其他一些控制位和状态位的状态。在串行口的使用过程中,这一位是比
较重要的控制位。一次正确的 USART 模块初始化应该是这样的顺序:先在 SWRST=1 情况
下设置串行口;然后设置SWRST=0;最后如果需要中断,则设置相应的中断使能。
串口发送控制寄存器
CKPL:时钟极性控制位
0 UCLKI 信号与 UCLK 信号极性相同;
1 UCLKI 信号与 UCLK 信号极性相反;
SSELx:时钟源选择位
这两位确定波特率发生器的时钟源
0 外部时钟 UCLKI。
1 辅助时钟 ACLK。
2 子系统时钟 SMCLK。
3 子系统时钟 SMCLK。
URXSE:接收触发沿控制位
0 没有接收触发沿检测;
1 有接收触发沿检测。
TXWAKE:传输唤醒控制
0 下一个要传输的字符为数据
1 下一个要传输的字符为地址。
TXEPT:发送器空标志
在异步模式与同步模式时不一样
0 正在传输数据或者发送缓冲器(UTXBUF)有数据;
1 表示发送移位寄存器和 UTXBUF 空或者 SWRST=1。
串口接收控制寄存器
FE:帧错误标志
0 没有帧错误;
1 帧错误
PE:校验错误标志位
0 校验正确;
1 校验错误。
OE:溢出标志位
0 无溢出
1 有溢出。
BRK:打断检测位
0 没有被打断;
1 被打断。
URXEIE:接收出错中断允许位
0 不允许中断,不接收出错字符并且不改变 URXIFG 标志位;
1 允许中断,出错字符接收并且能够置位 URXIFG。
URXWIE:接收唤醒中断允许位
当接收到地址字符时,该位能够置位 URXIFG,当 URXEIE=0,如果接收内容有错误,该位不能置位
URXIFG。
0 所有接收的字符能够置位 URXIFG;
1 只有接收到地址字符才能置位 URXIFG。
RXWAKE:接收唤醒检测位
在地址位多机模式,接收字符地址位置位时,该机被唤醒,在线路空闲多机模式,在接收到字符前检
测到 URXD 线路空闲时,该为被唤醒,RXWAKE 置位。
0 没有被唤醒,接收到的字符是数据;
1 唤醒,接收的字符是地址。
RXERR:接收错误标志位
0 没有接收错误;
1 有接收错误。
串口接受缓冲寄存器 UxRXBUF
串口发送缓冲寄存器 UxTXBUF
简单的练习:串口发送与接收
硬件连接图:
程序代码:
//******************************************************************************
// MSP-FET430P140 Demo - USART0, UART 115200 Echo ISR, XT2 HF XTAL ACLK
//
// 程序功能概述: 配置好串口波特率115200,8位数据位,停止为一位,奇偶校验位无。
// 使能串口接收中断,并开启总中断进入低功耗模式0
// 串口的接收终端触发发送USART0
// MCLK = SMCLK = UCLK0 = XT2 = 8MHz
// Baud rate divider with 8Mhz XTAL = 8000000/115200 = 0069 (0045h)
//******************************************************************************
#include
void main(void)
{
volatile unsigned int i;
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
P3SEL |= 0x30; // 将串口对应的IO口配置为串口模式
BCSCTL1 &= ~XT2OFF; // 选通外部晶振2
do
{
IFG1 &= ~OFIFG; // 清除晶振标志位
for (i = 0xFF; i > 0; i--); // 等待晶振稳定起振
while ((IFG1 & OFIFG)); //
BCSCTL2 |= SELM_2 + SELS; // MCLK = SMCLK = XT2 (safe)
ME1 |= UTXE0 + URXE0; // 使能串口 USART0 TXD/RXD
UCTL0 |= CHAR; // 8位数据位
UTCTL0 |= SSEL1; // 时钟来源SMCLK
UBR00 = 0x45; // 8MHz 115200
UBR10 = 0x00; // 8MHz 115200
UMCTL0 = 0x00; // 8MHz 115200 模式
UCTL0 &= ~SWRST; // 初始款串口状态机
IE1 |= URXIE0; // 使能串口接收终端
_BIS_SR(LPM0_bits + GIE); // 进入低功耗模式0并开启总中断
}
//串口中断函数
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
while (!(IFG1 & UTXIFG0)); // 等待发送准备OK
TXBUF0 = RXBUF0; // 将接收到的数据发送回去
}
下载到开发板打开串口调试周守测试效果
【MSP430F149学习】汇总贴
|