📄 uart.c
字号:
#include <LPC213X.H>
#define Fosc 11059200 //Crystal .
//应当与实际一至晶振频率,10MHz~25MHz,应当与实际一至
#define Fcclk (Fosc * 4) //System less than 60MHz.
//系统频率,必须为Fosc的整数倍(1~32),且<=60MHZ
#define Fcco (Fcclk * 4) //CCO
//CCO频率,必须为Fcclk的2、4、8、16倍,范围为156MHz~320MHz
#define Fpclk (Fcclk / 4) * 1 //VPB clock
//VPB时钟频率,只能为(Fcclk / 4)的1、2、4倍
#define UART_BPS 19200
#define NUM 22 //桢长度
typedef unsigned char uint8; /* 无符号8位整型变量 */
typedef signed char int8; /* 有符号8位整型变量 */
typedef unsigned short uint16; /* 无符号16位整型变量 */
typedef signed short int16; /* 有符号16位整型变量 */
typedef unsigned int uint32; /* 无符号32位整型变量 */
typedef signed int int32; /* 有符号32位整型变量 */
uint8 rcv_buf[23]; //桢数据接收缓冲区
volatile uint8 rcv_new; //接收完一桢数据标志
uint16 test1; //for test
/*******************************************************************************
函数名称:IRQ_UART0(void)
函数功能:串口0接收中断服务程序
入口参数:无
出口参数:无
*******************************************************************************/
void __irq IRQ_UART0(void)
{
static uint8 i = 0;
uint8 state;
state = U0IIR; //读取UART0中断标识
state &= 0x0F;
if (state == 0x04)
{
rcv_buf[i++] = U0RBR;
if(i == 22) //一帧传输结束
{
rcv_new = 1;//设置接收到新的数据标志
i = 0;
}
}
state = U0RBR; //清除中断标志
VICVectAddr = 0x00; // 中断结束
++test1; //for test
}
/*******************************************************************************
函数名称:UART0_SendByte(uint8 dat)
函数功能:向串口0发送1字节数据
入口参数:dat 要发送的数
出口参数:无
*******************************************************************************/
void UART0_SendByte(uint8 dat)
{
U0THR = dat;
while((U0LSR & 0X40) == 0);
}
/*******************************************************************************
函数名称: UART0_SendBuf(void)
函数功能:向串口0发送1字节数据
入口参数:
出口参数:无
********************************************************************************/
void UART0_SendBuf(uint8 const *str,uint8 i )
{
while(1)
{
if((*str == '\0')&&(i==0)) break;
UART0_SendByte(*str++);
i--;
}
}/*******************************************************************************
函数名称:UART0_Init()
函数功能:串口初始化,设置工作模式和波特率
入口参数:baud 波特率
set 模式设置(UARTMODE数据结构)
出口参数:1,初始化成功,0初始化失败
********************************************************************************/
void UART0_Init(void)
{
uint16 Fdiv;
U0LCR = 0x83 ;//允许设置波特率
Fdiv = (Fpclk / 16) / UART_BPS;
U0DLM = Fdiv /256;
U0DLL = Fdiv % 256;
U0LCR = 0x03;
}
/****************************************************************
函数功能:IRQ使能
***********************************************/
void IRQ_Enable(void)
{
int temp;
__asm
{
MRS temp,CPSR
BIC temp,temp,#0x80
MSR CPSR_c,temp
}
}
/*****************************************************************************
函数功能:IRQ相关设置
*****************************************************************************/
void IRQset(void)
{
IRQ_Enable();
VICIntSelect = 0x00000000; //设置所有通道为IRQ中断
VICVectCntl0 = 0x20 | 0x06;//UART0 分配到IRQ slot0,即最高中断
VICVectAddr0 = (uint32 )IRQ_UART0; //设置UART0向量地址
VICIntEnable = 1 << 0x06; //使能UART0中断
}
/*******************************************************************************
函数功能:计算校验和
*******************************************************************************/
uint8 check( )
{
char i = 1 ,sum = 0 ;
while(i != 21)
{
sum += rcv_buf[i++] ;
}
return (sum);
}
/*******************************************************************************
*******************************************************************************/
int main()
{
rcv_new = 0;
test1 = 0;
PINSEL0 = (PINSEL0 & (~0x0f)) | 0x05; //UART IO连接
UART0_Init(); //UART0_Init(19200,set); //串口初始化
U0FCR = 0X01; //使能 FIFO ,并设置触发点为1个字节
//U0IER = 0X05; //使能RBR和线状态中断,即接收中断 ,超时错误和和奇偶错误
U0IER = 0X01; //使能接收中断
IRQset(); //IRQ 相关设置
while(1)
{ //如果有新桢
if(rcv_new == 1)
{
rcv_new = 0;
if( rcv_buf[21] == check( ))
{
UART0_SendBuf(rcv_buf,NUM);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -