1436|0

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

MSP单片机的USART模块程序实现 [复制链接]

宏定义:是程序具有更好的移植性。
对模块的寄存器进行宏定义,把0/1换成x,使用时,只需更改宏定义即可更改程序是使用哪个模块;这样程序就具有了比较好的移植性。


/***********************************宏定义*********************************/
#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 UARTON  P3SEL |= 0X30           // P3.4,5 = USART0 TXD/RXD
/**************************************************************************/
程序改为UART1时,只需把宏定义中的0改为1  UARTON改为对应端口的即可
异步串口初始化(UartInit):完成波特率,停止位以及其他相关的设置。
串口初始化,首先是波特率寄存器值的计算和设置:本程序选用第二种:通过运算,选取误差最小的寄存器所需值进行设置。


波特率寄存器值根据所选时钟频率和所需波特率值进行设置,计算方法:从m0(UxMCTL最低位)开始计算,根据这一位的误差(0或1时)误差较小的bit值,直到计算完成。


为了更好的写这个程序,我先用C语言写了一个简单的波特率计算软件,为了让设置波特率的函数能够在单片机程序中复用,程序用宏定义模拟的MSP430单片机的波特率寄存器。完整程序如下:


#include
#include


//函数声明
void SetBaudRateRegisters(long clk,int baud);


/************************宏定义***********************/
#define UxBR1    a[0]
#define    UxBR0    a[1]
#define    UxMCTL    a[2]


unsigned char a[3];                     //数组模拟寄存器
void main()
{
    long clk;                           //时钟
    long baud;                           //波特率
    printf("\t---波特率计算软件!---\n");
    printf("\n请输入时钟频率(Hz):");
    scanf("%ld",&clk);                    
    printf("\n请输入波特率:");
    scanf("%ld",&baud);
    getchar();                          //读取多余回车符


    SetBaudRateRegisters(clk,baud);     //设置寄存器值


    //显示寄存器值
    printf("\nUxBR1:0x%x\tUxBR0:0x%x\tUxMCTL:0x%x\n",UxBR1,UxBR0,UxMCTL);
   
    getchar();
}


/****************************************************************************
* 名    称: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<
        }
    }
}

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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