DSP

MSP430G2553 串口通信

2019-07-13 18:44发布

MSP430G2553   串口通信    记下来 加深一下自己的理解 希望 有新手看到可以有点启发   记录下来自己的点点滴滴  终于感觉自己有那么一点进步了   哈哈  未来的日子在努力一些  一个菜鸟的独白  哈哈哈 直接一点一点的记录下来的这个代码中我学习到的每一点  代码功能:TI官方例程 :PC机向单片机发送字符 然后单片机回发到PC机 就是这么一个简单的代码 我居然。。。。。。。。。。。。。。。。。。。。。。。。。。。。下面逐一的解释一下每一条语句的功能  附上代码://****************************************************************************** // MSP430G2xx3 Demo - USCI_A0, 9600 UART Echo ISR, DCO SMCLK // // Description: Echo a received character, RX ISR used. Normal mode is LPM0. // USCI_A0 RX interrupt triggers TX Echo. // Baud rate divider with 1MHz = 1MHz/9600 = ~104.2 // ACLK = n/a, MCLK = SMCLK = CALxxx_1MHZ = 1MHz // // MSP430G2xx3 // ----------------- // /|| XIN|- // | | | // --|RST XOUT|- // | | // | P1.2/UCA0TXD|------------> // | | 9600 - 8N1 // | P1.1/UCA0RXD|<------------ // // D. Dang // Texas Instruments Inc. // February 2011 // Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10 //****************************************************************************** #include 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; P1SEL = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD P1SEL2 = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD UCA0CTL1 |= UCSSEL_2; // SMCLK UCA0BR0 = 104; // 1MHz 9600 UCA0BR1 = 0; // 1MHz 9600 UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1 UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine** IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt //_EINT(); __bis_SR_register(LPM0_bits + GIE); // Enter LPM0, interrupts enabled } #pragma vector=USCIAB0RX_VECTOR __interrupt void USCI0RX_ISR(void) { while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready? UCA0TXBUF = UCA0RXBUF; // TX -> RXed character } 1:首先说一下  G2553串口需要注意的一些事项吧    (1):硬件上的连接  跳线帽要改成HW 而不是SW 注意在板子上仔细找一下可以看到SW和HW的字样 (2):使用外部晶振32768的时候  不能超过9600的波特率  使用内部DCO的时候 可以高起来 但是注意波特率计算        的寄存器不要小于3   切记  波特率超过9600的时候 板子自带的下载电路 已经不支持了  必须外接串口电路  2:介绍一下一个串口代码的简单过程: 1:选择你需要的时钟源 用外部晶振32768还是  内部的DCO  如过选择内部DCO  需要验证一下矫正数据是否被擦除 2:配置  TX  RX的引脚   3:下面开始配置和串口有关的寄存器   First:
USCI_Ax控制寄存器  G2553有两个串口控制寄存器  UCAxCAL0 和UCAxCTL1  一般情况下 作为新手的我们 不需要管UCAxCTL0  默认即可  我们只要配置UCAxCTL1  中的 时钟源选择和 软件复位使能即可 一般选择ACLK或者SMCLK即可   至于软件复位的那位UCSWRST
UCSWRST:0被禁用。USCI复位被释放用于运行。 
 1被启用。USCI逻辑保持在复位状态。 意思就是说在单片机复位之后 如果 此位是0  那么串口可以正常工作  为1 即保持 复位状态  复位状态后  此位为1 就是说 复位后如果不清零 那么串口是不会工作的  Second: 
配置好上面的控制寄存器后 下面就是波特率的配置UCAxBR0 波特率控制寄存器 UCAxBR0=(时钟频率/波特率)的整数部分  次数必须小于0xff  多余的放在UCAxBR1中
Next:
配置波特率调整器:UCAxMCTL =(时钟频率/波特率)的小数部分*8

Next_1: 此时根据需要是否使用串口发送中断和接受中断  务必不要忘记开启总中断   Final:清除UCSWRST位  此时串口开始工作 
下面 我来解释一下 那个矫正时钟的问题  就是看门狗下面的这句话  if (CALBC1_1MHZ==0xFF) // If calibration constant erased { while(1); // do not load, trap CPU!! }作为新手的我们 在看到 CALBC1_1MHZ的时候  我们会很自然的认为他也是类似于BIT0一样的掩码  但是我们经过头文件的搜索后 发现并不是这样   我们可以收到这样一段话: #define CALDCO_1MHZ_ (0x10FEu) /* DCOCTL Calibration Data for 1MHz */
READ_ONLY DEFC( CALDCO_1MHZ , CALDCO_1MHZ_)
这个 我不过多的说 只说一点:这个片子在出厂的对时钟进行校准过 校准的数据就放在Flash的某段里面 这个CAKBC1_1MHZ就是被定义成了flash里面的一个地址 如果你不小心把Flash里面的数据擦除以后 那么里面的数据就会全部变成0XFF 所以这句话的意思就 取出来CAKBC1_1MHZ这个flash里面的数据和0xff比较 懂点了吧 你可以单步仿真验证一下 下面我把我的仿真贴出来 参考一下


可以看到汇编指令的运行 就是取出来那个地址里面的数据和0XFF做比较  好这个我们就介绍到这里   知道那个东东是个地址就够了  如果想详细了解  可以看看下面这个文章 说的非常详细http://blog.sina.com.cn/s/blog_a85e142101010myq.html   
如果有兴趣的话 可以仿真看一下 你的那两个时钟寄存器里面放的值是不是可以相应的DCO选择频率对应上 我看的如下图 3  7 刚好选择1MHZ的时钟  如下图:

  新手一个  上面的叙述难免有错误之处  请各位原谅 欢迎讨论分享更好的学习资料 方法