对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。