历史上的今天
返回首页

历史上的今天

今天是:2024年09月11日(星期三)

正在发生

2019年09月11日 | MSP430F149串口收发程序详解

2019-09-11 来源:eefocus

MSP430单片机的串口收发程序涉及到多个寄存器,可以一步一步按照以下步骤进行配置:

1、首先将用到的IO口设置为第二功能,例如要使用P3.4和P3.5作为USART0的TXD和RXD,则有 P3SEL |= BIT3+BIT4;

2、使能串口收发功能,要配置以下寄存器

如果既要收,又要发,则需要将UTXE0和URXE0置1,因为他们默认都是不打开的。

在IAR的头文件中有关于两位的掩码:

#define UTXE0   (0x80)

#define USPIE0  (0x40)

因此,我们可以直接使用语句:

ME1 |= UTXE0 + URXE0; 

3、选择每帧的数据位的个数,需要配置寄存器:

 默认的是7bit数据位,因此将CHAR位置1就是8位数据位。

  UCTL0 |= CHAR; 

4、选择波特率发生源,MSP430F149的波特率发生源有四种

波特率的分频系数要求大于3,要选择合适的时钟源,可以遵循以下规则:当波特较低时(<9600),可以选择ACLK,辅助时钟一般情况下使用是32768Hz的Watch Oscilliater,

当波特率较高时要使用SMCLK子系统时钟。

在IAR的头文件中有如下定义:

#define SSEL0  (0x10) /* Clock Source Select 0 */

因此要选用ACLK,可以使用:

UTCTL0 |= SSEL0;

5、配置波特率,这个需要结合选用的时钟源进行相应的计算:

首先它需要用到三个寄存器UXBR0,UXBR1和UXMCLK

然后要弄清楚分频比:

其中的BRCLK是指波特率发生器的时钟源的频率,例如本例当中使用的ACLK= 32768Hz, baude rate是指我们最终希望配置成的频率,例如本例需要的是9600

那么N=32768/9600=3.41

UXBRO和UXBR1组合为一个16位的寄存器,它保存整数部分,所以UXBR0=3,UXBR1=0;

UXMCLK用来保存小数部分,小数部分的计算比较复杂

首先让小数部分0.41*8=5.08 取整就是5

则UXBR1这个8位寄存器中就应该有5个1,这五个1要分布相对平均,可以取01001010,就是4A

要注意UXBR1的取值并不唯一。

在User's Guide中已经计算好的有如下:

这些是常用值,建议使用的时候参考参考,免去计算的麻烦。

6、软件清除复位标志位

寄存器如下:

其中第一位用于是否具有软件复位UART功能,一般需要关闭该功能,也就是复位。

UCTL0 &= ~SWRST; 

7、最后我们需要打开中断,当然如果你不需要使用中断收发而使用查询方式收发,那么就不用打开中断。

需要配置的寄存器如下:


可以看到默认的情况下,USART的发送中断和接收中断是关闭的,在本例当中,我们用到了接收中断,因此:

IE1 |= URXIE0;

到此,整个程序基本就结束了。

#include 

 

void main(void)

{

  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

  P3SEL |= 0x30;                            // P3.4,5 = USART0 TXD/RXD

  ME1 |= UTXE0 + URXE0;                     // Enable USART0 TXD/RXD

  UCTL0 |= CHAR;                            // 8-bit character

  UTCTL0 |= SSEL0;                          // UCLK = ACLK

  UBR00 = 0x03;                             // 32k/9600 - 3.41

  UBR10 = 0x00;                             //

  UMCTL0 = 0x4A;                            // Modulation

  UCTL0 &= ~SWRST;                          // Initialize USART state machine

  IE1 |= URXIE0;                            // Enable USART0 RX interrupt

 

// Mainloop

  for (;;)

  {

  _BIS_SR(LPM3_bits + GIE);                 // Enter LPM3 w/interrupt

  while (!(IFG1 & UTXIFG0));                // USART0 TX buffer ready?

  TXBUF0 = RXBUF0;                          // RXBUF0 to TXBUF0

  }

}

 

// UART0 RX ISR will for exit from LPM3 in Mainloop

#pragma vector=UART0RX_VECTOR

__interrupt void usart0_rx (void)

{

  _BIC_SR_IRQ(LPM3_bits);                   // Clear LPM3 bits from 0(SR)

}


推荐阅读

史海拾趣

Barry Industries Inc公司的发展小趣事

Barry Industries Inc深知品质是企业生存和发展的关键。因此,公司始终将品质管理放在首位,从原材料采购到生产流程控制,再到产品出厂检验,每一个环节都严格把控品质。同时,公司还注重品牌建设,通过提升产品形象和服务水平,逐渐树立了良好的品牌形象。

西博臣(CYBERSEN)公司的发展小趣事

作为一家技术驱动型企业,西博臣始终将创新作为发展的核心动力。公司不断投入资源进行新技术和新产品的研发,积极申请各类专利和知识产权,以保护自己的技术成果。这些专利和知识产权不仅提升了公司的技术实力,也为其在市场中树立了良好的口碑。

Fastron公司的发展小趣事

Fastron公司起源于XXXX年的德国,凭借其卓越的技术和产品质量,逐渐在电感器领域崭露头角。随着业务的发展,Fastron不仅保留了德国的精湛工艺和严格品质控制,还成功地将业务拓展到了东欧和东南亚。这些地区的生产设施均通过TS 16949和ISO 14001认证,确保了产品的全球统一品质。

佰宏(BHFUSE)公司的发展小趣事

BHFUSE佰宏实业成立于2013年,创立之初,公司便确立了专注于大电流、高电压、低内阻的PPTC自恢复保险丝的研发与生产。面对激烈的市场竞争,佰宏团队凭借对技术的深刻理解和对市场的敏锐洞察,逐步赢得了客户的认可。在创立初期,佰宏便与多家知名代工厂建立了合作关系,为其提供优质的保护器件,逐步在行业中树立了良好的口碑。

Davies Molding公司的发展小趣事

Davies Molding公司在追求经济效益的同时,始终关注社会责任和可持续发展。公司积极参与环保公益活动,推动绿色生产,降低对环境的影响。此外,Davies Molding公司还注重员工福利和社会公益事业,为员工提供良好的工作环境和发展空间,为社会做出积极贡献。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实基础。

Daniel Woodhead公司的发展小趣事

随着公司业务的不断拓展,Daniel Woodhead公司意识到人才是企业发展的核心。因此,公司加大了对研发团队的投入,引进了一批业界顶尖的技术人才。这些人才的加入不仅为公司带来了更多的创新思路,还提高了整体的技术水平。在团队的共同努力下,公司不断推出具有竞争力的新产品,进一步巩固了市场地位。

问答坊 | AI 解惑

监控摄像机系统镜头的安装

镜头的安装方式:有C式和CS式两种,两者的螺纹均为1英寸32牙,直径为1英寸,差别是镜头距CCD靶面的距离不同,C式安装座从基准面到焦点的距离为17.562毫米,比CS式距离CCD靶面多一个专用接圈的长度,CS式距焦点距离为12.5毫米。别小看这一个接圈,如 ...…

查看全部问答>

关于GE90-30编程指令问题

使用VERSAPRO编程软件对一个90-30CPU331的程序进行修改程序,可是加程序编译显示有错误,显示信息是:IN STRUCTION NOT SUPPORTED BY CURRENT CPU,和 MISSING REQUIRED POWER FLOW IN,   为什么显示 不支持当前CPU?  为什么没有电 ...…

查看全部问答>

彩虹玫瑰

见过各种颜色的玫瑰花,但是你见过七色的彩色玫瑰吗?     创意者见到彩虹时感叹它的美。心想花如果有这种着色那多好啊。后来她通过先进的园艺技术,在不同成长时期给玫瑰花供给不同颜色的染料,让颜色自然长在花瓣中。这样就让同一 ...…

查看全部问答>

为什么我的液晶显示每个字只有下面的一半。上面一半则显示不出数据

采用192641的lcd显示芯片,要做一个在几个固定屏幕之间切换的控制 显示主程序如下: INITLCD:    ;开启液晶并从第一行开始显示         CLR        LCDCS1        ...…

查看全部问答>

wince启动时出错

目前通过网络下载将开发工作站上编译的wince镜像下载到目标机。现在目标机和开发工作站已经可以连接起来了,目标机上显示Jumping to 0x0013AC2C,开发工作站能出现下载进度显示界面。 但是下载结束后,出现如下Find Source的对话框,Please enter ...…

查看全部问答>

在WINDOWS中用ADS,就不用安装LINUX对不对

可以在PC的windows中使用ADS开发环境开发驱动程序,为什么还要在PC中装LINUX操作系统,当向板子上将Linux内核移植好后,直接在windows中用ADS就可以了,有必要用LINUX吗?…

查看全部问答>

HJTAG+AXD怎样才能修改内存数据?

HJTAG+AXD怎样才能修改内存数据? 1. 用本人自制的Wiggler小板将PC与目标板连接,上电后.HJTAG能正确辨认CPU 2. 在目标板LOAD操作系统Wince完成后(可运行应同程序).运行AXD时使用HJTAG.DLL服务能正确进入调试界面.但对WINCE默认虚拟的内存空间0x8 ...…

查看全部问答>

EVC+PPC2002的DLL载入

我现在在做二次开发,想搭建环境.可是在用到以前写的LIB,DLL,H的时候出问题了. 具体问题如下:我写了个cedit程序,把CView类更换成CEditView(以前的开发人员写的),其他的什么都没写 包了头文件库以及LIB库,编译没有错误了,但是运行的时候说cannot ex ...…

查看全部问答>

20101104-[经典]一篇很不错的ARM体系结构的讲义资料,需要的就赶快下载.txt

一篇很不错的ARM体系结构的讲义资料,需要的赶快下载…

查看全部问答>