MSP430串口
- 格式:doc
- 大小:56.50 KB
- 文档页数:6
你参考一下别人的代码看看注释很详细#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的模拟SPI串口通信的实现MSP430是德州仪器(Texas Instruments)公司生产的一款微控制器,内置有模拟外设接口和数字外设接口,非常适合用于嵌入式系统的开发。
SPI(Serial Peripheral Interface)是一种同步串行通信协议,常用于微控制器之间的通信。
在基于MSP430的模拟SPI串口通信实现中,我们需要使用MSP430的GPIO(General-Purpose Input/Output)外设模拟SPI通信协议的时序。
以下是基于MSP430的模拟SPI串口通信实现的步骤:1.配置MSP430的GPIO口为输出模式,并将片选信号(CS)、时钟信号(CLK)、主设备输入信号(MISO)设置为低电平,主设备输出信号(MOSI)设置为高电平。
2.配置MSP430的GPIO口中的片选信号(CS)为输出模式,并将其设置为高电平。
3.编写SPI通信的初始化函数,设置SPI的参数,如时钟分频比、数据位长度等。
4.实现SPI通信的发送函数。
将待发送的数据放入发送缓冲区,按照SPI通信协议的时序,通过MSP430的GPIO口将数据逐位发送出去。
5.实现SPI通信的接收函数。
按照SPI通信协议的时序,通过MSP430的GPIO口接收从外设传入的数据,并存储到接收缓冲区。
6.实现SPI通信的片选控制函数。
控制片选信号的输出,使得与其他外设通信时只选中对应的外设。
7.在主函数中调用上述SPI通信的功能函数,进行数据的发送和接收。
需要注意的是,以上步骤仅是基于MSP430的模拟SPI串口通信实现的一般步骤,具体的实现细节还需根据具体的硬件设备和通信协议来进行调整。
总结起来,基于MSP430的模拟SPI串口通信的实现主要包括配置GPIO口、初始化SPI通信参数、实现发送和接收函数,以及控制片选信号的输出等步骤。
通过这些步骤的完成,可以实现MSP430与其他外设之间的SPI串口通信。
单片机MSP430与PC机串口通讯设计一、引言串口通信是指通过串行通信接口进行数据传输的一种通信方式。
单片机MSP430和PC机的串口通信设计可以实现二者之间的数据传输和通信交互。
本文将从串口介绍、硬件设计和软件实现等方面详细介绍该设计。
二、串口介绍串口是一种串行通信接口,常用的有RS232和RS485等。
RS232是一种使用较为广泛的串口通信协议。
RS232接口有三根线,分别为发送线Tx、接收线Rx和地线GND。
该协议规定,发送端与接收端之间的电平差为±3至±15V,其中正电平表示逻辑0,负电平表示逻辑1三、硬件设计1.MSP430硬件设计MSP430是一种低功耗的专用于嵌入式应用的16位RISC微控制器。
它具有丰富的外设资源,包括多个通用输入输出引脚(GPIO)和两个USART (UART)接口。
其中一个USART接口用于将MSP430与PC机连接。
2.PC机硬件设计PC机通过串口连接到MSP430。
首先,需要将PC机的串口RS232转换为TTL电平,即RS232转TTL电平转换器。
其次,将转换后的TTL电平通过杜邦线连接至MSP430的USART接口的Tx和Rx引脚。
四、软件实现1.MSP430软件设计(1)串口初始化:设置数据位长度、停止位、奇偶校验等。
(2)发送数据:将要发送的数据存入发送缓冲区,并使能发送中断。
(3)接收数据:开启接收中断,并将接收到的数据存入接收缓冲区。
(4)中断处理:发送中断和接收中断时,分别从发送缓冲区和接收缓冲区读取数据并发送/接收。
2.PC机软件设计(1)打开串口:设置串口参数,如波特率、数据位长度等。
(2)发送数据:向串口发送数据,可以通过打开的串口进行写入。
(3)接收数据:使用轮询或中断方式读取串口接收到的数据。
五、总结与展望本文详细介绍了单片机MSP430与PC机串口通信设计,主要包括了串口介绍、硬件设计和软件实现。
通过串口通信,MSP430和PC机可以实现数据传输和通信交互,从而满足各种嵌入式应用的需求。
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上。
【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芯片都有硬件异步通讯功能,有一些器件有两个通讯端口,也有少数没有。
没有硬件串口的芯片可以实现软件(模拟)串口。
下面表格为430系列芯片串口的情况。
对于没有硬件串口的芯片也可以实现软件串口,这里先讲硬件串口,后讲软件串口,然后再讲串口的链路实现。
1.串口功能的实现(1)硬件串口 图1是MSP430系列芯片硬件串口的框图。
在该框图中,串口通讯由通讯速度的控制(数据位流的产生)、接收控制、发送控制等三部分构成。
波特率生成部分由时钟输入选择与分频、波特率发生器、调整器、波特率寄存器等组成。
串行通信时,接收与发送以什么样的速率将数据位收进或送出呢,这个速率就由波特率生成构件控制。
图2为其较为详细的结构。
整个模块的时钟源来自内部时钟或外部输入时钟,由SSEL1、SSEL0选择,以决定最终进入模块的时钟信号BRCLK的频率。
时钟信号BRCLK送入一个15位的分频器,通过一系列的硬件控制,最终输出移出与移进两移位寄存器使用的移位位时钟BITCLK信号。
那么这个信号(BITCLK)究竟是怎样产生的呢,从图的下半部分的一个波特率产生例子可以看出,是分频器在起作用。
当计数器减计数到“0”时,输出触发器翻转,送给BITCLK信号。
所以BITCLK信号周期的一半就是定时器(分频计数器)的定时时间。
接收控制部分与发送控制部分分别由两个移位寄存器构成。
接收时,当接收到一个完整数据,产生一个信号(URXIFG0=1),表示接收到完整数据,可以将此数据取走。
而在发送时,当一个数据正在发送过程中,UTXIFG0=1,此时,不能再发送数据,必须等当前数据发送完毕(UTXIFG0=0)时,方可继续发送。
串口接收一般采用中断方式,而发送数据则多采用主动方式。
在本刊的网站(www.eleworld.com)里给出了一段简单的完整通讯程序,实现的功能是将接收的数据原样送回。
(2)软件串口 而对于没有硬件串口的型号,如何实现异步串口功能呢?先分析异步串口的原理。
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时钟。
/*透过串口发送给电脑p1口的状态,格式:aXXXXXXXX.对应的是P1.01234567,9600波特率,*//*实现,透过串口发送给电脑p1口的状态,格式:aXXXXXXXX.对应的是P1.01234567,9600波特率,*/#include<msp430x14x.h>unsigned char start=0,addright=0,flag=0,Dflag=0,Fflag=0,Buffer[30];unsigned i=0, bufferi=0,stop=0,stop1=0,aa[5],ADbit[5],j;/////////////////////////////////////////////////////////////////////////////////////////void Init(void){BCSCTL1&=~0X80; //Xt2 is onBCSCTL2 |=0X88; //SMCLK=XT2P1DIR=0X00;UCTL0 &=~SWRST; //reset swrst and usart0 enableUCTL0 = CHAR; // 8-bit characterUTCTL0 = SSEL1; // U0CLK = SMCLK=TX2URCTL0 = 0x00;UBR00 = 0x41; // 8MHz 9600UBR10 = 0x03; // 8MHz 9600UMCTL0 = 0x54; // 8MHz 9600 modulation 2.67----3ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXDIE1 |= URXIE0; // Enable USART0 RX interruptP3SEL |= 0x30; // enable P3.4,5 USART0 TXD/RXDP3DIR |= 0x10; // P3.4 output directionUCTL1 &=~SWRST; //reset swrst and usart1 enableUCTL1 = CHAR; // 8-bit characterUTCTL1 = SSEL1; // U1CLK = SMCLK=TX2URCTL1 = 0x00;UBR01 = 0x41; // 8MHz 9600,啥呀,一点都不精确,末尾的0可以是0~E的任何,它都发送对的UBR11 = 0x03; // 8MHz/9600=833.333UMCTL1 = 0x4A; // 0.333*8=2.666ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXDIE2 &= ~URXIE1; // Enable USART1 RX interruptP3SEL |= 0xC0; // enable P3.6,7 USART1 TXD/RXDP3DIR |= 0x40; // P3.6 output directionP3DIR |=0X01; // P3.0 output direction to Usart1 for T P3OUT |=0X01;}/////////////////////////////////////////////////////////////////////////////////////////////void delay(unsigned long DELAY){unsigned long i;for(i=DELAY;i>0;i--);}void main(void){int i=0;int Data;int mask;unsigned ADDRESS;WDTCTL=WDTPW+WDTHOLD; //Stop WDTInit(); //UART1 inition_EINT();ADDRESS= 97; //awhile(1){Data=P1IN;TXBUF1=ADDRESS; //命令格式以a开头while ((UTCTL1&0x01)==0); //当发送的标志为0TXBUF1=58; //发送:号while ((UTCTL1&0x01)==0);mask=0x01;//mask=0x80;for(i=0;i<8;i++) ////循环依次检测P1的八位{if(Data&mask){TXBUF1='0'; //发送给电脑该位为0while ((UTCTL1&0x01)==0); //等待发送标志为零}else{TXBUF1='1'; //如果,没有短路,则发送给电脑1while ((UTCTL1&0x01)==0);}mask=mask<<1; //移动位检测8位}TXBUF1=13; //发送回车while ((UTCTL1&0x01)==0);}}。
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。
第7章通用串口的应用7.1 串行通信的基本知识计算机系统与外部的信息交换称为通信。
通信方式主要有并行与串行两种方式。
并行通信是指通信数据的各数据位在多条线上同时被传输,以字或字节为单位并行进行。
并行通信速度快,但用的通信线多、成本高,故不宜进行远距离通信。
串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。
其只需要少数几条线就可以在系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的远距离通信。
根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。
信息只能单向传送为单工;信息能双向传送但不能同时双向传送称为半双工;信息能够同时双向传送则称为全双工。
串行通讯又分为异步通讯和同步通讯两种方式。
同步通信是一种连续串行传送数据的通信方式,一次通信只传送一帧信息。
这里的信息帧与异步通信中的字符帧不同,通常含有若干个数据字符。
它们均由同步字符、数据字符和校验字符(CRC)组成。
其中同步字符位于帧开头,用于确认数据字符的开始。
数据字符在同步字符之后,个数没有限制,由所需传输的数据块长度来决定;校验字符有1到2个,用于接收端对接收到的字符序列进行正确性的校验。
同步通信的缺点是要求发送时钟和接收时钟保持严格的同步。
异步通信中,在异步通信中有两个比较重要的指标:字符帧格式和波特率。
数据通常以字符或者字节为单位组成字符帧传送。
字符帧由发送端逐帧发送,通过传输线被接收设备逐帧接收。
发送端和接收端可以由各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,互不同步。
接收端检测到传输线上发送过来的低电平逻辑"0"(即字符帧起始位)时,确定发送端已开始发送数据,每当接收端收到字符帧中的停止位时,就知道一帧字符已经发送完毕。
图7.1 MAX232典型连接图最常见的串行通信标准有RS232、RS485、SPI和I2C等。
其中RS232和RS485均是美国电子工业协会EIA(Electronic Industry Association)制定的串行物理接口标准。
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。
你参考一下别人的代码看看注释很详细#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。
do{//(2).清除震荡失效标志位。
IFG1 &= ~OFIFG;//OFIFG的宏为0x02,此意是清除振荡器失效标志。
//(3).至少等待50us。
{unsigned char i=0xff;while(i--);}//(4).查看震荡器失效标志位OFIFG是否清0,如果没有清0,//则重复1至4步直到震荡器失效标志位OFIFG清0。
}while((IFG1 & OFIFG));//直到振荡器失效标志清0。
//震荡失效标志清除后表明,高速晶体可以安全起动了。
BCSCTL2 |= SELM_2;//SELM_2的宏为0x1000,这样就起动了高晶体。
/*将片外低速晶体设为子系统时钟。
*///(1)DOC的电阻选择。
BCSCTL1 |= RSEL0+RSEL1+RSEL2;//表示三个都选了,即RSELx=111B。
//(2)DCO频波段选择。
DCOCTL |= DCO0+DCO1+DCO2;//表示三个都选了波段最高。
即DCOx=1110 0000B。
//(3).MODx低5位,调制选择,当DCOx=111B时MODx无效。
/*下面将辅助系统时钟ACLK设为手表晶体32768HZ。
*///ACLK的来源只有片外低速晶体。
且上电默认是片外低速晶体。
//只能设置其分频比,默认最大,DIVAx=00B,分频比为1。
}// /*下面为UARTx初始化过程。
void Uart0Init(){/*下面为UARTx初始化过程(1) 设置SWRST软件复位使能,使UART进入复位状态(2) 初始化所有的UART寄存器(包括UART控制寄存器UxCTL)(3) 设置模块使能寄存器,设置发送使能和接收使能。
(4) 清除软件复柆使能位SWRST(5) 设置中断使能寄存器IEx,使能接收中断使发送中断。
(可以不设置)(未遵守这些步聚可能会导致无法预料的错误。
)相关寄存器有:1. UxCTL,USART控制寄存器。
第7位PENA,奇偶效验使能位。
1使能。
第6位PEV,奇偶效验选择,0奇,1偶。
第5位SPB,停止位数,0,1位;1,2位。
第4位CHAR,数据位设置,0,7位;1,8位。
第3位LISTEN,1使能自己发自己收。
第2位SYNC,0,UART模式;SPI模式。
第1位MM,0,多机通讯空闲线路模式;1.地址位控制模式。
第0位SWRST,软件复位使能,0使能,1不使能。
2. UxTCTL,USART发送控制寄存器。
第7位Unused,第6位CKPL,外部时钟反向使能,0不使能。
第5-4位SSELx,时钟源选择。
01B,ACLK。
第3位URXSE,接收使能(多机通讯),多机通讯时,相当于51单片机中的SM2。
第2位TXWAKE,发送唤醒(多机通讯),0表数据,1表示地址(唤醒对方),相当51单片机中的TB8。
第1位Unused,第0位TXEPT,发送完成标志位,1完成。
3. UxRCTL, USART接收控制寄存器。
第7-4位,错误标志位。
第3位URXEIE,发送错误中断使能。
1.有错误也置位接收中断标志。
第2位URXWIE,接收唤醒中断使能。
1.只有接收到地址才置位接收中断标志。
第1位RXWAKE,唤醒使能(多机通讯),0表数据;1为地址(被唤醒),相当51单片机中的RB8。
第0位RXERR,有错标志位,相当于7-4位或的结果。
4. UxBR0, USART波特率设制寄存器0。
5. UxBR1, USART波特率设制寄存器1。
6. UxMCTL, USART调制波特率设制寄存器(能实行小数波待率)。
7. UxRXBUF, USART接收缓存。
8. UxTXBUF, USART发送缓存。
9. ME1,模块使能寄存器1。
第7位,USART0发送使能。
第6位,USART0接收使能。
第5-0位,其它用途。
10.ME2,模块使能寄存器2。
第7-6位,其它用途。
第5位,USART1发送使能。
第4位,USART1接收使能。
第3-2位,其它用途。
第1位,USART0发送使能。
第0位,USART0接收使能。
11.IE1,中断使能寄存器1。
12.IE2,中断使能寄存器2。
13.IFG1,中断标志寄存器1。
14.IFG2,中断标志寄存器2。
16.GIE,全局中断使能位(SR寄存器中)。
*//*UART初始全过程*/P3SEL |= 0x30;//P3.5/URXD0,P3.4/UTXD0。
//外设模块功能选择。
//(1) 设置USART控制寄存器U0CTL,SWRST软件复位使能,使UART进入复位状态//U0CTL |= PENA+PEV+CHAR+SWRST;//1101 0001B。
偶校验,8位数据。
SWRST默认1不必设置。
U0CTL |=CHAR;//(2) 初始化所有的UART寄存器(包括UART控制寄存器UxCTL)U0TCTL |= SSEL0;//TXEPT默认为1,不用设置。
//3.U0RCTL默认设置即可。
//4. U0BR0, USART波特率设制寄存器0。
//5. U0BR1, USART波特率设制寄存器1。
//6. UxMCTL, USART调制波特率设制寄存器(能实行小数波待率)。
U0BR0 = 0x03;//32768/9600=3.41。
U0BR1 = 0x00;//整数部分为3。
UMCTL0 = 0x56;//小数部分为4。
//(3) 设置模块使能寄存器,设置发送使能和接收使能。
ME1 |= UTXE0 + URXE0;//使能USART0发送和接收。
//(4) 清除软件复柆使能位SWRSTUCTL0 &= ~SWRST;//(5) 设置中断使能寄存器IEx,使能接收中断使发送中断。
IE1 |= URXIE0;//只允许接收中断。
不允许发送中断。
}//发送一个字节。
void SendData(unsigned char Data){TXBUF0=Data;//数据进入发送缓冲。
//UTXIFG0发送中断标志位。
while (!(IFG1 & UTXIFG0));//等待发送完成。
//不用清除发送完成标志位。
下次写一个字节将自动清除。
}//发送一个字符串。
void SendString(unsigned char *Str){while(*Str!='\0')SendData(*(Str++));}void main(void){/*WDTCTL看门狗定时器寄存器,对该寄存器操作时,高字节WDTPW 必须写入5AH,否则会引起PUC复位信号,WDTHOLD的宏为0x80,即WDTHOLD=1表示停止看门狗定时器*/WDTCTL = WDTPW + WDTHOLD; // 关器看门狗WDTCTL看门狗定时。
//系统基础时钟设置。
BasicClockSet();//UARTx初始化。
Uart0Init();//开全局中断。
_BIS_SR(GIE);SendString("开始接收...\n");//进入低功耗3模式。
_BIS_SR(LPM3_bits);while(1)if((IFG1 & URXIFG0)){SendString("我收到一个:");SendData(RxData);SendData('\n');//发完后进入低功耗模式3。
_BIS_SR(LPM3_bits);}}//进入中断将从中断中唤醒。
//下面是中断服务程序的格式。
#pragma vector=UART0RX_VECTOR//UART0RX_VECTOR为接收中断向量。
__interrupt void usart0_rx (void){LPM3_EXIT;//退出低功耗模式。
RxData=RXBUF0;//读接收缓冲区,取走数据。
}。