您的位置:首页 > 其它

msp430学习笔记之uart

2015-07-06 22:06 405 查看

1 相关知识

MSP430系列,usart模块的波特率值设定是通过以下三个参数决定的:UxBR0,UxBR1,UxMCTL
波特率=BRCLK/N 
BRCLK:时钟源,可以通过寄存器设定何为时钟源; 
N:波特率产生的分频因子。N=UxBR1+UxBR0+UxMCTL,其中UxBR1+UxBR0为整数部分,UxMCTL为设定小数部分 。
 
举个例子:波特率=9600,时钟源=32.768kHz
N=32768/9600=3.41
很明显:UxBR1+UxBR0=13,即UxBR1=0,UxBR0=13。
首先把小数部分0.41×8=3.28,取整后为3。这个5的意思就是在UxMCTL中的8位里要有3个1,剩下来的就是怎么分配这3个1的位置了。注意一点
就是这3个1要相对分散点。
因此:UBR00 = 0x03;UBR10 = 0x00;UMCTL0 = 0x4A; 

2 代码实现

     
//本平台 msp430f149
#include<msp430f149.h>

void usart0_config(void){

P3SEL |= 0x30;                            // P3.4,5 = USART0 TXD/RXD
ME1 |= URXE0 + UTXE0;                     // Enable USART0 T/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;                            // 使能USART0的接收中断
_EINT();								  //开总中断,整个系统中断使能

}

//字符发送函数
void send_char(char sendchar){

while (!(IFG1 & UTXIFG0));    			//等待发送寄存器为空
TXBUF0 = sendchar;
}

//字符串发送函数
void send_string(char *ptr){

while(*ptr != '\0'){
send_char(*ptr++);                  // 发送数据
}
send_char('\n');						//发送换行指令

}

int main(){

WDTCTL = WDTPW + WDTHOLD;     //默认MCLK = DCO
usart0_config();

P2DIR = 0x80;
P2OUT = 0xff;
while(1){

}

return 0;
}

//usart0 interrupt receive function
#pragma vector=UART0RX_VECTOR

__interrupt void usart0_rx (void)
{

if( RXBUF0 == 0x00 ){		   //收到0时,led灯亮,并发送 "led is on"

P2OUT = 0x7f;

send_string("led is on");
}

if( RXBUF0 == 0x01 ){			//收到1时,led灯亮,并发送 "led is off"

P2OUT = 0xff;

send_string("led is off");

}

}


 3 实验结果



每次发送0调试助手都可以收到 "led is on"并且led灯亮,发送1时led灯灭,同时调试助手显示"led is off",注意:16进制发送数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  msp430 uart