搜索
bottom↓
回复: 5

【请教】关于MSP430中的小数波特率问题

[复制链接]

出0入0汤圆

发表于 2011-8-30 16:38:49 | 显示全部楼层 |阅读模式
为了减小误差,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 [Hz]
; 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)

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2011-9-5 21:30:19 | 显示全部楼层
自己顶下,有哪位高手能回答一下吗……

出0入0汤圆

发表于 2011-9-10 18:14:02 | 显示全部楼层
我也同求!
好像网上有计算这个量的软件

出0入0汤圆

发表于 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

出0入0汤圆

发表于 2011-9-16 19:39:47 | 显示全部楼层
帮你顶一下,我也想知道具体是怎么算的

出0入0汤圆

发表于 2012-4-20 13:51:09 | 显示全部楼层
au_business 发表于 2011-9-12 20:44
比如说串口时钟为32768  
UBR00 = 0x03;                             // 32768/9600 - 3.41
UBR10 = 0x00; ...

你好!
   
    这是UxMCTL的寄存器
       如果按照你的说法的话
          最低位的过采样模式使能又怎么理解啊

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-28 12:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表