【请教】关于MSP430中的小数波特率问题
为了减小误差,MSP430单片机特别设置了UxMCTL(USART Modulation Control Register)用于匹配波特率的小数部分,为了获得最小误差,TI提供了一种计算方法,是用汇编写的,由于没有学习过MSP430的汇编语言,不知道有些具体的语法细节,想请教一下下面这个语句CMOD .equ ((((256*UARTCLK)/Baudr)–256*(UARTCLK/Baudr))+1)/2
是怎样计算出 时钟/波特率 的小数部分的:
CALC_UMCTL .macro
;
; Modulation Register content: the rounded fraction of
; CMOD = UARTCLK/Baudr is calculated
; Binary format of CMOD: 0.xxxxxxx
; Then the 8 bits of UMCTL are built.
; Inputs: UARTCLK, Baudr ; Frequencies
; Output: CUMCTL ; 8–bit UMCTL register value
;
CMOD .equ ((((256*UARTCLK)/Baudr)–256*(UARTCLK/Baudr))+1)/2
M$00 .equ CMOD+CMOD ; Fraction x 2
.if M$00>127 ; Overflow to integer?
M$10 .equ M$00–128+CMOD ; Yes, subtract 1.000000
C$0 .equ 1 ; UMCTL.0 = 1
.else
M$10 .equ M$00+CMOD ; No, add fraction
C$0 .equ 0 ; UMCTL.0 = 0
.endif
.if M$10>127 ; Overflow to integer?
M$20 .equ M$10–128+CMOD ; Yes, subtract 1.000000
C$1 .equ 2 ; UMCTL.1 = 1
.else
M$20 .equ M$10+CMOD ; No, add fraction
C$1 .equ 0 ; UMCTL.1 = 0
.endif
.if M$20>127 ; Overflow to integer?
M$30 .equ M$20–128+CMOD ; Yes, subtract 1.000000
C$2 .equ 4 ; UMCTL.2 = 1
.else
M$30 .equ M$20+CMOD ; No, add fraction
C$2 .equ 0 ; UMCTL.2 = 0
.endif
.if M$30>127 ; Overflow to integer?
M$40 .equ M$30–128+CMOD ; Yes, subtract 1.000000
C$3 .equ 8 ; UMCTL.3 = 1
.else
M$40 .equ M$30+CMOD ; No, add fraction
C$3 .equ 0 ; UMCTL.3 = 0
.endif
.if M$40>127 ; Overflow to integer?
M$50 .equ M$40–128+CMOD ; Yes, subtract 1.000000
C$4 .equ 10h ; UMCTL.4 = 1
.else
M$50 .equ M$40+CMOD ; No, add fraction
C$4 .equ 0 ; UMCTL.4 = 0
.endif
.if M$50>127 ; Overflow to integer?
M$60 .equ M$50–128+CMOD ; Yes, subtract 1.000000
C$5 .equ 20h ; UMCTL.5 = 1
.else
M$60 .equ M$50+CMOD ; No, add fraction
C$5 .equ 0 ; UMCTL.5 = 0
.endif
.if M$60>127 ; Overflow to integer?
M$70 .equ M$60–128+CMOD ; Yes, subtract 1.000000
C$6 .equ 40h ; UMCTL.6 = 1
.else
M$70 .equ M$60+CMOD ; No, add fraction
C$6 .equ 0 ; UMCTL.6 = 0
.endif
.if M$70>127 ; Overflow to integer?
C$7 .equ 80h ; UMCTL.7 = 1
.else
C$7 .equ 0 ; UMCTL.7 = 0
.endif
CUMCTL .equ C$7+C$6+C$5+C$4+C$3+C$2+C$1+C$0 ; Add bits
.endm
以下是原PDF文件,这段代码在文档的末尾
波特率的设置ourdev_672590UQA2FR.pdf(文件大小:98K) (原文件名:MSP430_UART_波特率计算_UMCTL的设置.pdf) 自己顶下,有哪位高手能回答一下吗…… 我也同求!
好像网上有计算这个量的软件 比如说串口时钟为32768
UBR00 = 0x03; // 32768/9600 - 3.41
UBR10 = 0x00; //
UMCTL0 = 0x4A; // (0.41*8=3.28)取整为3,UMCTL0写入的值有3个1就行(0x4A)0100 1010 帮你顶一下,我也想知道具体是怎么算的 au_business 发表于 2011-9-12 20:44 static/image/common/back.gif
比如说串口时钟为32768
UBR00 = 0x03; // 32768/9600 - 3.41
UBR10 = 0x00; ...
你好!
这是UxMCTL的寄存器
如果按照你的说法的话
最低位的过采样模式使能又怎么理解啊
页:
[1]