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波特率的计算
给定一个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的。