|
宏定义:是程序具有更好的移植性。
对模块的寄存器进行宏定义,把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<
}
}
}
|
|