[讨论] ADUC7060 之UART

蓝雨夜   2011-9-16 08:50 楼主

/******************************************************************************
COMTX   //UART 发送寄存器。
COMRX   //UART 接收寄存器。
COMDIV0 //UART 标准波特率发生器除数0。
COMIEN0 //UART 中断使能寄存器0。
COMDIV1 //UART 标准波特率发生器除数1。
COMIID0 //UART 中断标识0。
COMCON0 //UART 控制寄存器0。
COMCON1 //UART 控制寄存器1。
COMSTA0 //UART 状态寄存器0。
COMSTA1 //UART 状态寄存器1。
COMDIV2 //UART 小数分频器寄存器。
******************************************************************************/

void Init_UART(void)

        COMCON0 = DLAB(1);   // Enable access to COMDIV registers
 COMDIV0 = 0x21;   //UART 标准波特率发生器除数0 Set baud rate to 9600.
 COMDIV1 = 0x00;                 //UART 标准波特率发生器除数1
 //COMDIV2 = 0x21 + BIT11; //UART 小数分频器寄存器 Enable fractional divider for more accurate baud rate setting
 COMCON0 = Stop(1)   |//停止位。用户置1 后,如果字长为5 位则传送1.5 个停止位;如果字长为6、7 或8 位,则传送2 个停止位。不论所选停止位的个数是多少,接收器只检查第一个停止位。用户清0,则在发送的数据中只产生一个停止位。
                  WLS(D8)   ; //字长选择。
 COMIEN0 = ETBEI(1)  |
                  ERBFI(1)  ;  //UART 中断使能寄存器0 Enable UART interrupts when Rx full and Tx buffer empty.
 
 IRQEN |= BIT11; // Enable UART interrupt source
 

}

回复评论 (14)

宏定义

/******************************************************************************
            UART
******************************************************************************/
//COMCON0 寄存器
#define DLAB(x) x<<7 //分频锁存器访问。用户置1,可允许访问寄存器COMDIV0 和COMDIV1。用户清0,禁止访问寄存器COMDIV0 和COMDIV1 但允许访问COMRX、COMTX 和COMIEN0。
#define BRK(x)  x<<6 //设置断开用户置1,可强制发送为0。用户清0,采用正常模式工作。
#define SP(x)   x<<5 //强制奇偶校验。用户置1,强制奇偶校验为定义值。如果EPS=1 且PEN=1,则置1。如果EPS=0 且PEN=1,则清0。
#define EPS(x)  x<<4 //偶校验选择位。置1,以选择偶校验。清0,以选择奇校验。
#define PEN(x)  x<<3 //奇偶校验使能位。用户置1,以发送并检查奇偶校验位。用户清0,则既不发送也不检查奇偶校验。
#define Stop(x) x<<2 //停止位。用户置1 后,如果字长为5 位则传送1.5 个停止位;如果字长为6、7 或8 位,则传送2 个停止位。不论所选停止位的个数是多少,接收器只检查第一个停止位。用户清0,则在发送的数据中只产生一个停止位。
#define WLS(x)  x<<0 //字长选择。
#define D5  0//5 位。
#define D6  1//6 位。
#define D7  2//7 位。
#define D8  3//8 位。
//COMIEN0 寄存器
#define EDSSI(x)    x<<3 // 调制解调器状态中断使能位。用户置1 后,当COMSTA0[3:1]的任一位被置1 时,允许产生中断。由用户清0。
#define ELSI(x)     x<<2 // 接收状态中断使能位。用户置1 后,当COMSTA0[3:1]寄存器任一位被置1 时,使能中断产生。由用户清0。
#define ETBEI(x)    x<<1 // 使能发送缓冲空中断。用户置1 后,在发送期间,如果缓冲器为空(即COMSTA0[5]置1),则使能中断。由用户清0。
#define ERBFI(x)    x<<0 // 使能接收缓冲满中断。用户置1 后,在接收期间,当缓冲器满时,使能中断。由用户清0。
点赞  2011-9-16 08:50
收发
/******************************************************************************

******************************************************************************/
void UART_Send(unsigned char ucTxChar)
{
    COMTX = ucTxChar;
    while ((COMSTA0 & 0x40) == 0x00){}          // Wait for Tx buffer empty bit to be set                    
}
/******************************************************************************

******************************************************************************/
unsigned char UART_Received(void)
{
    unsigned char ucRxChar;
    if ((COMSTA0 & 0x01) == 0x01)          // If the Rx buffer full bit is set
    {       
        ucRxChar = COMRX;                          // read COMRX register
        UART_Send(ucRxChar);
    }
    return ucRxChar;
}
点赞  2011-9-16 08:51
目前正使用ADuC7061的芯片···学习了!谢谢楼主
点赞  2012-10-25 13:58
void IRQ_Handler(void) __irq
{
unsigned long IRQSTATUS = 0;
unsigned char ucCOMIID0 = 0;
IRQSTATUS = IRQSTA;
       
if ((IRQSTATUS&BIT11) == BIT11)   //uart中断源
{
        ucCOMIID0 = COMIID0;
        if ((ucCOMIID0&0x04) == 0x04)  //接收缓冲区满
        {
                 UartDataRecevice = COMRX;  //读串口接收到的数据
        }
        else if ((ucCOMIID0&0x02) == 0x02) //发送缓冲区
        {       
                             //
        }
        IRQCLR = BIT11;
           }
}

楼主,刚参考了你的UART函数,那么在中断处理函数中需要做些什么处理呢?我的中断没弄成功?
点赞  2012-10-25 16:13

回复 5楼 zhoouauruheng 的帖子

//uart中断源  可以进入这里吗?
点赞  2012-10-25 16:46

回复 6楼 蓝雨夜 的帖子

我用keil调试了,好像进不了。。。。楼主可以给我发一份串口中断使用的例程不!谢谢   303813725@qq.com
点赞  2012-10-26 09:01

回复 7楼 zhoouauruheng 的帖子

学习的精神可嘉,加油!
点赞  2012-10-26 10:47

回复 8楼 苏莎莎 的帖子

问题一直未得到解决!·····
点赞  2012-10-26 11:32

回复 9楼 zhoouauruheng 的帖子

继续关注吧!看有哪个高手给你解答
点赞  2012-10-26 14:55
速度这么快啊。学习下,呵呵。
点赞  2012-10-30 13:55

回复 沙发 蓝雨夜 的帖子

楼主用的这些宏定义不错哈。
点赞  2012-10-31 01:56
都有人用上了没?
点赞  2013-3-5 16:46
楼主大大~~~,我修改UART的波特率为115200,结果数据接收错误,求解答。
GP1CON |= BIT0 + BIT4;    // 硬件接口选择P1.0和P1.1
COMCON0 = BIT7;        
COMDIV0 = 0x3;      
COMDIV1 = 0x00;
COMCON0 = BIT0 + BIT1 + BIT2;
IRQ=BIT11;
点赞  2016-9-27 10:12
引用: zxc940107 发表于 2016-9-27 10:12
楼主大大~~~,我修改UART的波特率为115200,结果数据接收错误,求解答。
GP1CON |= BIT0 + BIT4; ...

GP1CON |= BIT0 + BIT4;    // 硬件接口选择P1.0和P1.1
COMCON0 = BIT7;        
COMDIV0 = 0x2;      
COMDIV1 = 0x00;
COMDIV2=0x31c+BIT11+BIT15
COMCON0 = BIT0 + BIT1 + BIT2;
COMIEN0=BIT0+BIT1;
IRQEN=BIT11;
点赞  2016-10-12 10:50
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复