打印

求助!MSP430F1232程序移植到MSP430F2132不运行 !

[复制链接]
1778|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wodedaqianjin|  楼主 | 2015-10-21 07:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//
// Set DCO Frequency
//
void setDCO(unsigned long freq)
{
  unsigned char old_BCSCTL1;
  unsigned int old_TACCTL2;
  unsigned int old_TACTL;
  unsigned int clkCnt;
  unsigned int numDcoClks;
  unsigned int prevCnt = 0;

  // PUC value for DCOx = 3
  // PUC value for RSELx = 4

  old_BCSCTL1 = BCSCTL1;                    // Save current BCSCTL1 setting
  old_TACCTL2 = TACCTL2;                    // Save current TACCTL2 setting
  old_TACTL   = TACTL;                      // Save current TACTL setting


  // Basic Clock System Control Register 1
  BCSCTL1 |= XTS;                     

  numDcoClks = freq/4096;                   // Number of DCO clocks in one
                                            // ACLK/8 period

  // Timer_A Capture/Compare Control Register
  TACCTL2 = CM_1 + CCIS_1 + CAP;            // Capture on rising Edge
                                            // Capture input is CCI2B = ACLK
                                            // Async capture
                                            // Capture mode
                                            // Output mode is OUT bit
                                            // Interrupt disabled
                                            // OUT bit is 0
                                            // Clear capture overflow bit (COV)
                                            // Clear interrupt flag (CCIFG)

  // Timer A Control Register
  TACTL = TASSEL_2 + MC_2 + TACLR;          // Clk src is SmaciLK
                                            // Input clock divider is 1
                                            // Continuous mode
                                            // Reset
                                            // Interrupt is disabled
                                            // Clear interrupt flag (TAIFG)

  while(1)
  {
    while( !(TACCTL2 & CCIFG) );            // Wait for capture event

    TACCTL2 &= ~CCIFG;                      // Capture occured, clear flag

    clkCnt = TACCR2 - prevCnt;              // Num of clks since last capture

    prevCnt = TACCR2;                       // Save current clock count

    if( (numDcoClks <= (clkCnt + 2)) && (numDcoClks >= (clkCnt - 2))  )
    {
      break;
    }
    else if( clkCnt > numDcoClks )          // DCO is too fast, slow it down
    {
      DCOCTL--;

      if( DCOCTL == 0xFF )
      {
        if( BCSCTL1 & 0x07 )
        {
          BCSCTL1--;                        // DCO role under?, dec RSEL
        }
        else
        {
          break;                            // Error condition, break loop
        }
      }
    }
    else                                    // DCO is too slow, speed it up
    {
      DCOCTL++;

      if( DCOCTL == 0x00 )
      {
        if( (BCSCTL1 & 0x07) != 0x07 )
        {
          BCSCTL1++;                        // DCO role over? higher RSEL
        }
        else
        {
          break;                            // Error condition, break loop
        }
      }
    }
  }

  // Stop Timer_A
  TACTL = 0;
  TACCTL2 = 0;

  // Restore original values
  BCSCTL1 = old_BCSCTL1;
  TACCTL2 = old_TACCTL2;
  TACTL = old_TACTL;
}


//
// Configure USART0 for UART mode
//
void configUart0(void)
{
  P3SEL |= 0x30;                            // P3.4,5 = UTXD0/URXD0
  ME2 |= UTXE0 + URXE0;                     // Enable USART0 TXD/RXD
  UCTL0 |= (CHAR + PENA + PEV + SWRST);     // 8-bit char, even parity, reset
  UTCTL0 |= SSEL1;                          // BRCLK = SmaciLK
  UBR00 = 0x6d;                             // 9600 from 1MHz
  UBR10 = 0x00;                             //
  UMCTL0 = 0x03;                            // Modulation
  UCTL0 &= ~SWRST;                          // Initialize USART state machine
  IE2 |= URXIE0;                            // Enable USART0 RX interrupt
}


改后
//
// Configure USART0 for UART mode
//
void configUart0(void)
{
  P3SEL = 0x30;                             // P3.4,5 = USCI_A0 TXD/RXD
  UCA0CTL1 |= UCSSEL_2;                     // SMCLK
  UCA0BR0 = 0x6d;                           
  UCA0BR1 = 0x00;                           
  UCA0MCTL = 0x03;                       
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt
}

相关帖子

沙发
dirtwillfly| | 2015-10-21 08:47 | 只看该作者
你怎么移植的?

使用特权

评论回复
板凳
dirtwillfly| | 2015-10-21 08:51 | 只看该作者
MSP430F1232和MSP430F2132,好多寄存器名称不一样,要注意

使用特权

评论回复
地板
wodedaqianjin|  楼主 | 2015-10-21 09:03 | 只看该作者

MSP430F1232和MSP430F2132端口是一样的,只是寄存器名称不一样,改好后不运行了?

使用特权

评论回复
5
wodedaqianjin|  楼主 | 2015-10-21 09:06 | 只看该作者
dirtwillfly 发表于 2015-10-21 08:51
MSP430F1232和MSP430F2132,好多寄存器名称不一样,要注意

添加BCSCTL3 |= LFXT1S1;                       // 3 ?16MHz crystal or resonator运行了,波特率又不对了

使用特权

评论回复
6
dirtwillfly| | 2015-10-21 09:28 | 只看该作者
刚翻了翻手册,这两个mcu的串口区别还是蛮大的。
f1232是USART0,f2132是USCIA0
这两个模块差别比较大,功能上USCIA0更强

使用特权

评论回复
7
wodedaqianjin|  楼主 | 2015-10-21 10:22 | 只看该作者
dirtwillfly 发表于 2015-10-21 09:28
刚翻了翻手册,这两个mcu的串口区别还是蛮大的。
f1232是USART0,f2132是USCIA0
这两个模块差别比较大,功 ...

那我这个怎么改呢?

使用特权

评论回复
8
dirtwillfly| | 2015-10-21 10:26 | 只看该作者
wodedaqianjin 发表于 2015-10-21 10:22
那我这个怎么改呢?

这个模块的初始化和使用,重新写吧。
可以参考官网的例程

使用特权

评论回复
9
wodedaqianjin|  楼主 | 2015-10-21 10:37 | 只看该作者
dirtwillfly 发表于 2015-10-21 10:26
这个模块的初始化和使用,重新写吧。
可以参考官网的例程

  BCSCTL1 |= XTS;                           // ACLK = LFXT1 = HF XTAL
  BCSCTL3 |= LFXT1S1;                       // 3 ?16MHz crystal or resonator
  do
  {
    IFG1 &= ~OFIFG;                         // Clear OSCFault flag
    for (i = 0xFF; i > 0; i--);             // Time for flag to set
  }
  while (IFG1 & OFIFG);                     // OSCFault flag still set?
  BCSCTL2 |= SELM_3 + SELS+DIVM_2+DIVS_2;

  P3SEL = 0x30;                             // P3.4,5 = USCI_A0 TXD/RXD
  UCA0CTL0 |= UCPEN;
  UCA0CTL1 |= UCSSEL_2;                     // SMCLK
  UCA0BR0 = 104;                            // 1MHz 9600
  UCA0BR1 = 0;                              // 1MHz 9600
  UCA0MCTL = 1;                        // Modulation UCBRSx = 1
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt

按照例程这个用4M晶振波特率不稳定!

使用特权

评论回复
10
wodedaqianjin|  楼主 | 2015-10-21 10:38 | 只看该作者
本帖最后由 wodedaqianjin 于 2015-10-21 10:40 编辑
dirtwillfly 发表于 2015-10-21 10:26
这个模块的初始化和使用,重新写吧。
可以参考官网的例程

{
  unsigned int i;
  BCSCTL1 |= XTS;                           // ACLK = LFXT1 = HF XTAL
  BCSCTL3 |= LFXT1S1;                       // 3 ?16MHz crystal or resonator
  do
  {
    IFG1 &= ~OFIFG;                         // Clear OSCFault flag
    for (i = 0xFF; i > 0; i--);             // Time for flag to set
  }
  while (IFG1 & OFIFG);                     // OSCFault flag still set?
  BCSCTL2 |= SELM_3 + SELS+DIVM_2+DIVS_2;                 // MCLK = SMCLK = LFXT1/4 (safe)
  
    // Timer_A Capture/Compare Control Register
  TACCTL2 = CM_1 + CCIS_1 + CAP;            // Capture on rising Edge
                                            // Capture input is CCI2B = ACLK
                                            // Async capture
                                            // Capture mode
                                            // Output mode is OUT bit
                                            // Interrupt disabled
                                            // OUT bit is 0
                                            // Clear capture overflow bit (COV)
                                            // Clear interrupt flag (CCIFG)

  // Timer A Control Register
  TACTL = TASSEL_2 + MC_2 + TACLR;          // Clk src is SmaciLK
                                            // Input clock divider is 1
                                            // Continuous mode
                                            // Reset
                                            // Interrupt is disabled
                                            // Clear interrupt flag (TAIFG)
}

//
// Configure USART0 for UART mode
//
void configUart0(void)
{
  P3SEL = 0x30;                             // P3.4,5 = USCI_A0 TXD/RXD
  UCA0CTL0 |= UCPEN;
  UCA0CTL1 |= UCSSEL_2;                     // SMCLK
  UCA0BR0 = 104;                            // 1MHz 9600
  UCA0BR1 = 0;                              // 1MHz 9600
  UCA0MCTL = 1;                        // Modulation UCBRSx = 1
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt
}
波特率不稳定

使用特权

评论回复
11
wodedaqianjin|  楼主 | 2015-10-21 12:28 | 只看该作者
终于搞定了!是通讯模块没设置好

使用特权

评论回复
12
dirtwillfly| | 2015-10-21 13:40 | 只看该作者
wodedaqianjin 发表于 2015-10-21 12:28
终于搞定了!是通讯模块没设置好

赞一个

使用特权

评论回复
13
xyz549040622| | 2015-10-22 20:24 | 只看该作者
这些其实可以直接跑官方例程,用官方的初始化的。

使用特权

评论回复
14
米尔豪斯| | 2015-10-23 21:53 | 只看该作者
一个是1系列,一个是2系列,差别应该比较大的

使用特权

评论回复
15
haolaishi| | 2015-10-28 18:01 | 只看该作者
建议在官方的例程上面改,不要直接移植。

使用特权

评论回复
16
sunriselight| | 2015-10-29 16:11 | 只看该作者
两个串口的区别还是很大的。

使用特权

评论回复
17
白丁野老| | 2015-10-30 23:22 | 只看该作者
wodedaqianjin 发表于 2015-10-21 09:06
添加BCSCTL3 |= LFXT1S1;                       // 3 ?16MHz crystal or resonator运行了,波特率又不对 ...

官方不是有库函数么,建议用库,这样配置寄存器好不容易查错

使用特权

评论回复
18
cemaj| | 2015-10-31 11:06 | 只看该作者
寄存器名称一致吗?

使用特权

评论回复
19
cemaj| | 2015-10-31 11:08 | 只看该作者
这样移植之后又什么不同的现象吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

27

帖子

0

粉丝