MSP430g2553硬件UART(基于官方例程的修改)

发布者:Yudie最新更新时间:2020-03-11 来源: eefocus关键字:MSP430g2553  硬件UART  官方例程 手机看文章 扫描二维码
随时随地手机看文章

一开始官方例程的UART_Keyboard在电脑上老是运行不了,于是就自己上网学习了一下UART实现的具体过程,修改了一下官方的例程代码,在这里记录一下

其实官方例程有时候运行不起在于:

1.波特率设置

2.官方的Rx中断处理函数并不适用于所有串口调试程序

3.注意跳线帽!!!RX接TX,TX接RX!!


官方例程的UART程序流程

这里我用onenote大致画了一下

对于Tx和Rx中断:

当单片机内部的Rx_buf寄存器(一般来说8bits)收到了无符号字符型数据时,就会产生Rx中断,系统调用Rx中断处理函数,也就是说当收到一个字符串型数据时系统会产生多次Rx中断。

当单片机内部的Tx_buf寄存器(也是8bits)将数据发送完毕时,会产生Tx中断,同理,当发送一个字符串型数据时系统会产生多次Tx中断。

对于FIFO:

也就是申明的存储字符型数据的字符数组

RxFIFO用来读取Rx_buf传来的字符型数据,并供给CPU进行读取

TxFIFO用来存放CPU准备发送的数据,并让Tx_buf进行读取

所以每个FIFO要用三个变量来表示:读指针位置,写指针位置,已有的容量大小

在这里插入图片描述

代码分析

main.c

可以看出来主函数只起到了关闭看门狗的作用,精华都在初始化UART函数中



int main(void)

{

 WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer

 USCI_A0_init();

}


USCI_A0_init()

void USCI_A0_init(void){

    //配置时钟

      DCOCTL = 0;                               // Select lowest DCOx and MODx settings

      BCSCTL1 = CALBC1_1MHZ;                    // Set DCO 实际时钟频率1048576Hz

      DCOCTL = CALDCO_1MHZ;

      //配置GPIO寄存器

      P1SEL = BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD

      P1SEL2 = BIT1 + BIT2 ;                    // P1.1 = RXD, P1.2=TXD

    //配置串口寄存器

      UCA0CTL1 |= UCSSEL_2;                     // SMCLK

      UCA0BR0 = 104;                            // 1MHz 9600

      UCA0BR1 = 0;                              // 1MHz 9600

      UCA0MCTL =UCBRS_0;//UCBRS0;               // Modulation UCBRSx = 1

      UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**

     //开中断

      IE2 |= UCA0RXIE+UCA0TXIE; //使能TX,RX中断

      _enable_interrupts();

     //设置单片机工作模式

      _bis_SR_register(LPM0_bits); //单片机工作在LPM0功耗模式

 }


在这里有几个比较重要的寄存器需要说明:

UCA0CTL1:

时钟源选择和软件复位使能

UCSSEL_2:时钟源一般可以选择ACLK和SMCLK(官网例程选择了ACLK,这里选择SMCLK)

至于软件复位的那位UCSWRST:0被禁用。USCI复位被释放用于运行。1被启用。USCI逻辑保持在复位状态。意思就是说在单片机复位之后 如果 此位是0 那么串口可以正常工作 为1 即保持 复位状态 复位状态后 此位为1 就是说 复位后如果不清零 那么串口是不会工作的


UCA0BR0,UCA0BR1

波特率配置寄存器

给定一个BRCLK时钟源,波特率用来决定需要分频的因子N:

N = fBRCLK/Baudrate

分频因子N通常是非整数值,因此至少一个分频器和一个调制阶段用来尽可能的接近N。

所以:

UCA0BRX用来存放N的整数部分,其中BR0存放低位,BR1存放高位(这里的SMCLK时钟源频率大概为32khz)


UCA0MCTL

波特率调整控制器

有整数部分时不够的,还要有小数部分!

UCBRSx = round( ( N – INT(N) ) × 8 )

注意这个寄存器的最后一位时用来选择模式的!!我们这里用0模式!

给出一个计算列题:

例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)


定义中断处理函数

//====================================中断处理函数============================================

//TX中断处理函数

#pragma vector=USCIAB0TX_VECTOR

__interrupt void USCI0TX_ISR(void)

{

//    while(!(IFG2 & UCA0TXIFG));  //待发送为空

    IFG2&=~UCA0TXIFG;     // 手动清除标志位,标志位置零

    UART_OnTx();          // 调用Tx事件处理函数

}

//RX中断处理函数

#pragma vector=USCIAB0RX_VECTOR

__interrupt void USCI0RX_ISR(void)

{

//  while (!(IFG2&UCA0TXIFG));                // 等待发送完成

   IFG2&=~UCA0RXIFG;                // USCI_A0 TX buffer ready?

   UART_OnRx();                      //!!!!!!!EVENT.H函数!

//  UCA0TXBUF = UCA0RXBUF;                    // TX -> RXed character

}


这里改写了一下中断处理函数,想要试一试配置成功与否的话可以直接在Rx中断里面写:UCA0TXBUF = UCA0RXBUF;收到啥发啥


/******************************************************************************************************

 * 名       称:UART_OnRx()

 * 功       能:UART的Rx事件处理函数

 * 入口参数:无

 * 出口参数:无

 * 说       明:对接收到的数据,区别对待进行处理

 * 范       例:无

 ******************************************************************************************************/

void UART_OnRx()

{

    unsigned char Temp=0;           //定义读取的RX_buf中的8bits数

    Temp=UCA0RXBUF;                 //读取RX_buf中的数据

    //判断RXBUF中的收到的数据 1:回车,匹配数据 0:不是回车,放入FIFO中

    if(Temp==0x0d)                  //如果是回车

    {

        if(Rx_FIFO_DataNum>0)       //如果已经收到数据

        {

            Command_match();        //判断指令

//            Rx_FIFO_Clear();        //读取完一次指令,清零

        }

        else{

            UART_SendString(String1);       //没收到任何数据

        }

    }

    else                            //收到的不是回车,则读取数据

    {

        Rx_FIFO_WriteChar(Temp);    //写入数据到FIFO中

    }

}


/******************************************************************************************************

 * 名       称:UART_OnTx()

 * 功       能:UART的Tx事件处理函数

 * 入口参数:无

 * 出口参数:无

 * 说       明:Tx_FIFO里有数据就将数据移到Tx Buffer寄存器中去

 * 范       例:无

 ******************************************************************************************************/

void UART_OnTx(void)

{

 unsigned char Temp;

 if(Tx_FIFO_DataNum>0)           //数据量==0为结束条件

 {

  Tx_FIFO_ReadChar(&Temp); //调用FIFO库函数,返回8bit数据

  UCA0TXBUF= Temp;            //

 }

}


全部的项目就上传到CSDN上好了,不一一打下来了

关键字:MSP430g2553  硬件UART  官方例程 引用地址:MSP430g2553硬件UART(基于官方例程的修改)

上一篇:MSP430F149单片机实现uart数据接收中断
下一篇:MSP430之枚举变量大小

推荐阅读最新更新时间:2024-11-07 09:04

MSP430G2553与MSP430F5336系列单片机总结[4]——比较器B的使用
比较器B是什么,顾名思义,它其实就是用来比较模拟电压+输入端和-输入端的电压大小,然后设置输出信号CBOUT的值的,如果 + 端电压高于 - 端电压,则CBOUT置高,否则置低。主要的控制寄存器有CBCTL0,CBCTL1,CBCTL2,CBCTL3,CBINT,CBIV,在MSP430G2553中没有比较器B,但是F5336中有,所以接下来的代码全都是F5336的比较器B使用程序: 1.比较器B输入通道CB0接外部模拟输入信号,并且引至比较器+输入端,内部参考电压发生器利用共享电压源产生2.0V参考电压。最后当CB0输入模拟信号电压高于2.0V时,CBOUT输出高电平,当CB0输入模拟信号电压低于2.0V时,输出低电平
[单片机]
MSP430G2553切换点亮LED
最近初学MSP430G2553,和大家一起分享学习中遇到的问题和学习成果。今天和大家分享的是一段通过按键P1.3循环切换点亮两个板子上的LED。 #include msp430.h /* * main.c */ int main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer P1DIR |=BIT6; //LED2——P1.6设为输出 P1OUT &=~BIT6; //初始化P1.6为低电平,LED2灭 P1DIR |=BIT0; //LED1——P1.0设为输出 P1OUT
[单片机]
MSP430G2553 1602显示字符
在网上查了 好多 ;好多都说下载进去就好用 然并卵 这个就写给自己以后看吧 不是很规范 仅供参考吧 下载进去应该就可以 但是3.3V供电的情况下很暗 还有2553毕竟就真么几个IO口 如果条件允许的话 可以这么浪费 这个代码数据端口是用P1传送的 但是P1端口 有各种常用的其他功能 所以实在要用的话 用P2作为数据口 比较好 把代码的中的端口改一下就可以了 不过 忠告一下:一定去手册里面仔细看看IO的配置 虽然这个程序中问题不大 先直接附上代码: # include msp430G2553.h # define uchar unsigned char # define uint unsigned int # defi
[单片机]
MSP430G2553测试程序(串口程序,定时器模式)
// // // MSP430G2xx3 // ----------------- // /|| XIN|- // | | | // --|RST XOUT|- // | | // | CCI0B/TXD/P1.1|-------- // | | 9600 8N1 // | CCI0A/RXD/P1.2| -
[单片机]
launchpad MSP430G2553 软件UART硬件UART及跳帽的设置
缘起 在使用launchpad MSP430G2553的板子之前,我用了launchpad MSP430G2452的板子。令我感到头疼的是,本来我想用launchpad串口通信做一个简单地可以通过超级终端和电脑交互的项目,但结果是launchpad MSP430G2452 并没有完整的UART模块,所谓的串口通信是通过定时器A和软件代码配合所产生的软件UART,于是恼火的我放弃了launchpad MSP430G2452 又拿来了一块launchpad MSP430G2553 因为之后我知道它具有完整的硬件UART。 问题的产生 拿到launchpad MSP430G2553 后我发现板子的P1.1和P1.2 引脚并没有标注T
[单片机]
launchpad <font color='red'>MSP430G2553</font> 软件<font color='red'>UART</font>和<font color='red'>硬件</font><font color='red'>UART</font>及跳帽的设置
MSP430G2553的引脚功能详细图解
  德州仪器(TI)MSP430系列超低功耗微控制器包含多种器件,它们特有面向多种应用的不同外设集。这种架构与5种低功耗模式相组合,专为在便携式测量应用中延长电池使用寿命而优化。该器件具有一个强大的16位RISCCPU,16位寄存器和有助于获得最大编码效率的常数发生器。数字控制振荡器(DCO)可在不到1µs的时间里完成从低功耗模式至运行模式的唤醒。MSP430G2553应用非常广泛。   MSP430G2x13和MSP430G2x53系列是超低功耗混合信号微控制器,具有内置的16位定时器、多达24个支持触摸感测的I/O引脚、一个多用途模拟比较器以及采用通用串行通信接口的内置通信能力。此外,MSP430G2x53系列成员还具有一
[单片机]
<font color='red'>MSP430G2553</font>的引脚功能详细图解
MSP430G2553与MSP430F5336系列单片机总结[0]——概述
最近用了MSP430系列的两款单片机,一块是MSP430G2553,市面上有卖,管脚和功能比较少,但是网上的例程和资料很多,比较适合MSP430系列的单片机上手;另一块F5336系列有引脚和功能都较多,是我们自己买芯片做的,外部时钟XT1接了32768HZ的晶振,XT2接了20Mhz的晶振,因为项目需要先后接触了这两块板子,对于MSP430系列的编程也有了一定的了解,所以简单总结一下。 先简单说一下我对MSP430系列单片机的理解,不同的单片机各有其特色,51适用范围比较广泛,Arduino容易上手编程简单,而MSP430最大的特点就是低功耗,适用于一些有特定要求的工业领域,它的内部有不同的时钟源选择,与其对应也有不同的低功耗
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved