对MSP430F5438的时钟及uart配置

对MSP430F5438的时钟及uart配置

在使用的过程中,一直认为比较简单,也一直没有深究,忽然这几天卡壳了,出现问题是操作UART发送出的数据给232显示,并不是想得到的数据。这里涉及了两个地方,一是时钟配置,二是对UART的配置。

时钟配置

需求:考虑到功耗及使用场景,MCLK=2M,SMCLK=1M,ACLK=32768

    P7SEL |= BIT0 + BIT1;	//开XT1
    
    __bis_SR_register( SCG0 );                // Disable the FLL control loop
    UCSCTL0 = 0x0000;                         // Set lowest possible DCOx, MODx
    UCSCTL1 = DCORSEL_2;                      
    UCSCTL2 = FLLD_1 + 60;                    // Set DCO Multiplier for 2MHz
    UCSCTL4 = SELM_4 + SELA_0 + SELS_4; //MCLK =MCLK =DCO,ACLK=XT1
    UCSCTL5 = DIVS_1;           //
    __bic_SR_register( SCG0 );                // Enable the FLL control loop
        
  // Worst-case settling time for the DCO when the DCO range bits have been  
  // changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx  
  // UG for optimization.  
  // 32 x 32 x 2 MHz / 32,768 Hz = 62500 = MCLK cycles for DCO to settle  
  __delay_cycles(62500);

    while ( SFRIFG1 & OFIFG ) //??? OFIFG,XT1OFFG ,DCOFFG
    {
        UCSCTL7 &= ~( XT1LFOFFG + DCOFFG );
        SFRIFG1 &= ~OFIFG;
    }

对以上代码关键点的说明:

DCORSEL_2:这个选择是根据需要的频率来确定的,根据不同的选择会提供不出的电压,用来供给输出需要的频率。这里需要生成的频率能包含需要的频率,低了达不到,高了就超过了,在2M的情况下,使用2及3都是可以满足的。

FLLD_1+60:这里是对FLL的分频,默认为2,在设置为1的时候不分频,则直接使用了FLL的频率,默认参考的是REFO,典型值为32768Hz,所以这里的计算可以简化为 (N+1)*32768=2M,此处使用的N为60,值为(60+1) * 32768=1998848

DIVS_1:对SMCLK进行2分频,在上一行中配置了源,默认的也是这样的。

延时

此处来源于源码,并且上面有计算公式,可以参考

以上代码不熟悉的可以查文档,需要修改的部分再进行扩展。如:要改用1048576的频率,将60改为63即可。需要注意的是,这是十进制的值,不是十六进制。

UART

这里参数的配置,可以参阅手册412页的表格,需要计算的也有一个简单的分工。

需要注意的是有一个过采样的说法,即UCOS16,在表格中也对是不是过采样的参数进行了区分。在通常情况下,波特率的分频值不是整数,所以是由分频器和调制器生成。在低频模式下(非过采样),使用BRx和BRSx进行控制;在过采样的模式下,则BRx和BRFx进行控制。

过采样,是为了保证数据正确采用的多次采样处理的一种方式。

最后说一句:我出现的问题,UART中的分频值,一直没在意数字的前面有个0x。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值