⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 super_node.c

📁 MSP430 //示范使用三种不同时脉来源 // Enter LPM3 w/ interrupt /* Convert EOL to CR/LF */
💻 C
字号:
#include "super_node.h"

#define DEFAULT_MAIN_CLK    (2500000)
void delay_1ms(){//assume main clk in 2.5MHz
  unsigned int i;
  for(i=0;i<500;i++);
}

void init_ext_clk(){
  volatile unsigned int i;
  
  BCSCTL1 &= ~XT2OFF;                       // XT2= HF XTAL
  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 |= SELS;//SMCLK=2.5MHz
}

void select_main_clk(unsigned char type){
  switch(type){
    case MCLK_DCOCLK:
      BCSCTL2 &= 0x3f;
      break;
    case MCLK_XT2CLK:
      BCSCTL2 &= 0x3f;
      BCSCTL2 |= SELM1;
      break;
    case MCLK_LFXTCLK:
      BCSCTL2 |= SELM1+SELM0;
      break;
  }
}

//2400 9600 19200 38400 57600 115200
unsigned char UBR0_Array[] ={0x0D,0x03,0x82,0x41,0x2B,0x15};
unsigned char UBR1_Array[] ={0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char UMCTL_Array[]={0x6D,0x29,0x84,0x10,0x29,0x5B};

FP usb_uart_rx_fp=NULL_FP;
void enable_usb_uart(unsigned char speed,FP rx_fp){
  P3SEL |= 0xC0;                            // P3.6,7 = USART1 TXD/RXD
  ME2 |= UTXE1 + URXE1;                     // Enable USART1 TXD/RXD
  UCTL1 |= CHAR;                            // 8-bit character
  
  switch(speed){
    case SPD_2400:
    case SPD_9600:
      U1TCTL_bit.SSEL0=1;                          // UCLK = ACLK
      U1TCTL_bit.SSEL1=0;
      break;
    case SPD_19200:
    case SPD_38400:
    case SPD_57600:
    case SPD_115200:
      U1TCTL_bit.SSEL0=1;                          // UCLK = SMCLK
      U1TCTL_bit.SSEL1=1;
      break;
  }
  
  UBR01 =  UBR0_Array[speed];               
  UBR11 =  UBR1_Array[speed];  
  UMCTL1 = UMCTL_Array[speed];    

  UCTL1 &= ~SWRST;                          // Initialize USART state machine
  
  usb_uart_rx_fp=rx_fp;
  if(usb_uart_rx_fp!=NULL_FP){
    IE2 |= URXIE1;                          // Enable USART1 RX interrupt
  }
}

#pragma vector=UART1RX_VECTOR
__interrupt void usart1_rx (void)
{
  if(usb_uart_rx_fp!=NULL_FP){
    usb_uart_rx_fp();
  }
}

FP rs232_uart_rx_fp=NULL_FP;
void enable_rs232_uart(unsigned char speed,FP rx_fp){
  P3SEL |= 0x30;                            // P3.4,5 = USART0 TXD/RXD
  ME1 |= UTXE0 + URXE0;                     // Enable USART0 TXD/RXD
  UCTL0 |= CHAR;                            // 8-bit character
  
  switch(speed){
    case SPD_2400:
    case SPD_9600:
      U0TCTL_bit.SSEL0=1;                          // UCLK = ACLK
      U0TCTL_bit.SSEL1=0;
      break;
    case SPD_19200:
    case SPD_38400:
    case SPD_57600:
    case SPD_115200:
      U0TCTL_bit.SSEL0=1;                          // UCLK = SMCLK
      U0TCTL_bit.SSEL1=1;
      break;
  }
  
  UBR00 =  UBR0_Array[speed];               // 32k/9600 - 3.41
  UBR10 =  UBR1_Array[speed];               //
  UMCTL0 = UMCTL_Array[speed];              // Modulation
  
  UCTL0 &= ~SWRST;                          // Initialize USART state machine
  
  rs232_uart_rx_fp=rx_fp;
  if(rs232_uart_rx_fp!=NULL_FP){
    IE1 |= URXIE0;                          // Enable USART0 RX interrupt
  }
}

#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
  if(rs232_uart_rx_fp!=NULL_FP){
    rs232_uart_rx_fp();
  }
}


FP user_isr_function=NULL_FP;
void setup_user_interrupt(FP rx_fp){
  if(rx_fp==NULL_FP){
    P2IE_bit.P2IE_7=0;
    return;
  }
  P2DIR_bit.P2DIR_7=0;
  P2IES_bit.P2IES_7=1;
  P2IFG_bit.P2IFG_7=0;
  P2IE_bit.P2IE_7=1; 
}

#pragma vector=PORT2_VECTOR
__interrupt void IO_PORT2_EDGE (void){
  P2IFG_bit.P2IFG_7=0;
  
  if(user_isr_function!=NULL_FP){
    user_isr_function();
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -