MSP430串口波特率的设置与计算
- 格式:doc
- 大小:29.00 KB
- 文档页数:2
你参考一下别人的代码看看注释很详细#include <msp430x14x.h>unsigned char RxData;//全局变量,保存接收到的数据。
void BasicClockSet(){/*下面将片外高速晶体设为MCLK分四步:(1) 起动高晶体(2) 清除OFIFG 标志位(3) 至少等待50us。
(4) 查看震荡器失效标志位OFIFG是否清0,如果没有清0,则重复1至4步直到震荡器失效标志位OFIFG清0。
与之相关寄存器为:1.BCSCTL1和BCSCTL2(基础系统时钟控制寄存器)2.IE1中断使能寄存器的第二位OFIE,振荡器失效中断使能位。
3.IFG1中断标志寄存器的第二位OFIFG,振荡器失效标志位。
4.DCOCTL数字震荡器控制寄存器。
一. BCSCTL1设置(基础系统时钟控制寄存器1):1.XT2OFF=0,外部高速晶体开。
2.XTS=0,片外低速晶体的频率,0为低频模式。
3.DIVAx=00B,不将其进行分频,即分频比为14.XT5V不使用设为0。
5.RSELx=111,DOC的电阻选择,此时DOC震荡频率达到最大10000MHZ(理想状态)。
因此BCSCTL1=0000 0111B=0x47。
二.BCSCTL2设置(基础系统时钟控制寄存器2):1.SELMx=10B,选择片外高速晶体作为MCLK。
这两位应等到振荡器失效标志位清0后才置位2.DIVMx=00B,不将其进行分频,即分频比为13.SELS=0B,选择子系统时钟为DCO4.DIVSx=00B,不将其进行分频,即分频比为15.DCOR=0B,选择芯片内部电阻。
三.DCOCTL(数字震荡器控制寄存器)1.DCOx=111,DCO频波段选择,此时诜择最大2.MODx=000,调制选择,当DCOx=111B时MODx无效。
*//*下面将片外高速晶体设为主系统时钟。
*///(1) 起动片外高速晶体BCSCTL1&=~XT2OFF;//XT2OFF的宏为0x80。
MSP430串口波特率的设置与计算
波特率是指每秒钟传输的位数,单位为波特(bps)。
在MSP430中,我们可以通过计算和设置分频器的值来实现不同的波特率。
下面是计算MSP430串口波特率的步骤:
1.确定MSP430的工作频率。
2.确定所需的波特率。
3.根据波特率和工作频率的关系,计算出分频系数的值。
4.将计算得到的分频系数的低8位和高8位写入UCAxBR0和UCAxBR1寄存器。
例如,假设MSP430的工作频率为16MHz,我们想要设置的波特率为9600bps,那么计算步骤如下:
1.工作频率为16MHz。
2. 波特率为9600bps。
4. 将BRx的值分解为低8位和高8位。
假设取整数部分为104,小数部分取0.1667乘以256,得到43、则UCAxBR0的值为43,UCAxBR1的值为0。
将这两个值写入寄存器即可设置波特率为9600bps。
需要注意的是,不同型号的MSP430可能有不同的时钟源和分频系数的范围。
在设置波特率时,应查阅相关的芯片手册或数据表,对相应的寄存器进行设置。
总结起来,MSP430串口波特率的设置与计算包括确定工作频率,确定所需波特率,计算分频系数,写入寄存器。
通过合适的设置,可以实现稳定和准确的串口通信。
msp430串口接收函数篇一:基于msp430串口接收中断#includevoid main{WDTCTL = WDTPW + WDTHOLD;BCSCTL1 = CALBC1_1MHZ;DCOCTL = CALDCO_1MHZ;P1SEL |= BIT1 + BIT2;P1SEL2 |= BIT1 + BIT2;//需要对照着手册来看UCA0CTL1 |= UCSSEL_2;//选择串口的校验位 UCA0BR0 = 104;//9600 波特率的计算一般都存在误差 UCA0BR1 = 0;UCA0MCTL = UCBRS0;//校准波特率用所以要使用校准UCA0CTL1 &= ~UCSWRST;//让串口进行复位IE2 |= UCA0RXIE;//开启接收中断__bis_SR_register;}#pragma vector = USCIAB0RX_VECTOR__interrupt void USART_RECEIVE{UCA0TXBUF = UCA0RXBUF+1;while);//等待发送完毕可加可不加 }篇二:MSP430串口收发程序MSP430 标准库printf函数实现20XX-08-02 21:22关键是增加一个putchar函数。
代码如下:#include#includevoid NOP10{_NOP ;_NOP ;_NOP ;_NOP ;_NOP ;_NOP ;_NOP ;_NOP ;_NOP ;_NOP ;}int putchar//注意不要改参数的类型和返回值的类型,否则printf调用是就有问题了。
{if{TXBUF1 = '\r';while==0);}TXBUF1 = c;while==0);return c;}void InitalUart1{P4SEL |= 0x03; // P4.0,1 = USART1 TXD/RXDME2 |= UTXE1 + URXE1;// Enable USART1 TXD/RXDUCTL1 |= CHAR; // 8-bit characterUTCTL1 |= SSEL1; // UCLK = SMCLK UBR01 = 0x36; // 1MHz 19200UBR11 = 0x00; // 1MHz 19200UMCTL1 = 0x6B; // ModulationUCTL1 &= ~SWRST; // Initalize USART state machine IE2 |= URXIE1; // Enable USART1 RX interrupt//IFG2 |= UTXIFG1;}void main{unsigned char i;i=0x10;WDTCTL = WDTPW + WDTHOLD; // Stop WDTFLL_CTL0 |= XCAP18PF;// Configure load capsInitalUart1 ;_EINT ;// LPM0;while{// while ); // USART1 TX buffer ready?// TXBUF1 = 'H';//putchar;//putchar;printf;NOP10 ;}}#pragma vector=USART1RX_VECTOR__interrupt void usart1_rx{while ); // USART1 TX buffer ready?TXBUF1 = RXBUF1; // RXBUF1 to TXBUF0//LPM0_EXIT;msp430各模块函数整合20XX-08-13 14:27/***************************************************程序功能:控制8个LED闪烁,用于测试下载功能是否正常测试说明:观察LED闪烁***************************************************/#include#include "EEPROM.c"#include "LCD1602.c"#include "DS18B20.c"void LED_delay;void KEY_delay;void EEPROM_delay;void sys_init;void LED_Init;void LED_Set;unsigned char LED_Read_Status;void LED_Test;void KEY_Init;unsigned char key;void KEY_Test;void SEG_Init;void SEG_Show;void EEPROM_Init;void Write_EEPROM;void Read_EEPROM;void LCD1602_Init;void LCD1602_Show;void DS18B20_Init;void TimerA_Delay_CFG;float get_DS18B20_temperature;unsigned char SEG_Table[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0 xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//0-f 段选信号,共阳 uchar UART_Rev_String[20]="\0";uchar rev_string_count=0;uchar rev_string_xxplete=0; //为1代表串口接收了一行字符串// =================================================== ===============// 延时函数// =================================================== ===============//************************************************* // function :LED_delay// parameter:dly// description :用于LED花样显示延时//************************************************* void LED_delay{unsigned int i;whilefor;}//************************************************* // function :KEY_delay// parameter:// description :用于消抖的延时//************************************************* void KEY_delay{uint tmp;for;}//************************************************* // function :EEPROM_delay// parameter:ts// description :用于消抖的延时//************************************************* void EEPROM_delay{while;}// =================================================== =============== // 系统函数// =================================================== ===============//************************************************* // function :sys_init// parameter:// description :延时一段时间//************************************************* void sys_init{WDTCTL = WDTPW + WDTHOLD; //关闭看门狗BCSCTL2 &=0xc0; //XT2CLK+2分频}// =================================================== =============== // LED相关函数//=================================================== ===============//************************************************* // function :LED_Init// parameter:// description :LED初始化程序// 8个LED接在P2.0~P2.7上。
串口波特率计算范文
波特率的计算方法如下:
1.波特率计算公式:波特率=每秒传输的位数/传输的时间
2. 传输的时间:数据的传输时间取决于数据长度和串口的波特率。
通常情况下,每个数据字节都由10位来表示。
其中有一个起始位(Start bit),8个数据位(Data bits),一个校验位(Parity bit),一个停止位(Stop bit)。
具体计算波特率的步骤如下:
1.根据串口的数据帧格式计算传输时间:传输时间=数据帧长度(位数)/波特率
需要注意的是,波特率计算只是理论上的数值,实际上还会受到硬件设备的限制和传输线路的影响。
在实际应用中,建议选择合适的波特率以确保稳定的数据传输。
【MSP430趣谈】MSP430第九讲之串⼝使⽤上次⼀讲中我们说到了定时器的两种写法,⼀种是利⽤寄存器进⾏书写的,另外⼀种是利⽤官⽅库函数进⾏书写的。
我们通过对⽐这两种写法,发现库函数居然写的要⽐寄存器还多,这不是更加不⽅便了吗。
其实库函数和寄存器应该说各有好处吧,因为TI官⽅给了我们很多的寄存器定义,所以相对看起来不是那么难懂,库函数的话也相对是简洁明了的。
我个⼈的观点是,在⼀些相对寄存器较少,运⾏速度较慢的单⽚机⾥⾯我们⽤寄存器写的话是最⾼效的,对于430来说,官⽅给的库相对的话运⾏速度不会和寄存器差点哪去(具体我也没测试过,瞎说),但库函数⼀定会⽐操作寄存器慢⼀点,因为他需要多步才可以配置到寄存器。
但是之后⼤家如果接触32的话也会发现同样存在寄存器和库函数的版本,也同样是这个道理,库函数慢⼀点,但是简洁明了,⽅便。
寄存器更快,但是识别度相对会低⼀点。
但对32的72MHz的运⾏速度也就基本没什么差了。
讲了这么多想说明⼀个什么道理呢?我们现在接触的单⽚机是算很底层的操作了,很底层的设计和应⽤了,相对的,我们有ARM9等等,这些复杂的芯⽚,就已经没有办法⽤所谓的寄存器进⾏操作了,因为它拥有的寄存器实在是太多了,所以就会有系统的产⽣,让芯⽚运⾏在系统上⾯,底层的东西集成了,减少了开发难度。
之后⼤家接触了其他语⾔,⽐如c++和java,其实这两个是类似的,只要会了⼀个另⼀个也基本花⼀点时间就可以学会了。
这两个语⾔的思想也和这个类似,把很多东西封装起来,你只要懂得怎么调⽤就好了,和我们调⽤函数类似,不⽤考虑函数具体是怎么实现这个功能的。
所以希望⼤家既可以明⽩寄存器具体是怎么操作的,同时学会应⽤库函数进⾏开发。
这⼀次我们将进⼊⼀个重要的篇章,通信协议,这个我们会通过⼏个章节来讲,主要介绍下⾯三种通信协议,⼀种是串⼝UART,⼀种是SPI,⼀种是IIC,三种我们都讲通过实例来说明。
这次我们要说的是串⼝UART的使⽤,串⼝应该算是⼀种最简单的通信⽅式了,我们通常值得串⼝指的是UART-Lite,也就是说它是由四根线组成,分别是VCC,RX,TX,GND。
1 MSP430单片机I/O端口控制特点与8031单片机相比,MSP430的I/O端口的功能要强大的多,其控制的方法也更为复杂。
MSP430的I/O端口可以实现双向的输入、输出;完成一些特殊功能如:驱动LCD、A/D转换、捕获比较等;实现I/O 各种中断。
MSP430采用了传统的8位端口方式保证其兼容性,即每个I/O端口控制8个I/O引脚。
为了实现对I/O端口每一个引脚的复杂控制,MSP430中的每个I/O口都对应一组8位的控制寄存器(如图1)。
寄存器中的每一位对应一个I/O引脚,实现对该引脚的独立控制。
寄存器的功能和数目是由该I/O口所能完成的功能以及类型确定的。
[2]图1为MSP430的一个I/O端口的控制结构示意图。
对于最基本的只能完成输入、输出功能的I/O端口其控制寄存器只有3个。
其中,输入寄存器保存输入状态;输出寄存器保存输出的状态,方向寄存器控制对应引脚的输入、输出状态。
本文中用来实现I2C总线接口的P6.6、P6.7都属于这类的端口。
此外,有些I/O端口不但可以用作基本的输入输出,而且可以用作其他用途,比如可以作为LCD的驱动控制引脚。
这类端口的控制功能寄存器实现引脚功能状态的切换。
再者,有一类端口不但可以完成上述两种端口的功能,而且可以实现中断功能。
该类端口拥有图1中所有的寄存器,中断触发的方式以及中断的屏蔽性都可以通过相应的寄存器控制。
本文中使用的P2.0就属于该类端口,利用它来接收LM92发出的中断。
通过上述的控制结构,MSP430的I/O端口可以实现很丰富的功能。
不仅如此,其中一些I/O口还可以与MSP430中的特殊模块相结合完成更为复杂的工作。
如与捕获比较模块相结合可以实现串行通信,与A/D 模块结合实现A/D转换等。
此外,MSP430 I/O端口的电器特性也十分突出,几乎所有的I/O口都有20mA 的驱动能力,对于一般的LED、蜂鸣器可以直接驱动无需辅助电路。
许多端口内部都集成了上拉电阻,可以方便与外围器件的接口。
MSP430单片机串口通信详解#include"msp430G2553.h"#include "in430.h"void UartPutchar(unsigned char c);unsigned char UartGetchar();unsigned char temp=0;unsigned char number[2]={0};void main( void ){WDTCTL = WDTPW + WDTHOLD; // Stop WDTBCSCTL1 = CALBC1_1MHZ; // Set DCODCOCTL = CALDCO_1MHZ;P1DIR|=BIT6;P1OUT&=~BIT6;P1SEL = BIT1 + BIT2; // P1.1为 RXD, P1.2为TXD P1SEL2 = BIT1 + BIT2; // P1.1为 RXD, P1.2为TXDUCA0CTL1 |= UCSSEL_2; // 选择时钟BRCLKUCA0BR0 = 106; // 1MHz 9600UCA0BR1 = 0; // 1MHz 9600UCA0MCTL = UCBRS2 + UCBRS0; // 波特率=BRCLK/(UBR+(M7+...0)/8)UCA0CTL1 &= ~UCSWRST;// 初始化顺序:SWRST=1设置串口,然后设置SWRST=0,最后设置相应中断IE2 |= UCA0RXIE; // 使能接收中断while(1){//UartPutchar(9);// display_int(temp,0);__delay_cycles(10000);}}/**********************************UART接收中断*************************/#pragma vector=USCIAB0RX_VECTOR__interrupt void USCI0RX_ISR(void){//while (!(IFG2&UCA0TXIFG)); // 等待发送完成 //UCA0TXBUF = UCA0RXBUF; // TX ->; RXed charactertemp=UCA0RXBUF;}/******************************UART发送字节函数*************************/void UartPutchar(unsigned char c){while(!(IFG2 & UCA0TXIFG)); //待发送为空UCA0TXBUF=c;IFG2 &=~UCA0RXIFG;}/*********************************UART接收字节数据******************/unsigned char UartGetchar(){unsigned char c;while(!(IFG2 & UCA0RXIFG)); //等待接收完成c=UCA0RXBUF;IFG2 &=~UCA0TXIFG;return c;}/******智能控制工作室*******/MSP430g2553串口通信MSP430的不同型号,其串行通讯工作模式是一样的。
MSP430_UART串口模块MSP430--UART模块UART是通用异步串行接口的简称。
串行通信接口是用来与单片机外界系统进行通信桥梁,比如可以吧单片机ADC 转换的数据通过串口发送给PC机(上位机),经上位机处理之后在发回给单片,达到通信的目的。
TI公司的MSP430系列单片机均具有UART功能,其中大部分还和SPI,I2C功能复用,通过相关寄存器的配置,可以很轻松地就实现了UART,SPI,I2C的通信功能。
在此以MSP430x149为例介绍UART 功能及其实现过程。
1.异步通信的结构:2.UART数据格式(数据协议):异步通信再不发送数据的时候,通信线路上总是呈现高电平状态,称为空闲状态。
当有数据发送是,信号线变成低电平,并持续一位的时间用于表示发送字符的开始,该为称为起始位。
起始位之后在信号线上依次出现发送的数据。
起始位,数据位由高到低7/8位,地址位0/1位,奇偶校验位奇偶或无,停止位1/2位。
数据位位数、地址位、奇偶校验位、停止位均可由单片机内部寄存器控制;这款单片机都有两个USART模块,有两套独立的寄存器组;以下寄存器命中出现x代表0或是1,0代表对应0模块的寄存器,1代表对应1模块的寄存器;其中,与串口模式设置相关的控制位都位于UxCTL寄存器,与接收相关的控制位都位于UxRCTL寄存器,与发送相关的控制位都位于UxTCTL寄存器;波特率设置用UxBR0、UxBR1、UxMCTL三个寄存器;接收与发送有独立的缓存UxRXBUF、UxTXBUF,并具有独立的移位寄存器和独立的中断;中断允许控制位位于IE1/2寄存器,中断标志位位于IFG1/2寄存器。
3.波特率设置:430的波特率设置用三个寄存器实现:UxBR0:波特率发生器分频系数低8位。
UxBR1:波特率发生器分频系数高8位。
UxMCTL:波特率发生器分频系数的小数部分实现。
设置波特率时,首先要选择合适的时钟源:USART模块可以设置的时钟源有UCLK引脚、ACLK、SMCLK;对于较低的波特率(9600以下),可选ACLK作为时钟源,这样,在LPM3(低功耗3)模式下,串口仍能正常发送接收数据;另外,由于串口接收过程有一个三取二判决逻辑,这至少需要三个时钟周期,因此分频系数必须大于3;波特率高于9600时,将不能使用ACLK作为时钟源,要调为频率较高的SMCLK作为时钟源;另外还可以外部输入UCLK时钟。
msp430设置蓝牙模块波特率及自身波特率设置#include"msp430f5529.h"void UCA1INT(){UCA1CTL1|=UCSSEL_2+UCSWRST;//设置波特率 clk/(BR0+BR1*256) 详见指导手册P908 需同时设置UCA1Bx,UCOS16,UCBRS,UCBRFUCA1BR0=0x6d;UCA1BR1=0;UCA1MCTL|=UCBRS_2;//设置管脚P4SEL|=BIT4+BIT5;P4DIR|=BIT4;UCA1CTL1&=~UCSWRST;UCA1IE|=UCTXIE+UCRXIE;}int t;void main(void){//int i,j;WDTCTL=WDTPW+WDTHOLD; // Stop WDTUCA1INT();t=0;__enable_interrupt();while(t==0){UCA1TXBUF='A';while(UCA1STAT&UCBUSY);UCA1TXBUF='T';__delay_cycles(1000000);}while(1){UCA1TXBUF='A';while(UCA1STAT&UCBUSY);UCA1TXBUF='T';while(UCA1STAT&UCBUSY);UCA1TXBUF='+';while(UCA1STAT&UCBUSY);UCA1TXBUF='B';while(UCA1STAT&UCBUSY);UCA1TXBUF='A';while(UCA1STAT&UCBUSY);UCA1TXBUF='U';while(UCA1STAT&UCBUSY);UCA1TXBUF='D';while(UCA1STAT&UCBUSY);UCA1TXBUF='4';while(UCA1STAT&UCBUSY);__delay_cycles(10000000);}}unsigned char a[20];#pragma vector=USCI_A1_VECTOR__interrupt void Timer(void){switch(UCA1IV){case 2:a[t++]=UCA1RXBUF;break; //接受数据case 4:UCA1TXBUF;break; //发送数据}}1、核心模块使用HC-06从模块,引出接口包括VCC,GND,TXD,RXD,预留LED状态输出脚,单片机可通过该脚状态判断蓝牙是否已经连接,KEY引脚对从机无效2、led指示蓝牙连接状态,闪烁表示没有蓝牙连接,常亮表示蓝牙已连接并打开了端口3、底板3.3V LDO,输入电压3.6~6V,未配对时电流约30mA,配对后约10mA,输入电压禁止超过7V!4、接口电平3.3V,可以直接连接各种单片机(51,AVR,PIC,ARM,MSP430等),5V单片机也可直接连接,无需MAX232也不能经过MAX232!5、空旷地有效距离10米,超过10米也是可能的,但不对此距离的连接质量做保证6、配对以后当全双工串口使用,无需了解任何蓝牙协议,但仅支持8位数据位、1位停止位、无奇偶校验的通信格式,这也是最常用的通信格式,不支持其他格式。
msp430串口波特率设置说明
TI MSP430系列单片机,usart模块的波特率值设定是通过以下三个寄存器决定的:UxBR0,UxBR1,UxMCTL
波特率=BRCLK/N ,主要是计算出N。
BRCLK:时钟源,可以通过寄存器设定何为时钟源; 通过寄存器UCAxCTL1的SSEL两位选择,01:ACLK,02:SMCLK
N:波特率产生的分频因子。
N=UxBR1+UxBR0+UxMCTL,其中UxBR1+UxBR0为整数部分,UxMCTL为设定小数部分,其中UxBR1为高位,UxBR0为低位,两者结合起来为一个16位的字。
举例说明:波特率=115200,时钟源=8MHz ,为外部晶体振荡器
N=8000000/115200=69.44 。
即UxBR1=0,UxBR0=0x45,首先把小数部分0.44×8,即3.52,取整后为3。
这个3表示在UxMCTL中的8位里要有3个1,并且,UxMCTL分为First Stage Modulation和Second Stage Modulation,也就是前者为高4位,取值范围0-F,后者为低4位,注意后4位最好选择偶数。
把上步的到的小数部分取整后的数值分散到高位和低位,如3,可以写为0x16。
MSP430波特率的计算给定一个BRCLK时钟源,波特率用来决定需要分频的因子N:N = fBRCLK/Baudrate分频因子N通常是非整数值,因此至少一个分频器和一个调制阶段用来尽可能的接近N。
如果N等于或大于16,可以设置UCOS16选择oversampling baud Rate模式注:Round():指四舍五入。
Low-Frequency Baud Rate Mode Setting在low-frequency mode,整数部分的因子可以由预分频实现:UCBRx = INT(N)小数部分的因子可以用下列标称公式通过调制器实现:UCBRSx = round( ( N –INT(N) ) × 8 )增加或减少UCBRSx一个计数设置,对于任何给定的位可能得到一个较低的最高比特误码率。
如果确定是这样的情况UCBRSx设置的每一位必须执行一个精确的错误计算。
例1:1048576Hz频率下驱动以115200波特率异步通讯ACLK = REFO = ~32768Hz, MCLK = SMCLK = default DCO = 32 x ACLK = 1048576Hz。
N = fBRCLK/Baudrate = 1048576/115200 = ~9.10UCBRx = INT(N) = INT(9.10) = 9UCBRSx = round( ( N –INT(N) )×8 )= round( ( 9.10 –9) × 8 )=round(0.8 )=1UCA0CTL1 |= UCSSEL_2;// 选SMCLK为时钟UCAxBR0 = 9;UCAxBR1 = 0;UCAxMCTL = 0x02;//7-4:UCBRFx,3-1:UCBRSx,0:UCOS16UCBRSx 为寄存器UCAxMCTL的1-3位,所以写入0x02(00000010)例2:32768Hz频率下驱动以2400波特率异步通ACLK = REFO = ~32768Hz, MCLK = SMCLK = DCO ~1.045MHzN = fBRCLK/Baudrate = 32768/2400 = ~13.65UCBRx = INT(N) = INT(13.65) = 13UCBRSx = round( ( N –INT(N) )×8 )= round( ( 13.65 –13) × 8 )=round(5.2)=5UCA0CTL1 |= UCSSEL_1; // 选ACLK为时钟UCAxBR0 = 13;UCAxBR1 = 0 ;UCAxMCTL = 0x0A;//7-4:UCBRFx,3-1:UCBRSx,0:UCOS16UCBRSx为寄存器UCAxMCTL的1-3位,所以写入0x0A(00001010)Oversampling Baud Rate Mode Setting在oversampling mode 与分频器设置如下:UCBRx = INT(N/16)第一个调制阶段设置如下:UCBRFx = round( ( (N/16) –INT(N/16) ) × 16 )当要求更精确时,UCBRSx也可以被设置成0-7。
MSP430F5437通过串口向PC发送字符串,使字符串显示在串口助手中。
单片机不停地发送字符,流程图如图所示。
程序代码如下:#include "msp430x54x.h"unsigned char buffer[] = {"I'm MSP430!\n"};void delay(unsigned int n){unsigned int i,j;for(i=0;i<n;i++)for(j=0;j<1000;j++);}void main(void){unsigned int i;WDTCTL = WDTPW + WDTHOLD; // 关狗P5SEL = 0xC0; // P5_6和P5_7第二功能打开,设置方向P5DIR = 0x40;UCA1CTL1 |= UCSWRST; // 首先使RST位置位,只有这样后面的设置才有效UCA1CTL1 |= UCSSEL_2; // SMCLK,为系统时钟1048576HzUCA1BR0 = 9; // 1MHz 115200UCA1BR1 = 0; // 1MHz 115200UCA1MCTL |= UCBRS_1 + UCBRF_0; // 设置调整参数UCBRSx=1, UCBRFx=0 UCA1CTL1 &= ~UCSWRST; // RST复位UCA1IE |= UCTXIE; // 使能发送中断允许while(1){while (!(UCA1IFG&UCTXIFG)); //等待BUF区准备好,当IFG=1时就表示准备好了for(i=0; i<sizeof(buffer); i++){UCA1TXBUF = buffer[i]; //向串口发送数据delay(20); //延时}}}注:这就完成了单片机向上位机发送数据的过程,其实质是向UCA1TXBUF执行写入操作。
先看看串口的接口,因为接口是复用的,可以作为IO也可以作为外设接口,所以要在P3SEL做一下设置。
接下来看看串口的设置流程,这点这个430的datasheet说的很清楚,我也很推荐这样的datasheet说明方式,不像有的公司,介绍了很多寄存器,但是这个功能怎么用,从开始初始化,设置寄存器,然后启动该应用没有介绍。
这点,应该给MSP430单片机掌声,还有就是TI公司提供了一些简单的例程,可以学习一下,也挺方便大家使用430单片机的,这点蛮好的啊。
这个图片里面的5步就是告诉你怎么设置一个串口,很方便的吧,你只要对照这5步来,就行了。
很方便的。
我们需要完成的工作就是第二步的那句初始化USART寄存器。
接下来看看相关的寄存器吧。
我把程序弄上来,对照程序说比较方便。
1: P3SEL |= 0x30; // 选择P3.4和P3.5做UART通信端口2: ME1 |= UTXE0 + URXE0; // 使能USART0的发送和接受3: UCTL0 |= CHAR; // 选择8位字符4: UTCTL0 |= SSEL0; // UCLK = ACLK(32768HZ)5: UBR00 = 0x03; // 波特率96006: UBR10 = 0x00; //7: UMCTL0 = 0x4A; // Modulation8: UCTL0 &= ~SWRST; // 初始化UART状态机9: IE1 |= URXIE0; // 使能USART0的接收中断第1,2 3 4句程序不解释了,自己看看寄存器就好了,我主要说一下波特率的设置,在串口调试里面这点,都是比较繁琐的,像51还要和相关的定时器配合使用,430单片机不需要定时器配合,只要有UCLK时钟就好了,这里时钟是32768HZ。
在datasheet里面有实例计算,如果你想具体了解,你可以看datasheet。
程序第8,9句都是按照上面串口设置流程来的啊,不多了,也简单。
单片机MSP430与PC机串口通讯设计摘要在多机通信的分布式控制系统中,通过PC机的串口与多台单片机的通信是最方便的。
在这样的分布式控制系统中,单片机与微机之间的多路通信是整个系统的关键。
基于MSP430系列单片机自身优越的性能以与其超低功耗的特点,利用MSP430F149的USART可以实现这种分布式多机通信功能。
在解决了与PC串口或其他带有串口的终端相连所需要的串口电平和逻辑关系的转变之后,选用MSP430F149的异步模式UART,用C语言完成下位机(PC机)接收和发送数据程序,借助VC++6.0开发平台并利用PComm软件包完成上位机(单片机)的通信程序。
文章介绍了美国TI公司新一代16位Flash型MSP430F149系列单片机的结构、特性和功能。
详细介绍了如何利用VC十+6.0进行串口通讯程序的编制,重点介绍了如何利用实现异步通讯的方法。
关键词:MSP430系列单片机,多路通信,控制系统,异步模式,PcommDesign of the Serial Communicationbetween MSP430F149 and PCABSTRACTIn the controlled system of distributing type in which many computers are communicating, by way of the PC string contact with many single chip machines to correspond is the most convenient.In this controlled system of distributing type, the various communication between single chip machines and microcomputer is the whole key. According to the low achievement consume and perfect function of MSP430,The USART that used in system of MSP430F149 can carry out this kind of function of singular to group.It is required to solve the voltage conversionand the change of logic relation, when the MSP430 connects with the PC string or other terminals which take with strings.And then, we can choose the asynchronous module (UART) of MSP430F149 to complete the MSP430F149’s main processor in language of C and write out the PC’s processor asking for help from The VC++6.0 and The Pcomm.This paper introduces the structure, principle and feature of new generation of 16 bit&Flash-type microcontrollerwhich belongs to the Texas Instruments MSP430F149 series. At the same time, it alsointroduces how to carry out the method of theserial communication between PC and MSP430F149. The paper presents how to use VC++6.0 design serial port communicationprogram,especially calling Pcomm functions to control serial port to transfer data.KEY WORDS:MSP430F149single-chip computer, serialcommunication, control system,UART,PComm目录摘要1ABSTRACT2目录3前言4第一章串口通讯的系统组成与原理5§1.1 系统组成与通讯原理5§ 1.1.1 系统构成5§ 1.1.2 通信原理与协议6第二章硬件电路设计11§2.1 接口电平电路设计11§2.1.1 RS-232接口电路设计11§2.2 单片机电路设计14§2.2.1 单片机电路设计图14第三章软件设计16§3.1 功能描述16§3.1.1 上位机和下位机实现的功能16一、功能描述:16§3.2 程序设计16§3.2.1 下位机程序设计16§3.2.2 上位机(PC机)程序设计26结论31参考文献33前言在工业控制领域,由多单片机构成的系统很多,如大规模测控系统、大型车辆控制系统、机器人控制系统等。
MSP430波特率的计算
给定一个BRCLK时钟源,波特率用来决定需要分频的因子N:
N = fBRCLK/Baudrate
分频因子N通常是非整数值,因此至少一个分频器和一个调制阶段用来尽可能的接近N。
如果N等于或大于16,可以设置UCOS16选择oversampling baud Rate模式注:Round():指四舍五入。
Low-Frequency Baud Rate Mode Setting
在low-frequency mode,整数部分的因子可以由预分频实现:
UCBRx = INT(N)
小数部分的因子可以用下列标称公式通过调制器实现:
UCBRSx = round( ( N –INT(N) ) × 8 )
增加或减少UCBRSx一个计数设置,对于任何给定的位可能得到一个较低的最高比特误码率。
如果确定是这样的情况UCBRSx设置的每一位必须执行一个精确的错误计算。
例1:1048576Hz频率下驱动以115200波特率异步通讯
ACLK = REFO = ~32768Hz, MCLK = SMCLK = default DCO = 32 x ACLK = 1048576Hz。
N = fBRCLK/Baudrate = 1048576/115200 = ~9.10
UCBRx = INT(N) = INT(9.10) = 9
UCBRSx = round( ( N –INT(N) )×8 )
= round( ( 9.10 –9) × 8 )=round(0.8 )=1
UCA0CTL1 |= UCSSEL_2;// 选SMCLK为时钟
UCAxBR0 = 9;
UCAxBR1 = 0;
UCAxMCTL = 0x02;//7-4:UCBRFx,3-1:UCBRSx,0:UCOS16
UCBRSx 为寄存器UCAxMCTL的1-3位,所以写入0x02(00000010)
例2:32768Hz频率下驱动以2400波特率异步通ACLK = REFO = ~32768Hz, MCLK = SMCLK = DCO ~1.045MHz
N = fBRCLK/Baudrate = 32768/2400 = ~13.65
UCBRx = INT(N) = INT(13.65) = 13
UCBRSx = round( ( N –INT(N) )×8 )
= round( ( 13.65 –13) × 8 )=round(5.2)=5
UCA0CTL1 |= UCSSEL_1; // 选ACLK为时钟
UCAxBR0 = 13;UCAxBR1 = 0 ;
UCAxMCTL = 0x0A;//7-4:UCBRFx,3-1:UCBRSx,0:UCOS16
UCBRSx为寄存器UCAxMCTL的1-3位,所以写入0x0A(00001010)
Oversampling Baud Rate Mode Setting
在oversampling mode 与分频器设置如下:
UCBRx = INT(N/16)
第一个调制阶段设置如下:
UCBRFx = round( ( (N/16) –INT(N/16) ) × 16 )
当要求更精确时,UCBRSx也可以被设置成0-7。
例1:1048576Hz频率下驱动以9600波特率异步通讯
UCBRx = INT(N/16)=INT(fBRCLK/Baudrate/16)
UCBRx = INT(1048576Hz/(16*9600)) = INT(~6.8)
UCBRFx = round( ( (N/16) –INT(N/16) ) × 16 )
= round( ( 6.8 – 6 ) × 16 )=13
UCAxCTL1 |= UCSSEL_2; // 选SMCLK为时钟
UCAxBR0 = 6; // 1MHz 9600
UCAxBR1 = 0; // 1MHz 9600
UCAxMCTL = 0xD1; //7-4:UCBRFx,3-1:UCBRSx,0:UCOS16
UCBRFx 为寄存器UCAxMCTL的4-7位,UCOS16为0位,所以写入0xD1(11010001) 具体的寄存器值设置在MSP430F5438 User's Guide的。