📄 uart.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 + -