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

📄 uart.c

📁 程序介绍: 1.串口中断 2.串口波特率设置 3.串口的收发
💻 C
字号:
//成都无线龙
//@2007-6  by SU
//功能:串口及串口中断

#include"ioCC2430.h"
unsigned uarttemp;


#define ENABLE_ALL_INTERRUPT() (IEN0 |= 0x80)
#define DISABLE_ALL_INTERRUPT() (IEN0 &= ~0x80)
#define IO_PER_LOC_UART0_AT_PORT0_PIN2345() do { PERCFG = (PERCFG&~0x01)|0x00; } while (0)
#define uchar unsigned char
#define CRYSTAL 0x00
#define RC      0x01
#define HIGH_STOP                   0x02
#define LOW_STOP                    0x00
#define CLKSPD  (CLKCON & 0x07)
#define TRANSFER_MSB_FIRST          0x80
#define TRANSFER_MSB_LAST           0x00
#define UART_ENABLE_RECEIVE         0x40

#define UART_SETUP(uart, baudRate, options)      \
   do {                                          \
      if((uart) == 0){                           \
         if(PERCFG & 0x01){                      \
            P1SEL |= 0x30;                       \
         } else {                                \
            P0SEL |= 0x0C;                       \
         }                                       \
      }                                          \
      else {                                     \
         if(PERCFG & 0x02){                      \
            P1SEL |= 0xC0;                       \
         } else {                                \
            P0SEL |= 0x30;                       \
         }                                       \
      }                                          \
                                                 \
      U##uart##GCR = BAUD_E((baudRate),CLKSPD);  \
      U##uart##BAUD = BAUD_M(baudRate);          \
                                                 \
      U##uart##CSR |= 0x80;                      \
                                                 \
                                                 \
      U##uart##UCR |= ((options) | 0x80);        \
                                                 \
      if((options) & TRANSFER_MSB_FIRST){        \
         U##uart##GCR |= 0x20;                   \
      }                                          \
      U##uart##CSR |= 0x40;                      \
   } while(0)
#define SET_MAIN_CLOCK_SOURCE(source) \
   do {                               \
      if(source) {                    \
        CLKCON |= 0x40;               \
        while(!HIGH_FREQUENCY_RC_OSC_STABLE); \
        if(TICKSPD == 0){             \
          CLKCON |= 0x08;             \
        }                             \
        SLEEP |= 0x04;                \
      }                               \
      else {                          \
        SLEEP &= ~0x04;               \
        while(!XOSC_STABLE);          \
        asm("NOP");                   \
        CLKCON &= ~0x47;              \
        SLEEP |= 0x04;                \
      }                               \
   }while (0)
#define BAUD_E(baud, clkDivPow) (     \
    (baud==2400)   ?  6  +clkDivPow : \
    (baud==4800)   ?  7  +clkDivPow : \
    (baud==9600)   ?  8  +clkDivPow : \
    (baud==14400)  ?  8  +clkDivPow : \
    (baud==19200)  ?  9  +clkDivPow : \
    (baud==28800)  ?  9  +clkDivPow : \
    (baud==38400)  ?  10 +clkDivPow : \
    (baud==57600)  ?  10 +clkDivPow : \
    (baud==76800)  ?  11 +clkDivPow : \
    (baud==115200) ?  11 +clkDivPow : \
    (baud==153600) ?  12 +clkDivPow : \
    (baud==230400) ?  12 +clkDivPow : \
    (baud==307200) ?  13 +clkDivPow : \
    0  )


#define BAUD_M(baud) (      \
    (baud==2400)   ?  59  : \
    (baud==4800)   ?  59  : \
    (baud==9600)   ?  59  : \
    (baud==14400)  ?  216 : \
    (baud==19200)  ?  59  : \
    (baud==28800)  ?  216 : \
    (baud==38400)  ?  59  : \
    (baud==57600)  ?  216 : \
    (baud==76800)  ?  59  : \
    (baud==115200) ?  216 : \
    (baud==153600) ?  59  : \
    (baud==230400) ?  216 : \
    (baud==307200) ?  59  : \
  0)


#define XOSC_STABLE (SLEEP & 0x40)
#define TICKSPD ((CLKCON & 0x38) >> 3)
#define HIGH_FREQUENCY_RC_OSC_STABLE    (SLEEP & 0x20)

void ChangUartBaund(uchar temp);
void initUART(void);
void SET_UART0_ISR(void);

//*****************************************************************************
//串口初始化函数
//串口参数设置为57600,8,None,1,None
//打开串口,允许接收
//*****************************************************************************
void initUART(void)
{
   IO_PER_LOC_UART0_AT_PORT0_PIN2345();
   SET_MAIN_CLOCK_SOURCE(CRYSTAL);
   UART_SETUP(0, 9600, HIGH_STOP);
   U0CSR = 0xC5;
}
//------------------------------------------------------------------------
//describe:chang band
//return:
//in:
//------------------------------------------------------------------------
void ChangUartBaund(uchar temp)
{
switch(temp)
{
case '0':UART_SETUP(0, 2400, HIGH_STOP);break;
case '1':UART_SETUP(0, 4800, HIGH_STOP);break;
case '2':UART_SETUP(0, 9600, HIGH_STOP);break;
case '3':UART_SETUP(0, 14400, HIGH_STOP);break;
case '4':UART_SETUP(0, 19200, HIGH_STOP);break;
case '5':UART_SETUP(0, 28800, HIGH_STOP);break;
case '6':UART_SETUP(0, 38400, HIGH_STOP);break;
case '7':UART_SETUP(0, 57600, HIGH_STOP);break;
case '8':UART_SETUP(0, 76800, HIGH_STOP);break;
case '9':UART_SETUP(0, 115200, HIGH_STOP);break;
default:  UART_SETUP(0, 9600, HIGH_STOP);break;
}
}
//example 9600;
//------------------------------------------------------------------------
//describe:open the uart isr
//return:
//in:
//------------------------------------------------------------------------
void SET_UART0_ISR(void)
{
   U0CSR |= 0xd0;
    U0UCR |= 0x02;
}
void UARTxISRopen(void)
{
  U0CSR |= 0x40;
  IEN0 |= 0X04;//开串口接收中断 'URX0IE = 1',
}
#pragma vector = URX0_VECTOR
 __interrupt void URX0_ISR(void){

    uarttemp = U0DBUF;
    U0DBUF = uarttemp;
}

⌨️ 快捷键说明

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