MSP430F449寄存器UMCTL0是干嘛用的?
如图!在串口初始化程序里面用到了,但查了不少资料都没有详细的介绍。注释掉了也不影响串口的使用。 本帖最后由 c316348771 于 2014-12-5 09:57 编辑
昨晚自己看资料,这个寄存器是波特率调整用的,在文档中表示为:UxMCTL,但计算公式看得有点懵!求高手指点,附上PDF文件,在第509页 #include<stdio.h>
#include<math.h>
//函数声明
void SetBaudRateRegisters(long clk,int baud);
/************************宏定义***********************/
#define UxBR1 a
#define UxBR0 a
#define UxMCTL a
unsigned char a; //数组模拟寄存器
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<<i);
}
}
}
问题已解决!附上代码,亲测可用
页:
[1]