历史上的今天
返回首页

历史上的今天

今天是:2025年02月20日(星期四)

正在发生

2021年02月20日 | MSP430学习笔记——USART

2021-02-20 来源:eefocus

MSP430F149有两个USART通讯端口,其性能完全一样,每个通讯口可通过RS232和RS485等芯片转换,与之相应的串行接口电路通讯。MSP430F149支持串行异步和同步通讯,每种方式都具有独立的帧格式和独立的控制寄存器。

USART异步通信

MSP430串行异步通信模式通过两个引脚:接收引脚URXD和发送引脚UTXD与外界相连。异步帧格式由一个起始位,7或8个数据位,校验位(奇/偶/无),1个地址位,和1或2个停止位。从最低位开始发送和接收。异步模式下,传送数据以字符为单位。


在异步模式下,USART支持两种多机模式,即线路空闲和地址位多机模式。


(1)线路空闲多机模式:

在这种模式下,数据块被空闲时间分隔。在字符的第一个停止位之后,收到10个以上的1则标识检测到接收线路空闲,如果采用两位停止位,则第二个停止位被认为是空闲周期的第一个标志。空闲周期后的第一个字符是地址字符。当接收到的字符是地址字符时,RXWAKE置位,并送入接收缓存。


(2)地址位多机模式

在这种模式下,字符包含一个附加的位作为地址标志。数据块的第ige字符带有一个置位的地址位,用以表明该字符是一个地址。


波特率的产生:

在异步串行通信中,波特率是哼重要的指标,定义为每秒钟传送二进制数码的位数。波特率反映了异步串行通信的速度。波特率部分由时钟输入选择和分频,波特率发生器,调整器和波特率寄存器等组成。


下面是波特率发生器的框图:

分频因子N由送到分频计数器的时钟(BRCLK)频率和所需的波特率来决定:

N=BRCLK/波特率

分频因子定义如下:

N=UBR+(M7+M6+M5+M4+M3+M2+M1+M0)/8

中断:

USART模块有接收和发送两个独立的中断源。使用两个独立的中断向量,一个用于接收中断时间,一个用于发送中断事件。USART模块的中断控制位在特殊的功能寄存器中。

USART0

特殊功能寄存器 接收中断控制位 发送中断控制位 IFG1 接收中断标志URXIFG0 发送中断标志 UTXIFG0 IE1 接收中断使能URXIE0 发送中断使能UTXIE0 ME1 接收允许URXE0 发送允许UTXE0 MSP430F149有USART0和USART1两个通信硬件模块,因此有两套寄存器。


一次正确的USART模块初始化应该是这样的顺序:

(1)先在控制位SWRST=1(默认)的情况下设置串口

(2)然后设置SWRST=0;


(3)最后如果需要中断,则设置相应的中断使能

例程:MCU不停向PC发送数据,在屏幕上显示0-127对应的ASCII字符。数据格式无奇偶校验,8位数据位,1个停止位,波特率115200.

#include "io430.h"

#define uchar unsigned char

#define uint unsigned int

void InitSys()

{

uint iq0;

//使用XT2振荡器

BCSCTL1&=~XT2OFF; //打开XT2振荡器

do

{

IFG1 &= ~OFIFG;// 清除振荡器失效标志

for (iq0 = 0xFF; iq0 > 0; iq0--);// 延时,等待XT2起振

}

while ((IFG1 & OFIFG) != 0);// 判断XT2是否起振

BCSCTL2 =SELM_2+SELS;//选择MCLK、SMCLK为XT2,四分频

}

void delay(void);

void PutString(uchar *ptr);

void main( void )

{

// Stop watchdog timer to prevent time out reset

WDTCTL = WDTPW + WDTHOLD;

InitSys();

uchar value=0;

//以下是串口设置

P3SEL|=0XC0; //P3.6,7选为USART0收发端

P3DIR|=0x40; //P3.6为输出

ME2|=UTXE1+URXE1; // 使能USART0的接收和发送

UCTL1|=CHAR; //8-bit

UTCTL1|=SSEL1; //UCLK=SMCLK

UBR01=0x45; //设置波特率32/2400=13.65

UBR11=0x00;

UMCTL1=0x049;

UCTL1&=~SWRST; //初始USART0状态机

while(1)

{

while(!(IFG2&UTXIFG1)); //USART1发送缓冲器是否准备好

TXBUF1=value++;

value&=0x7f; //保证value的数值小于128

while(!(IFG2&UTXIFG1));

TXBUF1='n'; //发送换行符

delay();

}

}

void PutString(uchar *ptr) //向PC机发送字符串

{

while(*ptr !='' ) //不为字符串结束符

{

while(!(IFG2&UTXIFG1));

TXBUF1=*ptr++; //发送数据

}

}

void delay(void)

{

uchar i=20;

uint j;

while(i--)

{

j=2000;

while(j--);

}

i

例2:PC机想MSP430发送一个数据,+1在发回PC机

#include "io430.h"

#define uint unsigned int

void delay();

void InitSys()

{

uint iq0;

//使用XT2振荡器

BCSCTL1&=~XT2OFF; //打开XT2振荡器

do

{

IFG1 &= ~OFIFG;// 清除振荡器失效标志

for (iq0 = 0xFF; iq0 > 0; iq0--);// 延时,等待XT2起振

}

while ((IFG1 & OFIFG) != 0);// 判断XT2是否起振

BCSCTL2 =SELM_2+SELS;//选择MCLK、SMCLK为XT

}

void main( void )

{

// Stop watchdog timer to prevent time out reset

WDTCTL = WDTPW + WDTHOLD;

InitSys();

//串口设置

P3SEL|=BIT6+BIT7; //P3.6,7=USART0 TXD,RXD

P3DIR|=BIT6;

ME2 |=URXE1+UTXE1; // 使能发送和接收

UCTL1|=CHAR; //8位

U1TCTL=SSEL1; //UCLK=SMCLK

U1BR0 = 0x45; // 波特率115200

U1BR1 = 0x00; //

UMCTL1 = 0x49; // Modulation

UCTL1&=~SWRST; //usart模块初始化

IE2 |=URXIE1; //社能接收中断

for(;;)

{

__bis_SR_register(LPM0_bits+GIE);

while(!(IFG2&UTXIFG1)); //USART1发送缓冲器是否准备好

TXBUF1=RXBUF1+1; //发送数据

delay();

}

}

#pragma vector=UART1RX_VECTOR

__interrupt void usart0_rx(void)

{

LPM0_EXIT;

}

void delay(void)

{

unsigned i=50000;

while(i!=0)

{i--;}

}


推荐阅读

史海拾趣

科达嘉CODACA公司的发展小趣事

科达嘉电子不仅立足于深圳,还积极布局全球市场。公司通过参加国际电子展会、与国际知名企业合作等方式,不断拓展海外市场。同时,科达嘉还根据客户需求,提供个性化的电感解决方案,赢得了众多客户的信任和合作。公司的主要产品,如一体成型电感、大电流电感等,已广泛应用于工业控制、汽车电子等多个领域。

Elite Semiconductor Products Inc公司的发展小趣事

在电子产品领域,品质是赢得消费者信任的关键。Elite深知这一点,因此在生产过程中严格把控每一个环节,确保产品的品质达到最高标准。公司建立了完善的质量管理体系,从原材料采购到生产流程,再到产品检验,都严格遵循国际标准和行业规范。这种对品质的坚持,让Elite的产品在市场上赢得了良好的口碑,也为公司赢得了众多合作伙伴的信任。

Gentron Corp公司的发展小趣事
在车辆上作为转向灯或刹车灯使用,提高行车安全性。
Freeport Resources Enterprises Corp公司的发展小趣事

为了应对矿业市场的周期性波动和不确定性风险,Freeport Resources实施了多元化经营战略。在保持矿业勘探和开发核心业务的同时,公司还涉足了电子材料贸易、新能源开发等多个领域。通过多元化经营,Freeport Resources有效分散了经营风险,提高了整体抗风险能力。此外,多元化经营还为公司带来了新的增长点,促进了公司的持续健康发展。

AR RF/Microwave Instrumentation公司的发展小趣事

随着科技的不断发展,AR RF/Microwave Instrumentation意识到要想在激烈的市场竞争中保持领先地位,必须不断进行技术创新。公司投入大量资源进行研发,成功推出了一系列具有创新性的产品,如宽带高功率放大器、固态射频放大器等。这些产品不仅性能卓越,而且能够满足不同客户的需求,进一步巩固了公司在行业内的地位。

Ferranti Electric Inc公司的发展小趣事

为了更好地满足全球客户的需求,Ferranti Electric Inc公司积极实施全球化战略。公司不仅在英国本土拥有生产基地和研发中心,还在全球范围内设立了多个分支机构和办事处。通过全球化布局,公司能够更好地了解不同市场的需求和特点,为客户提供更加定制化的产品和服务。同时,公司也积极参与国际竞争和合作,提升其在全球电气行业的影响力。

问答坊 | AI 解惑

华为逻辑电平设计规范教材

华为逻辑电平设计规范教材…

查看全部问答>

怎么学好单片机

我是一个刚上大二的学生,看着单片机的一些东西觉得很感兴趣想学,但是又不知从何学起?希望高手指点一下帮我规划一下?小弟不胜感激。。。…

查看全部问答>

8051f单片机silicon ide编译请教

  我编译时提示 LInker not found C:\\Silabs...\\BIN\\bi51.exe是怎么回事,是我的软件没有装好吗? 可是我卸载了又装了还是这样 怎么回事刚开始用不懂 谢谢了…

查看全部问答>

STM32F10xx时钟系统框图:时钟是整个系统的脉搏

下图是STM32F10xx时钟系统的框图,通过这个图可以一目了然地看到各个部件时钟产生的路径,还可以很方便地计算出各部分的时钟频率。STM32的四个时钟源(HSI、HSE、LSI和LSE)也在图中标出;图中间的时钟监视系统(CSS)是在很多ST7的单片机中就出现 ...…

查看全部问答>

STM32串口控制寄存器疑问

准备采用中断法发送数据,看到datasheet描述USART_CR1位7(TXEIE)和位8(TCIE),不是太明白。采用那一种比较好?…

查看全部问答>

求助:利用MSP430制作函数发生器

我是一个菜鸟,目前有任务利用MSP430F1611制作一个函数发生器,信号最后经DAC12输出,函数波形方波,正弦波,三角波等,频率要求不高200Hz以下,请问各位高手应如何入手,有什么思路,小弟在此谢谢了。…

查看全部问答>

电子时钟控制程序

最近写了一个有关电子时钟控制的程序(我是初学者),程序调试时发现:当调节参数时,数码管显示不稳定。程序我修改了无数遍,就是不知道原因出在哪里!希望可以在各位大虾的帮助找出原因!!!!!   程序如下:   /*------ ...…

查看全部问答>

MXCHIP open

    玩这块板子,涵盖的知识太过广泛,刚开始熟悉大概流程,试过几个例子之后。觉得就那样,都是别人写好的代码,自己移植过去,自己想要一个深刻的理解,所以看了一些另外的一些协议之类的东西,也没着急弄这个东西,看了这么长时间后, ...…

查看全部问答>

直流/直流转换器数据表——系统效率揭秘

市面上售有各种类型的稳压器,但很难选择一款直流/直流稳压器。大多数汽车应用都要求在整个负载范围内保持高效率,因为它们一直在耗电。但话又说回来,许多工业应用在高负载时需要高效率,而在轻负载时,效率并不是很重要。因此必须了解直流/直流稳 ...…

查看全部问答>