历史上的今天
返回首页

历史上的今天

今天是:2025年03月01日(星期六)

2020年03月01日 | 【MSP430】MSP430深入研究 之 通用收发器USART(上)

2020-03-01 来源:eefocus

通用同步/异步收发器采用一个硬件,支持两种通用串行总线接口模式(msp430f16x支持三种,另外一种是I2C),UART接口(异步模式),SPI接口(同步模式)。我们可以根据寄存器UxTCL的SYNC来选择USART的工作模式。在MSP430F149中有两个相同的串行总线接口,可以分别或者同事配置成两种模式。


——摘自《MSP430基础与实践》


这次先介绍通用异步串行接口UART;

figure1. USART(in UART modem)


那大致可以看出他就分为以下几个部分:


>串口控制器:UxCTL


>接受控制器:UxRCTL


>发送控制器:UxTCTL


>波特率控制器:UxBR0 UxBR1 UxMCTL


>收发使能控制器:UxME


>收发中断控制器:UxIE


>标志寄存器:UxIFG

figure 2. Flow Chart of USART Initializing 


USART Control Register:

figure 3. USART Control Register


可见SWRST默认是为1:意思是USART默认为Reset状态,所以我们在设置完,只有把SWRST置为0才能使能UART或SPI或I2C;


感觉说这些都是多余浪费时间的,既然是深入研究,那么我们就做点别人很少研究的东西!


关于波特率的设置:

figure 4. Baud Rate


波特率的设置,datasheet上已经给出了解释!可能大家对UxBR0、UxBR1的认识已经没有什么问题了!重要是UxMCTL,我们先来看看UxMCTL的寄存器:

figure 5. Register of UxMCTL


mi : Data of each corresponding modulation bit (1 or 0);


所以不管你把那个置为1,只要他们的和与8相除,商为接近你想要得到的小数的值即可!


举个例子:MCLK = 8000 000Hz, Baud Rate =  9600;


UxBR + (m0+m1+ ... + m7)/8 = 8000 0000/9600 = 833  + 0.33333


UxBR 设为 833 不用说了,8 X 0.3333 = 2.666 ≈ 3;那么m0~m7里面只要有3个1就可以了,所以为了方便期间我们用移位的方法:


unsigned char temp = 0;


for(i=0; i<3; i++)


{


    temp = temp <<1;


    temp |= 1;


}


由于串口通信比较简单,就没什么好多说的了!


实例代码:


#include

#include "msp430_lib.h"

 

#define BUFF_SIZE 128

typedef struct {

    int recv_len;

    unsigned char recv_buff[BUFF_SIZE];

}UART_RECV;

UART_RECV u_recv;

void uart0_init(int baud_rate)

{

    unsigned char i,temp;

    // 设为复位模式,方便多次初始化

    U0CTL |= SWRST;

    // 8个bit

    U0CTL |= CHAR;

    // 这里波特率设置

    U0BR1 = (unsigned int)0xff&((NOW_SYSCLK/baud_rate)>>16);

    U0BR0 = (unsigned int)(NOW_SYSCLK/baud_rate)&0xff;

    i = (NOW_SYSCLK - baud_rate*(unsigned int)(NOW_SYSCLK/baud_rate))*8/baud_rate;

    while(i){

        i--;

        temp = temp << 1;

        temp |= 1;

    }

    U0MCTL = temp;

    // 进入标准模式

    U0CTL &= ~SWRST;

    // 使能发送和接收

    U0ME |= UTXE0 + URXE0;

    // 使能接收中断

    U0IE |= URXIE0;

    // 配置PIN为特殊功能模式

    P3SEL |= BIT7 + BIT6;

    // 使能全局中断

    _EINT();

    u_recv.recv_len = 0;

}

/*

 * 数据发送函数

 */

void uart_senddata(unsigned char byte)

{

    while(!(U0IFG & UTXIFG0));

    U0TXBUF = byte;

}

//  中断处理函数

#pragma vector=UART0RX_VECTOR

__interrupt void uart_rxirq()

{

    u_recv.recv_buff[u_recv.recv_len++] = U0RXBUF;

}


中断数据接收的地方,我创建了一个缓冲区,用了一个全局变量!方便一下子接收很多数据!

推荐阅读

史海拾趣

APSA公司的发展小趣事

随着全球电子市场的不断扩大,APSA公司开始实施全球化战略。公司先后在多个国家设立分支机构,拓展国际业务。通过与全球客户的合作,公司的产品线不断丰富,市场份额也逐渐提升。

远东福斯特公司的发展小趣事

APSA公司在创业初期,专注于电子行业中某一特定领域的技术研发。通过团队的不懈努力和持续创新,公司成功开发出一款具有竞争力的产品,填补了市场空白。这一技术突破不仅为APSA公司赢得了首批客户,也为公司的后续发展奠定了坚实的基础。

Connect-Tech Products Corp公司的发展小趣事

Connect-Tech Products Corp公司在追求经济效益的同时,也积极履行社会责任。公司注重环保和可持续发展,采用环保材料和节能技术,减少生产过程中的环境污染。此外,公司还积极参与公益事业,为社会做出贡献。这些举措不仅提升了公司的社会形象,也为其赢得了社会各界的广泛赞誉和支持。

请注意,以上故事是基于电子行业和公司发展的一般模式虚构的,并不代表Connect-Tech Products Corp公司的实际发展历程。如需了解该公司的真实情况,建议查阅相关新闻报道、公司年报或行业分析报告等资料。

FILTRAN公司的发展小趣事

Connect-Tech Products Corp公司始终将产品质量视为企业发展的生命线。公司建立了严格的质量管理体系,从原材料采购、生产加工到产品出厂,每一个环节都严格把控。此外,公司还注重持续改进,不断优化生产流程和技术创新,确保产品质量的稳定性和可靠性。这些措施使得Connect-Tech Products Corp公司的产品在市场上赢得了良好的口碑和信誉。

台湾诚阳(BC)公司的发展小趣事

在电子行业的激烈竞争中,台湾诚阳(BC)公司凭借其对技术的敏锐洞察和持续创新,成功研发出一款具有颠覆性的电子产品。这款产品不仅具有高性能和稳定性,还集成了多项前沿技术,满足了市场对于高效、便捷的需求。凭借这一创新产品,台湾诚阳迅速在市场中脱颖而出,赢得了众多客户的青睐。

启英泰伦(Chiplntelli)公司的发展小趣事

随着市场竞争的加剧和消费者需求的多样化,启英泰伦不断调整和创新其市场策略。为了解决“装得起”这一问题,公司选择了将智能语音识别技术集成到智能插座上的新路径。这一策略不仅降低了功耗的严格约束,还对方案的尺寸和成本进行了优化。此外,启英泰伦还针对不同应用场景进行细分,如照明、风扇等产品交互比较简单的领域,开发了相应的芯片和解决方案。这些创新策略使启英泰伦能够更好地满足市场需求,保持了在行业内的领先地位。

问答坊 | AI 解惑

我的ucos终于在51上跑起来了(附加代码和强人心得)

转自周立功论坛 小弟学ucos有一段时间了,总想找个移植的案例跑起来试试 前不久将网络上的一篇“小siae的uCOS2C51”下载下来,放到我的STC89C52RC中,发现跑不起来,郁闷了.... 后来在网上找了一个很好的关于uCOS2C51的移植总结,比较着调 ...…

查看全部问答>

基于SOPC的PCI数据采集卡的设计与实现

基于SOPC的PCI数据采集卡的设计与实现…

查看全部问答>

RFID入门经典培训教材

别处看到的资料,新手了解很不错的…

查看全部问答>

4.3寸屏不能显示完整文字

最近在开发测试TFT LCD屏. 刚开始用3.5寸的320*240编译了CE系统.文字可以显示完整. 之后改用4.3寸的480*272分辨率(16:9)编译CE系统.显示的文字例如回收站这几个字只能显示横的.竖的显示不出来. 直接换成3.5寸的屏又可以显示.用PB截图也是显示完 ...…

查看全部问答>

关于西门子plc的问题

请问各位老师们,学习西门子plc应该遵寻怎样一个过程,先学啥后学啥,请老师指点,我对这个学习的先后顺序很迷茫,不知道如何下手?…

查看全部问答>

高分2440SDRAM时钟配置问题

我的SDRAM时钟,按我的意思是配置到100M,但实际只配到了4M左右,单步调试发现int.s中分频已经正确,但在MAIN.C函数,倍频时,时钟并没有起来                 ChangeUPllValue(56,2,2);    // ...…

查看全部问答>

做手写板软件。。。

请问有人做过手写板软件吗? 我想做个手写板的软件,通过手写板输入,最好可以检测压力,如果买市面上的手写板,好像很难通过这些成品做出软件来。 请问有有过同样想法的人吗?我要买什么好呢? 请各位指教~~…

查看全部问答>

串口通信两端都是RS232可以吗

想做一个带console口的硬件系统,通过PC机对其进行控制。看到交换机一般都是用RJ45做console口。对硬件不太懂,问点外行问题: 可不可以我的console口也是个和PC机一样的串口(RS232)啊?有两边都是RS232的console线吗? 如果不行,做成RJ45口的 ...…

查看全部问答>

直流电机励磁电压,励磁电流的问题?

直流电机励磁电压,励磁电流的问题,求助 我们现场有一台直流电机,平头机刀盘用。励磁电压180V,励磁电流6.67A。用西门子6RA28带动。装置电流125A,励磁最大电流10A。开始安装的时候励磁没有放变压器,励磁回路直接给220V。现在现场说带电机的时 ...…

查看全部问答>

示波器utd2025c使用说明

本帖最后由 paulhyde 于 2014-9-15 08:53 编辑 我想要示波器utd2025c使用说明书  谁有的 上传一下  谢谢  …

查看全部问答>