查看: 495|回复: 0

[经验] msp430学习笔记之uart

[复制链接]

该用户从未签到

发表于 2020-12-6 22:32:27 | 显示全部楼层 |阅读模式
分享到:
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 代码实现

  1. [cpp] view plain copy
  2. //本平台 msp430f149  
  3. #include  

  4. void usart0_config(void){  

  5.     P3SEL |= 0x30;                            // P3.4,5 = USART0 TXD/RXD  
  6.     ME1 |= URXE0 + UTXE0;                     // Enable USART0 T/RXD  
  7.     UCTL0 |= CHAR;                            // 8-bit character  
  8.     UTCTL0 |= SSEL0;                          // UCLK = ACLK  
  9.     UBR00 = 0x03;                             // 32k/9600 - 3.41  
  10.     UBR10 = 0x00;                             //  
  11.     UMCTL0 = 0x4A;                            // Modulation  
  12.     UCTL0 &= ~SWRST;                          // Initialize USART state machine  
  13.     IE1 |= URXIE0;                            // 使能USART0的接收中断  
  14.     _EINT();                                  //开总中断,整个系统中断使能  

  15. }  


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

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

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

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

  27. }  

  28. int main(){  

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

  31.     P2DIR = 0x80;  
  32.     P2OUT = 0xff;  
  33.     while(1){  

  34.     }  

  35.     return 0;  
  36. }  


  37. //usart0 interrupt receive function  
  38. #pragma vector=UART0RX_VECTOR  

  39. __interrupt void usart0_rx (void)  
  40. {     

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

  42.         P2OUT = 0x7f;   

  43.         send_string("led is on");  
  44.     }  

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

  46.         P2OUT = 0xff;  

  47.         send_string("led is off");  


  48.     }  

  49. }  
复制代码

3 实验结果


每次发送0调试助手都可以收到 "led is on"并且led灯亮,发送1时led灯灭,同时调试助手显示"led is off",注意:16进制发送数据
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条



手机版|小黑屋|与非网

GMT+8, 2024-11-25 17:06 , Processed in 0.119282 second(s), 15 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.