打印

msp430学习笔记之uart

[复制链接]
743|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Richardd|  楼主 | 2018-2-25 15:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 代码实现

[cpp] view plain copy
//本平台 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进制发送数据

相关帖子

沙发
dirtwillfly| | 2018-2-25 20:03 | 只看该作者
感谢分享,很详细

使用特权

评论回复
板凳
chuntian2016| | 2018-2-25 22:29 | 只看该作者
usart模块的波特率值设定是通过以下三个参数决定的:UxBR0,UxBR1,UxMCTL,,最主要的还是UxBR0

使用特权

评论回复
地板
vibra2016| | 2018-2-25 23:02 | 只看该作者
N:波特率产生的分频因子。N=UxBR1+UxBR0+UxMCTL,其中UxBR1+UxBR0为整数部分,UxMCTL为设定小数部分 。

使用特权

评论回复
5
fentianyou| | 2018-3-1 21:35 | 只看该作者

使用特权

评论回复
6
xiaoyaodz| | 2018-3-1 21:36 | 只看该作者
这个是msp430f149通用的吗?

使用特权

评论回复
7
febgxu| | 2018-3-1 21:36 | 只看该作者
现在一般都是使用485通信了。

使用特权

评论回复
8
fentianyou| | 2018-3-1 21:37 | 只看该作者
非常详细的资料。

使用特权

评论回复
9
xiaoyaodz| | 2018-3-1 21:37 | 只看该作者
其他的配置有吗?

使用特权

评论回复
10
febgxu| | 2018-3-1 21:37 | 只看该作者
串口的通信稳定度不如485

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

380

帖子

0

粉丝