📄 main.c
字号:
#include "config.h"
/* 定义串口模式设置数据结构 */
typedef struct UartMode
{
uint8 datab; //字长度,5/6/7/8可选
uint8 stopb; //停止位,1/2可选
uint8 parity; //奇偶校验位,0:无校验;1:奇校验;2:偶校验
}UARTMODE;
uint8 rcv_buf[8]; //UART0数据接收缓冲区
volatile uint8 rcv_new; //接收新数据标志
/********************************************************************************************
** 函数名称:IRQ_UART0()
** 函数功能:串口0接收中断服务程序
** 入口参数:无
** 出口参数:无
*********************************************************************************************/
void __irq IRQ_UART0(void)
{
uint8 i;
if((U0IIR & 0x0F)==0x04)
rcv_new = 1; //设置接收到新的数据标志
for(i=0;i<8;i++) //FIFO使能时设为8字节长度
{
rcv_buf[i] = U0RBR; //读取FIFO的数据,并清除中断
}
VICVectAddr = 0x00; //中断处理结束
}
/********************************************************************************************
** 函数名称:UART0_SendByte()
** 函数功能:向串口0发送1字节数据
** 入口参数:dat 要发送的数据
** 出口参数:无
*********************************************************************************************/
void UART0_SendByte(uint8 dat)
{
U0THR = dat; //要发送的数据
}
/********************************************************************************************
** 函数名称:UART0_SendBuf()
** 函数功能:向串口0发送8字节数据
** 入口参数:无
** 出口参数:无
*********************************************************************************************/
void UART0_SendBuf(void)
{
uint8 i;
for(i=0;i<8;i++)
UART0_SendByte(rcv_buf[i]);
while((U0LSR & 0x20)==0); //等待数据发送完毕
}
/********************************************************************************************
** 函数名称:UART0_Init()
** 函数功能:串口初始化,设置工作模式和波特率
** 入口参数:baud 波特率
** set 模式设置(UARTMODE)数据结构)
** 出口参数:1为初始化成功,0为失败
*********************************************************************************************/
int8 UART0_Init(uint32 baud,UARTMODE set)
{
uint32 bak;
/* 参数过滤 */
if((baud==0)||(baud>9600)) return(0);
if((set.datab<5)||(set.datab>8)) return(0);
if((set.stopb==0)||(set.stopb>2)) return(0);
if(set.parity>4) return(0);
/* 设置串口波特率 */
U0LCR = 0x80; //DLAB=1
bak = (Fpclk>>4) / baud;
U0DLM = bak>>8;
U0DLL = bak & 0xFF;
/*设置串口模式 */
bak = set.datab - 5; //设置字长
if(set.stopb == 2) bak |= 0x04; //判断是否为2位停止位
if(set.parity != 0)
{
set.parity = set.parity - 1;
bak |= 0x08;
}
bak |= set.parity<<4; //设置奇偶校验
U0LCR = bak;
return(1);
}
/********************************************************************************************
** 函数名称:main()
** 函数功能:从串口UART0接收字符串"ABCDEFGH",并发送回上位机显示
** 调试说明:需要PC显示终端软件
*********************************************************************************************/
int main(void)
{
UARTMODE set;
set.datab = 8;
set.stopb = 1;
set.parity = 0;
rcv_new = 0;
PINSEL0 = 0x00000005; //设置I/O连接到UART0
UART0_Init(9600,set); //串口初始化
U0FCR = 0x81; //使能FIFO,并设置触发点为8字节
U0IER = 0x01; //允许RBR中断,即接收中断
IRQEnable(); //使能IRQ中断
/* 使能UART0中断 */
VICIntSelect = 0x00000000; //设置所有通道为IQR中断
VICVectCntl0 = 0x20|0x06; //UART0分配到IRQ slot0,即最高优先级
VICVectAddr0 = (uint32)IRQ_UART0; //设置UART0向量地址
VICIntEnable = 1<<0x06; //使能UART0中断
while(1)
{
if(rcv_new == 1) //如果有新数据
{
rcv_new = 0; //清除标志,以接收新数据
UART0_SendBuf();
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -