【MSP430】UART库函数

发布者:beup001最新更新时间:2020-02-02 来源: eefocus关键字:MSP430  UART  库函数 手机看文章 扫描二维码
随时随地手机看文章

#include

 

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

 * 文件功能描述:   

 *          MSP430F16x,MSP430F14X系列单片机串口通讯函数库(简化版)

 *      说明:  这个程序库完成串口的初始化、发送字符和字符串、接收

 *              使字符功能用方法:把Uart.c加入到项目,同时在要调用

 *              此程序库的程序文件中加入包含Uart.h的语句;这样即可

 *              正常使用头文件中声明的程序了;详细可参考 本工程 和

 *               main.c

 *              如 果要改为UART1模块,只需把宏定义的x 对应的0改为1

 *              即可;如果要同时使用0、1两个模块,就需要把函数的名

 *              字该为不同,两个文件分别访问0、1两个模块

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

 

/******************************寄存器宏定义**************************/

#define UxCTL   U0CTL

#define UxRCTL  U0RCTL

#define UxTCTL  U0TCTL

 

#define UxBR0   U0BR0

#define UxBR1   U0BR1

#define UxMCTL  U0MCTL

 

#define UxRXBUF U0RXBUF

#define UxTXBUF U0TXBUF

 

#define UxME    U0ME

#define UxIE    U0IE

#define UxIFG   U0IFG

 

#define UTXEx   UTXE0

#define URXEx   URXE0

 

#define URXIEx  URXIE0

#define UTXIEx  UTXIE0

 

#define UARTxTX_VECTOR  UART0TX_VECTOR

#define UARTxRX_VECTOR  UART0RX_VECTOR

 

#define UARTON  P3SEL |= 0X30           // P3.4,5 = UART0 TXD/RXD

 

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

 

char TxFlag=1;

char RxFlag=0;

 

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

* 名    称:abs

* 功    能:求绝对值

* 入口参数:i:整数

* 出口参数:int 求得的绝对值

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

int abs(int i)

{

    return (i>=0?i:(-i));

}

 

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

* 名    称:SetBaudRateRegisters

* 功    能:根据时钟 波特率设置对应寄存器

* 入口参数:

*           clk:        所选时钟频率(如:32768)

*           baud:       波特率      (300~115200)

* 出口参数:无

* 范    例: SetBaudRateRegisters(32768,9600)//用时钟频率32768产生9600的波特率

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

void SetBaudRateRegisters(long clk,long baud)

{

    int n = clk / baud;     //整数波特率

    char mSum = 0;          //Σmi

    int txEr0;              //对应位为0时错误率

    int txEr1;              //对应位为1时错误率

    char i = 0;             //循环计数

    

    UxBR1 = n >> 8;         //高8位

    UxBR0 = n & 0xff;       //低8位

    UxMCTL = 0;

    

    //循环 比较错误率大小 设置UxMCTL

    for(;i < 8;i++)

    {

        txEr0 = 100 * baud * ((i + 1) * n + mSum) / clk - 100 * (i + 1);

        txEr1 = 100 * baud * ((i + 1) * n + mSum + 1) / clk - 100 * (i + 1);

        if(abs(txEr1) < abs(txEr0))

        {

            mSum++;

            UxMCTL |= (1<        }

    }

}

 

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

* 名    称:UartInit()

* 功    能:初始化串口。设置波特率等

* 入口参数:

*           baud:       波特率      (300~115200)

            parity:     奇偶校验位  ('n'=无校验  'p'=偶校验  'o'=奇校验)

            datsBits:   数据位位数  (7或8)

            stopBits:   停止位位数  (1或2)

* 出口参数:返回值为1时表初化成功,为0表示参数有错误

* 范    例: UartInit(9600,'n',8,1) //设成9600bps,无校验,8位数据,1位停止位

            UartInit(2400,'p',7,2) //设成2400bps,偶校验,7位数据,2位停止位

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

char UartInit(long baud,char parity,char dataBits,char stopBits)

{

    long int brclk;                 //波特率发生器时钟频率

    

    UxCTL |= SWRST;                 //初始

    

    //时钟源设置

    UxTCTL &=~ (SSEL0+SSEL1);       //清除之前的时钟设置

    if(baud<=9600)                  //

    {

      UxTCTL |= SSEL0;              //ACLK,降低功耗

      brclk = 32768;                //波特率发生器时钟频率=ACLK(32768)

    }

    else

    {

      UxTCTL |= SSEL1;              //SMCLK,保证速度

      brclk = 1000000;              //波特率发生器时钟频率=SMCLK(1MHz)

    }

    

    //------------------------设置波特率-------------------------   

    if(baud < 300||baud > 115200)   //波特率超出范围

    {

        return 0;

    }

    SetBaudRateRegisters(brclk,baud);         //设置波特率寄存器

  

    //------------------------设置校验位-------------------------  

    switch(parity)

    {

        case 'n':case'N': UxCTL &=~ PENA;               break;  //无校验

        case 'p':case'P': UxCTL |= PENA + PEV;          break;  //偶校验

        case 'o':case'O': UxCTL |= PENA; UxCTL &=~ PEV; break;  //奇校验  

        default :         return(0);                            //参数错误

    }

    

    //------------------------设置数据位-------------------------    

    switch(dataBits)

    {

        case 7:case'7': UxCTL &=~ CHAR; break;      //7位数据

        case 8:case'8': UxCTL |= CHAR;  break;      //8位数据

        default :       return(0);                  //参数错误

    } 

    //------------------------设置停止位-------------------------    

    switch(stopBits)

    {

        case 1:case'1': UxCTL &= ~SPB;  break;      //1位停止位

        case 2:case'2': UxCTL |= SPB;   break;      //2位停止位

        default :       return(0);                  //参数错误

    }

    

    UARTON;                     //端口使能

    UxME |= UTXEx + URXEx;      //发送 接收使能

    

    UxIE |= URXIEx + UTXIEx;    // Enable USART0 RX interrupt 

    

    UCTL0 &= ~SWRST;            // Initialize USART state machine

    

    return(1);                  //设置成功

}

 

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

* 名    称:UartLpm

* 功    能:串口收/发等待过程中,将时钟系统的部分时钟该关掉,休眠省电

* 入口参数:无

* 出口参数:无

* 说    明: 若与其他外设的时钟冲突,可注释掉该函数,但会增加功耗。

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

void UartLpm()

{

    if(UxTCTL&SSEL0) LPM3;  //若以ACLK 作时钟,进入LPM3休眠(仅打开ACLK)

    else             LPM0;  //若以SMCLK作时钟,进入LPM0休眠(不关闭SMCLK)

}

 

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

* 名    称:UartWriteChar

* 功    能:向串口写一个字节数据

* 入口参数:c:  待发送的一字节数据

* 出口参数:无

* 说    明: 在等待发送完毕的过程中,CPU会休眠

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

void UartWriteChar(char c)

    while (TxFlag==0) UartLpm();  // 等待上一字节发完,并休眠

    TxFlag=0;                     //

    UxTXBUF=c;

}

 

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

* 名    称:UartReadChar

* 功    能:从串口读取1字节数据

* 入口参数:无  

* 出口参数:收到的一字节数据

* 说    明: 如果串口没有数据,会一直等待。等待过程中,CPU会休眠

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

char UartReadChar()

    while (RxFlag==0) UartLpm(); // 收到一字节?

    RxFlag=0;

    return(UxRXBUF);

}

 

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

* 名    称:UartWriteStr

* 功    能:向串口写一个字符串

* 入口参数:s:要写入的字符串  

* 出口参数:无

* 说    明: 如果没有到 NULL 继续写入字符

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

void UartWriteStr(char *s)

{

    while(*s)

    {

[1] [2]
关键字:MSP430  UART  库函数 引用地址:【MSP430】UART库函数

上一篇:MSP430F5529 上手小例程2
下一篇:160160液晶屏+MSP430F169程序和电路图

推荐阅读最新更新时间:2024-11-17 15:55

Proteus中MSP430与SHT11的IIC通信问题
调了两天,MSP430始终接收不到数据,一直以为是代码的问题,今天无意中看到别人的一片文章,才发现问题出在上拉电阻上。DATA线的上拉电阻不能太大,10k不行,换成了1k就没问题了。mark一下,顺便感谢那位作者,附上他的链接: http://blog.sina.com.cn/s/blog_52f5ded30100bf68.html 附上MSP430代码: 在main里调用: s_connectionreset(); s_write_status(); for(;;) { s_read_temp_and_humi();//读取温度、湿度 } sht11.h: enum {TEMP,HUMI}; #def
[单片机]
MSP430单片机的DCO初始化
1.平台说明MSP430F5438。 2.ACLK选择XT1,频率为32.768K,MCLK和SMCLK选择DCOCLKDIV,频率为8000K。 //辅助时钟ACLK32.768K //系统时钟子系统时钟8000K #include“inc/hw_memmap.h” #include“ucs.h” #include“wdt_a.h” #include“gpio.h” #include“sfr.h” voidmain(void) { //停止看门狗 WDT_A_hold(WDT_A_BASE); //P4.0保持输出状态 GPIO_setAsOutputPin(GPIO_PORT_P4,GPIO_PIN0); //初始化P7.
[单片机]
<font color='red'>MSP430</font>单片机的DCO初始化
MSP430之枚举变量大小
一直都很好奇枚举变量到底是如何让占用存储空间的,网上好多文章都说是占用int字节的大小,但是今天测试了一下,发现不是那么回事。 操作系统:WIN7 64bit IDE:IAR 5.5 实验平台: MP430F4793 先说结论: 实际使用发现枚举变量的大小并不是固定不变的,而是跟随成员的取值范围而变化, 并且枚举变量为2个字节(正好是MSP430字节对齐的大小)时,存储占用反而变小。 下面是编译后的结果: 初始情况: 成员取值范围UINT8足以满足,所以是一个字节; 另外,增加成员并不会改变编译结果 给最后一个成员赋值65535: 此时,成员的取值范至少需要两个字节才能存储,所以可以看到枚举变量的大
[单片机]
<font color='red'>MSP430</font>之枚举变量大小
系统时钟和UART的设置
系统时钟: 在开发版上,不同的器件运行在不同的时钟频率上,如CPU可能运行在400Mhz的频率上、SDRAM、DM9000等内存存储运行在100Mhz~133MHz上、 串口i2c等运行在50Mhz上,而在开发板上只有一个12Mhz的晶振,则我们需要设置两个部分 1、提高时钟频率12Mhz提高到400Mhz,有运用到PLL 2、对400Mhz时钟分频,分为400Mhz、100Mhz~133Mhz、50Mhz。 如图所示: 开发板上分布 怎么设置? 相关设置代码 #define S3C2410_MPLL_200MHZ ((0x5c 12)|(0x04 4)|(0x00)) #define S3C2440_MPL
[单片机]
系统时钟和<font color='red'>UART</font>的设置
在Visual Studio Code上开发单片机程序(基于IAR msp430)
1. 安装iar msp430 软件和vscode。 最基本的了 2. 安装插件 IAR For Visual Studio Code c++(官方的c++插件也就是第一个) 3. 在iar中建立工程,设置必要的内容 4.配置vscode open folder 打开你的project的对应的文件夹。 ctrl shift B 打开命令行 输入iar 会弹出框进行选择。当然是选择第一个,select project 然后下方会出现,这样的栏目可以进行选择我的是默认的选择,也就是平台还有编译器和你的设置。 - 最后也就是build,在terminal中选择 run task 中可以看到build和rebuild的
[单片机]
MSP430F5418的详细解析
1)UCS 时钟如同处理器的心脏,每一个周期就是心脏的一次脉动。以前使用其他处理器时,只需要选择合适频率的晶体,接在XT1和XT2两端,再加两个电容就可以了。而MSP430F5418的时钟系统略显复杂,容易让刚开始接触它的人一头雾水。5418的时钟设置由UCS(Unified Clock System)来管理,使用起来比较灵活,其结构图如下所示。 UCS模块有XT1CLK和XT2CLK两个外部时钟源,以及VLOCLK、REFOCLK和DCOCLK(DCOCLKDIV是DCOCLK的分频输出)三个内部时钟源。其中XT1CLK、REFOCLK和XT2CLK可以作为FLLREFCLK输入到FLL单元来改变DCO的输出。所有这些时钟源
[单片机]
<font color='red'>MSP430</font>F5418的详细解析
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)将数据发送
[单片机]
<font color='red'>MSP430</font>g2553硬件<font color='red'>UART</font>(基于官方例程的修改)
基于MSP430F5438单片机的无线环境检测系统设计
  环境监测是指通过对影响环境质量因素的代表值的测定,确定环境质量(或污染程度)及其变化趋势。随着科技的不断进步,特别是计算机技术和网络技术的不断发展,环境检测由经典的化学分析向仪器与计算机和网络相结合的方式,实现f无线环境的检测。本文中设计了一个无线环境检测系统,以MSP430F5438单片机为控制核心,实际制作一个终端和2个节点,终端能从节点获取节点的环境温度和光照信息,并且节点能够实现中继转发的功能。整个系统采用OOK调制方式,收发都使用一个天线,终端发射信号时。   将欲传输的信息通过串口输出的电平控制本振的开断从而实现OOK调制,后级使用丙类功放发射,接收端节点将天线上的信号进行放大,然后倍压检波,通过自适应比较器解调
[单片机]
基于<font color='red'>MSP430</font>F5438单片机的无线环境检测系统设计
小广播
设计资源 培训 开发板 精华推荐

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

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

更多精选电路图
换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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