tag 标签: 波特率设置

相关博文
  • 热度 10
    2014-3-25 21:23
    2365 次阅读|
    0 个评论
              当初本来是打算组装一个MSP430F169的芯片的,但是当时手里没有MSP430F169的芯片就装了个MSP430F247的,本来想这两个芯片应该操作都是一样的嘛,毕竟都是都是TI生产的芯片。但是当我开始用的时候我发现,这两个根本就不一样,MSP430F247对寄存器有了从新的定义。       我刚开始学习的时候,买了一本MSP430的书籍,主要讲的是MSP430F169。我就拿着这本书对着学习MSP430F247,看着TI提供的MSP430F247的例程,这样看看了很久都没有看懂,例程和书上的操作都不一样。比如在波特率的设置上,就有很大的差别。 #include “msp430.h” int main(void) {   WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT   if (CALBC1_1MHZ==0xFF)     // If calibration constant erased   {                while(1);                               // do not load, trap CPU!!    }   DCOCTL = 0;                               // Select lowest DCOx and MODx settings   BCSCTL1 = CALBC1_1MHZ;                    // Set DCO   DCOCTL = CALDCO_1MHZ;   P3SEL = 0x30;                             // P3.4,5 = USCI_A0 TXD/RXD   UCA0CTL1 |= UCSSEL_2;                     // SMCLK   UCA0BR0 = 6;                              // 1MHz 9600   UCA0BR1 = 0;                              // 1MHz 9600   UCA0MCTL = UCBRF3 + UCOS16;               // Modln UCBRSx=1, over sampling   UCA0CTL1 = ~UCSWRST;                     // **Initialize USCI state machine**   IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt   __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0, interrupts enabled } // Echo back RXed character, confirm TX buffer is ready first #pragma vector=USCIAB0RX_VECTOR __interrupt void USCI0RX_ISR(void) {   while (!(IFG2UCA0TXIFG));                // USCI_A0 TX buffer ready?   UCA0TXBUF = UCA0RXBUF;                    // TX - RXed character } 上面这段程序就是TI提供的,哪些有颜色的都是搞不懂的地方。。。。。 这个什么要那样写呢?蓝色的我懂,是设置波特率,但是怎么和书上写的不一样的,这就是书寄存器不一样的效果,看半天看不懂,最好我在TI提供的技术手册( 附件msp430f247教程 )里看到了答案(15.3.13 Typical Baud Rates and Errors),MSP430F247的波特率设置。。。。       图1:红框内就是需要设置的波特率包括误差       从上面的程序可以看到:晶振选的1MHZ的,所以当设置波特率9600的时候,就要选择 UCA0BR0 = 6;    UCA0BR1 = 0; 值得注意的是这个程序采用的是过采样模式,使用的是 UCOS16 =1,当然图1也是当 UCOS16 =1 的时候的调整。 图2:波特率调整控制寄存器 图3:头文件中关于 UCBRF3 的设置         当时我红色的是波特率调整控制寄存器,但是我不明白为啥那样设置,通过查看头文件,我知道了 UCBRF3 是在头文件里设置好了的调整参数。在图1中可以看到当晶振1MHZ,、波特率9600的时候,UCBRFx是8,所以通过头文件里定义好的,可以直接设置。                  
  • 热度 18
    2012-10-13 14:45
    1147 次阅读|
    0 个评论
    当今许多实时监测系统与通信设备领域中,经常需要进行远距离的数据传送。为此,如何实现高速、可靠及低成本的数据传输是作为前级机或发送级的8051单片机迫切需要解决的新技术。据此,我们采用由Dallas Semiconductor公司的芯片DSl075--Econ oscillator(高效型振荡器)为8051系列的DS87C520高速型单片机提供时钟的配置设计方案,实现单片机串行通信的高速波特率。 Econ oscillator(高效型振荡器)含有一个内部振荡器,用以产生一个基本频率;还内置了一个分频链,可以将基本频率降低到需要的速度。Econ oscillator 的每种型号提供四种基本频率(60MHz、66.67MHz、80MHz、100MHz),可调节的分频系数最高可达2052。Econ oscillator能根据系统需要配置为任何类型的钟控逻辑,包括单片机(微处理器)、FPGA、CPLD电路等。 8051单片机以及RS-232串行通信 选用时钟时,应认真考虑两个因素,即时钟频率和工作期限内的时钟精度。在8051单片机系统中,时钟频率取决于所采用的串行通信RS-232。例如,考虑一个采用12MHz时钟(早期8051的最高时钟频率)的异步模式1串行通信。表l列出了建立标准波特率所需的定时器1自动重新装载值。 表l中实际波特率是按照以下计算公式得出的:波特率所需的定时器I自动重新装载值。 其中:BaudRate为波特率;SMOD为波特率倍增位;fosc为振荡频率;THl为定时器l自动重新装载值。 表1中数值基于以下定时器 1状态: ·每12个时钟周期定时器增l(单片机DS87C520的定时器可以每4个或12个时钟周期增1)。 ·自动重装载模式。 ·禁止波特率倍增(SMOD=0)。 表l为早期的单片机采用晶体时的波特率和波特率误差。 一般情况下的RS-232串行通信.一旦波特率误差超出3%,尽管数据传送中有起始位或停止位进行同步,就有可能造成通信错误。3%的容许误差使12MHz晶振时的最高通信速率限制在2400波特,这在90年代初还不算坏,但对今天的标准来讲是一个不能忽略的大问题丁。 而现在适应于8051单片机串行通信的晶体:11.059MHz或22.118MHz,已开发出。单片机采用这种晶体后波特率有很大改善,见表2所示。数据传送率可达57.6kps(使DS87C520单片机波特率倍增,当SMOD=1后可达115.2kps),这样高的通信速率—波特率对于当前大多数单片机(或微处理器)系统已是很可观了。随着晶体11.059MHz或22.118MHz产品逐步市场化,使单片机应用糸统大为拓宽。 定时器1自动重装载值 Fosc=11.059MHz时的波特率 Fosc=22.118MHz时的波特率 255 28,799.5 57598.9 254 14399.7 28799.5 253 9599.8 19199.6 250 4799.91 9599.83 244 2399.95 4799.91 232 1199.98 2399.95 208 599.98 119.98 160 299.99 599.99 64 149.99 299.99 注:波特率与规定速率的偏差3%对于时钟精度提出了要求,即便采用专为RS-232串行通信优选的时钟频率,如果时钟频率变化超出3%,仍然会影响到通信的稳定.