打印
[ARM入门]

求S3C6410的uart中断实现方式

[复制链接]
1369|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
longhaiqwe123|  楼主 | 2013-12-11 18:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
longhaiqwe123|  楼主 | 2013-12-12 17:54 | 只看该作者
自顶:
/*
**功能: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;        //两组都需要清零
       
}

使用特权

评论回复
板凳
duhui75| | 2014-4-11 12:25 | 只看该作者
不错呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝