msp430f5438串口调试错误 求助啊!

2019-03-24 10:58发布

#include "msp430x54x.h"
#include "PIN_DEF.H" #define  FLL_FACTOR     549                                          // FLL_FACTOR: DCO倍频系数
/*****************************函数声明**************************************/
void InitRS232(void);
void Init_CLK(void);
/*****************************全局变量**************************************/
unsigned char RX_buffer = 0x00;
/*****************************主函数****************************************/
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                   //关闭看门狗
 
  Init_CLK()                                                       ;
  //Init_Port()                                                      ;
  
 
 
 
  InitRS232();                                //串口初始化
  _EINT();                                    //开全局中断
  //LPM1;                                       //进入低功耗模式
}
/*****************************END main()************************************/   /***************************以下init_clk(void)根据博维相关代码添加****************/
void Init_CLK(void)
{
  WDTCTL     = WDTPW + WDTHOLD                            ; // 关看门狗
  P7SEL     |= 0x03                                       ; // 端口选择外部低频晶振XT1 即接p7.2 p7.3引脚的  32768hz
  UCSCTL6   &=~XT1OFF                                     ; // 使能外部晶振
  UCSCTL6   |= XCAP_3                                     ; // 设置内部负载电容
  UCSCTL3   |= SELREF_2                                   ; // DCOref = REFO
  UCSCTL4   |= SELA_0                                     ; // ACLK   = XT1 
  __bis_SR_register(SCG0)                                 ; // 关闭FLL控制回路
  UCSCTL0    = 0x0000                                     ; // 设置DCOx, MODx
  UCSCTL1    = DCORSEL_7                                  ; // 设置DCO振荡范围
  UCSCTL2    = FLLD__1 + FLL_FACTOR                       ; // Fdco = ( FLL_FACTOR + 1)×FLLRef = (649 + 1) * 32768 = 21.2992MHz
  __bic_SR_register(SCG0)                                 ; // 打开FLL控制回路                                                           
  __delay_cycles(1024000)                                 ;
  do
  {
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除 XT2,XT1,DCO 错误标志                                                           
    SFRIFG1 &= ~OFIFG                                     ;
  }while(SFRIFG1&OFIFG)                                   ; // 检测振荡器错误标志
}
                                                                    //
//***************************************************************************//
//                                                                           //
//  Init_RSUART(void): 初始化RS232/485端口                                   //
//                                                                           //
//***************************************************************************//

/*
****************************************************************************
*                             InitRS232
* 功  能:RS232串口初始化
* 参  数:无
* 返回值:无
****************************************************************************
*/
void InitRS232(void)
{
  P10SEL |= 0x30;                              //选择RS232引脚功能
  P10DIR = BIT4;                               //P3.4 TXD
  P10DIR &= ~BIT5;                             //P3.5 RXD
  UCA3CTL1 |= UCSWRST;                        //复位UART状态机
  UCA3CTL1 |= UCSSEL_1;                       //CLK = ACLK
  UCA3BR0 = 0x03;                             //32kHz/9600=3.41
  UCA3BR1 = 0x00;                             //
  UCA3MCTL = UCBRS_3 + UCBRF_0;               //UCBRSx=3, UCBRFx=0
  UCA3CTL1 &= ~UCSWRST;                       //启动UART
  UCA3IE |= UCRXIE;                           //数据接收中断使能
__delay_cycles(1024000) ;
} /*
****************************************************************************
*                             USCI_A3_ISR
* 功  能:UART中断服务函数
* 说  明:读出PC机传输过来的数据
*         并向PC机发回接收到的数据
* 参  数:无
* 返回值:无
****************************************************************************
*/
#pragma vector = USCI_A3_VECTOR
__interrupt void USCI_A3_ISR(void)
{
  switch (__even_in_range(UCA3IV,4))
  {
    case 2:
      RX_buffer = UCA3RXBUF;                  //提取接收数据
     
      while (!(UCA3IFG & UCTXIFG));           //等待 TX缓冲区空
     
      UCA3TXBUF = RX_buffer;                  //串口发送数据
      _NOP();                                 //设置断点, 观察接收到的数据 RX_buffer
      break;
    default:
      break; 
  }
} /* end main.c */  以上代码本人想在5438系统上测试,和pc机通讯,5438上收pc串口调试工具100ms间隔发送的一字节或多字节的16进制数据,后转发回来,发现在9600波特率下无法正常收发,但是降到600波特率能收发但是误码较多,单独测试5438的发送发现9600波特率没问题,但接收就不行,如果进行调试发现进不了接收中断,而且每次都在debugbreak 与以下语句之间循环 ,还有就如 上图所示中断使能的UCRXIE 值也出现错误请问是何原因,请各位大师路过指点,不胜感激! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
zhj_hjh
1楼-- · 2019-03-24 14:58
那位大虾帮帮忙啊!
kazvvv
2楼-- · 2019-03-24 15:30
< :TI_MSP430_内容页_SA7 --> 你好,我现在也在研究这个串口,当前把查询方式的已经完成,但是中断方式的一直都不是很顺利,希望能探讨下,我QQ:1028208759
凌晨六点的梦
3楼-- · 2019-03-24 19:58
 精彩回答 2  元偷偷看……

一周热门 更多>

相关问题

    相关文章