430f5438串口

2019-03-24 15:30发布

#include "msp430x54x.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "PIN_DEF.H"

#define  FLL_FACTOR     749                                          // FLL_FACTOR: DCO倍频系数   
char  event, RXBuffer[8],temp,i,j = 0                                      ;


//  RS232/485接收中断服务程序                                                //
#pragma vector=USCI_A3_VECTOR
__interrupt void USCI_A3_ISR(void)
{
  switch(__even_in_range(UCA3IV,4))
  {
  case 0:break                                                     ; // Vector 0 - no interrupt
  case 2:                                                            // Vector 2 - RXIFG
      RXBuffer[0]  = UCA3RXBUF;
      event           |= 0x01                                      ;
      break   ;      
   
  case 4:break                                                     ;  // Vector 4 - TXIFG
  default: break                                                   ;  
  }                        
}

//                 初始化主时钟: MCLK = XT1×(FLL_FACTOR+1)                  //
void Init_CLK(void)
{
  WDTCTL     = WDTPW + WDTHOLD                            ; // 关看门狗
  P7SEL     |= 0x03                                       ; // 端口选择外部低频晶振XT1
  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_Port(void): 设置IO端口                                
void Init_Port(void)
{
  P5DIR  |= POWER                                                  ; // 主电源
  MAIN_POWER_ON                                                    ;
  P7DIR  |= LED_PWR                                                ; // 发光二极管电源
  P7OUT  &=~LED_PWR                                                ;
  INTERNAL_PULL_UP                                                 ; // 使能键盘端口内部上拉电阻
  ROW_IN_COL_OUT                                                   ; // 设置行输入,列输出0
}


//  Init_RSUART(void): 初始化RS232/485端口               
void Init_RSUART(void)
{
  RS_PORT_SEL    |= TXD + RXD                                      ; // 选择引脚功能
  RS_PORT_DIR    |= TXD                                            ; // 选择引脚功能
  UCA3CTL1        = UCSWRST                                        ; // 状态机复位
  UCA3CTL1       |= UCSSEL_1                                       ; // CLK = ACLK
  UCA3BR0         = 0x03                                           ; // 32kHz/9600=3.41
  UCA3BR1         = 0x00                                           ;
  UCA3MCTL        = UCBRS_3 + UCBRF_0                              ; // UCBRSx=3, UCBRFx=0
  UCA3CTL1       &= ~UCSWRST                                       ; // 启动状态机
  UCA3IE         |= UCRXIE                                         ; // 允许接收中断
  RS485_IN                                                         ;
}

//  RS232TX_PROC(void): RS232端口发送程序                              
void RS232TX_PROC(char *tx_buf)
{
  unsigned char i,length                                           ;
  length = strlen(tx_buf)                                          ;
  for(i=0;i<length;i++)
  {
    UCA3TXBUF = *tx_buf++                                          ;
    while (!(UCA3IFG&UCTXIFG))                                     ;
  }
}

void main( void )
{
  WDTCTL = WDTPW + WDTHOLD                                         ;
  Init_CLK()                                                       ;
  Init_Port()                                                      ;
  Init_RSUART()                                                    ;
  _EINT()                                                          ;
  while(1)
  {
    if(event)
    {
      __delay_cycles(1000);
      event   = 0x00 ;
      RS232TX_PROC(RXBuffer);   
      __delay_cycles(5000);
    }
   
    if((P6IN&0x0F)!=0x0F)                                            // 检测按键按下
    {
      __delay_cycles(1000);
      if((P6IN&0x0F)!=0x0F)
      {
        while(!((P6IN&0x0F)==0x0F));
        RS232TX_PROC("This is BW-DK5438")                            ;
        __delay_cycles(5000)                                      ;
      }      
    }   
  }
}
串口程序  想cong PC机发送数据并显示数据,但是老是显示最后一个字符,  RXBuffer[0]  = UCA3RXBUF我改了好几次都没有测通 ,帮忙解决一下吧,谢谢了 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
永远的不知
2019-03-24 18:22
 精彩回答 2  元偷偷看……0人看过

一周热门 更多>

相关问题

    相关文章