ray8_3 发表于 2011-8-30 16:38:49

【请教】关于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)

ray8_3 发表于 2011-9-5 21:30:19

自己顶下,有哪位高手能回答一下吗……

tuzihog520 发表于 2011-9-10 18:14:02

我也同求!
好像网上有计算这个量的软件

au_business 发表于 2011-9-12 20:44:38

比如说串口时钟为32768
UBR00 = 0x03;                           // 32768/9600 - 3.41
UBR10 = 0x00;                           //
UMCTL0 = 0x4A;                            // (0.41*8=3.28)取整为3,UMCTL0写入的值有3个1就行(0x4A)0100 1010

xmeijia 发表于 2011-9-16 19:39:47

帮你顶一下,我也想知道具体是怎么算的

642142533 发表于 2012-4-20 13:51:09

au_business 发表于 2011-9-12 20:44 static/image/common/back.gif
比如说串口时钟为32768
UBR00 = 0x03;                           // 32768/9600 - 3.41
UBR10 = 0x00; ...

你好!
   
    这是UxMCTL的寄存器
       如果按照你的说法的话
          最低位的过采样模式使能又怎么理解啊
页: [1]
查看完整版本: 【请教】关于MSP430中的小数波特率问题