自顶:
/*
**功能:6410UART接收PC串口字符,随后6410将字符发送给PC机串口软件回显
**重点:使用中断实现
**目的:熟悉6410UART编程
*/
#include <string.h>
#include <stdio.h>
#include "INTERRUPT.h"
#include "PWM.h"
#include "GPIO.h"
#include "WATCHDOG.h"
#include "UART.h"
#define uint unsigned int
#define uchar unsigned char
#define PCLK 66000000 //PCLK时钟
#define BAUD 115200 //波特率
void __irq UART0_ISR(void);
uchar chbuf;
void Int_Init(void)
{
/*总中断设置*/
rVIC1INTSELECT = 0x00; //设置为IRQ模式
rVIC1VECTADDR5 = (unsigned int)UART0_ISR; //设置地址寄存器(寻找中断服务程序地址)
rVIC1INTENABLE |= (0x01<<5); //使能中断号为37的中断源
}
void UART_Init(void)
{
/*步骤一:设置UART通道管脚*/
//S3C6410的串口需配置UART0端口
//对应关系:GPA0--RXD0;GPA1--TXD0
rGPACON &= ~0xff;
rGPACON |= 0x22; //GPA0--UART RXD;GPA1--UART TXD
rGPAPUD = 0x00;
/*步骤二:设置波特率--UCONn[11:10]*/
rUCON0 &= ~(0x03<<10);
rUCON0 |= (0x02<<10); //时钟选择--PCLK
rUBRDIV0 = (uint)((PCLK/BAUD/16)-1); //波特率单位值
/*步骤三;设置传输格式--ULCON*/
rULCON0 &= ~0xff;
rULCON0 |= 0x03; //数据8位,1位停止位,无奇偶校验位,不使用红外模式
/*步骤四:设置通道工作模式*/
rUCON0 &= ~0x03ff;
rUCON0 |= 0x05; //中断触发为脉冲方式,不产生接收错误状态中断
//发射接收均为正常模式,其余位暂时不用,默认
rUFCON0 = 0x00; //FIFO禁止
rUMCON0 = 0x00; //流控禁止
rUINTM0 = 0x00; //UART中断使能
}
void Sys_Init(void)
{
Int_Init();
UART_Init();
}
/*
void UART_send_byte(void)
{
while( !(rUTRSTAT0&0x02) )
;
rUTXH0 = chbuf;
}
*/
void main(void)
{
Sys_Init();
while(1)
{
;
}
}
void __irq UART0_ISR(void)
{
/*接收中断产生*/
if(rUINTP0&0x01)
{
chbuf = rURXH0; //将接收缓冲区内容写入全局变量
rUTXH0 = chbuf; //将全局变量中内容写入发送缓冲区
rUINTP0 |= 0x01; //清除标志位
}
/*发送中断产生
if(rUINTP0&0x04)
{
rUTXH0 = chbuf;
rUINTP0 |= 0x04;
}
*/
rVIC0ADDRESS = 0x00; //标志向量地址寄存器清零
rVIC1ADDRESS = 0x00; //两组都需要清零
}
|