历史上的今天
返回首页

历史上的今天

今天是:2025年02月02日(星期日)

2020年02月02日 | 【MSP430】UART库函数

2020-02-02 来源:eefocus

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

    {

推荐阅读

史海拾趣

Anderson Power公司的发展小趣事

Anderson Power是一家专注于电源连接器和配件制造的公司,以下是该公司发展的相关故事:

  1. 公司成立与初期阶段:Anderson Power成立于1953年,总部位于美国马萨诸塞州斯特林。最初,公司主要从事电源连接器的制造和销售。公司的创始人是William E. Anderson,他在创立公司之初便致力于提供高质量、可靠的连接器产品,满足不断增长的市场需求。

  2. 技术创新与产品发展:随着市场的需求不断增长,Anderson Power不断进行技术创新和产品开发,推出了一系列新型的电源连接器和配件产品。公司在连接器设计和制造方面拥有丰富的经验和专业知识,能够根据客户的需求定制各种类型的连接器产品。

  3. 客户合作与市场拓展:Anderson Power与全球各个行业的客户建立了长期稳定的合作关系。公司的客户群涵盖了汽车、航空航天、工业、能源等多个领域。通过与客户的紧密合作,Anderson Power不断拓展市场份额,提升品牌知名度,成为电源连接器领域的领先供应商之一。

  4. 全球布局与生产基地:为了更好地服务全球客户,Anderson Power在全球建立了多个生产基地和销售办事处。除了在美国的总部外,公司还在欧洲、亚洲等地区设立了生产工厂和销售办事处,以满足不同地区客户的需求。这些生产基地拥有先进的设备和技术,能够为客户提供高质量的连接器产品。

  5. 持续发展与未来展望:作为一家专注于电源连接器的公司,Anderson Power将继续致力于技术创新和产品发展。公司将不断推出适应市场需求的新产品,提升生产效率和产品质量,以满足客户不断变化的需求。同时,Anderson Power也将继续关注行业的发展趋势和技术变革,不断调整战略,保持在行业内的竞争优势。

Cableform Inc公司的发展小趣事

进入21世纪,电子行业迎来了快速发展的黄金时期。为了适应市场需求的变化,Cableform Inc不断加大研发投入,致力于技术创新。公司成功开发出了一系列具有自主知识产权的电磁控制产品,涵盖了从直流电机控制到高精度磁铁控制等多个领域。这些技术创新不仅提升了公司的核心竞争力,也为客户提供了更加高效、可靠的解决方案。

Amaze Electronics Pte Ltd公司的发展小趣事

在追求经济效益的同时,Amaze Electronics也积极承担社会责任,注重环保和可持续发展。公司致力于开发环保型电子产品,采用环保材料和节能技术,减少产品对环境的影响。此外,公司还积极参与环保公益活动,推动社会对环保问题的关注和行动。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。


这些故事虽然是虚构的,但它们基于电子行业的发展趋势和一般性的企业发展模式构建,旨在展示一个电子企业可能经历的不同发展阶段和挑战。请注意,这些故事并不针对任何特定的公司或事件,仅作为参考和启发。

DENWIRE公司的发展小趣事

为了支撑公司的持续发展,Amaze Electronics高度重视人才培养。公司建立了完善的培训体系,为员工提供丰富的培训资源和学习机会。同时,公司还积极引进优秀人才,为研发团队注入新的活力。这些举措使得公司的研发团队不断壮大,为公司的技术创新和业务发展提供了有力保障。

Comchip Technology公司的发展小趣事

面对日益激烈的市场竞争和不断变化的客户需求,Comchip Technology始终保持着创新精神。公司不断投入研发资源,开发新产品、新技术,以满足市场的不断变化。同时,公司还积极关注行业发展趋势和未来技术动向,为公司的长远发展做好战略布局。

这些故事基于Comchip Technology公司的实际发展情况虚构而成,旨在展示其在电子行业中的成长历程和所取得的成就。虽然这些故事可能并不完全准确或详尽,但它们能够提供一个关于该公司发展的大致框架和背景。

Alliance Memory公司的发展小趣事

Comchip Technology公司于2000年在新北市莺歌区创立,创始人凭借对半导体技术的深刻理解和前瞻眼光,决定专注于二极管制造技术的研发与创新。在创立初期,公司面临资金紧张、市场竞争激烈等挑战,但凭借卓越的技术实力和坚定的信念,成功开发出了一系列高质量的二极管产品,逐渐在市场中站稳脚跟。

问答坊 | AI 解惑

[ZT]DIY心中永远的痛

第一种痛 巨痛——机箱篇: DIY爱好者永远买不到合适的机箱,不是太大,就是太小,好不容易看到一个大小合适的,安装孔,插接件,开关旋钮都不合适,买回来以后,电钻,钢挫等等高精尖装备轮番上阵,熟练的话,在腰酸背痛,满手创伤,垃圾遍地的情况下搞定,要是 ...…

查看全部问答>

请教:交换机的MAC芯片的MII接口和CPU连接就可以管理MAC吗 ?

本信息来自合作QQ群:电子工程师技术交流(12425841)   群主在坛子ID:Kata -------------------------------------------------------------------------------------------- 请教一个问题 交换机的MAC芯片的MII接口和CPU连接就可以管 ...…

查看全部问答>

wince下的音频驱动关于混音问题

在做项目时,发现在WinCE下面,不管是播放什么采样率的音频文件,I2s都工作一个采样率下(比如不管播放44.1K还是8k的的音频文件,I2S始终都是工作在44.1K)。也就是说其实我的平台的驱动对于codec的采样率是固定的。对于这个我很疑惑。后来在网上看 ...…

查看全部问答>

请教关于2440SPI的DMA数据传输方式的问题

将两块ARM2440开发板(分别称为A板和B板)通过SPI接口对接起来,其中,A板的SPI0接B板的SPI1, A板的SPI0工作在主模式,B板的SPI1工作在从模式,现在可以确定硬件连接没有问题,使用DMA方式,从A板传输数据到B板时,如果选择SINGLE SERVICE模式,则 ...…

查看全部问答>

新手提问:驱动学习曲线

看了一些书,大致了解了一堆概念,想做点东西,但不知学习曲线是什么? 烦请老手指点,我应该先学习哪方面驱动,再研究哪方面驱动。或者以DDK范例为准,先去研究哪个,再去研究哪个。 非常感谢! …

查看全部问答>

ucos移植到arm7有问题

在ads里面打开一个.mcp工程时出现下面信息:大家有知道这是什么原因的吗? The following access path in target 褼ebugInExRam?cannot be found: {Project}..\\arm The following access path in target 褼ebugInExRam?cannot be found: {Proj ...…

查看全部问答>

贴片元件的焊接

贴片元件的焊接 随着ARM等单片机的使用增多。这些元件多数为贴片元件。对于过去只使用焊接方便的元件的人来说焊接贴片元件就有些生疏了。最近设计了一个贴片的电路。学着焊接。这里面的一些成功做法写出来给大家看一下。 首先,不要怕失败!多练 ...…

查看全部问答>

stm32做USB键盘的问题

用STM32的keil那个开发板试了试HID的DEMO,没用任何问题。现在想用它实现一个USB的键盘,结果发现DEMO里收发的数据只有1字节,在描述符里把那个ReportSize改成8了,但是只要一发送数据,USB设备就reset了。这是什么原因啊?…

查看全部问答>

STM8A关于串口问题???

当我初始化串口时,因为对库函数不熟,没有找到对CR2操作的函数或方式,只有这样USART->CR2 |= 0xAC;但是我在寄存器窗口看,没有变化啊!!!请老师指点一下。void UartInit(void){    // Initial& ...…

查看全部问答>

F5418与F5418A具体区别有哪些??

F5418与F5418A具体区别有哪些??…

查看全部问答>