4599|8

1071

帖子

7

TA的资源

纯净的硅(中级)

楼主
 

ADuc7026学习-串口 [复制链接]

本帖最后由 dj狂人 于 2015-1-12 17:23 编辑

                                                                             ADuc7026学习-串口

          折腾完串口插头,串口算是折腾出来了。现在信息收发都可以。
          在串口开撸之前,首先我们来配置下系统时钟。
          ADuc7026内部集成有一个32.768KHz的振荡器,一个时钟分频器和一个锁相环(PLL)。 PLL可以锁住内部振荡器或外部32.768 KHz晶振,为系统产生一个稳定的41.78 MHz时钟(UCLK)。系统时钟默认8分频,也即工作在5.22MHz,所以在使用串口之前我们要把系统时钟配置为合适的值。
          配置系统时钟我们需要用到PLLKEYx(x=1,2)、PLLCON、POWKEYx(x=1,2)、POWCON六个寄存器,其中
PLLCON 是一个八位的寄存器,用于选择时钟源(内部时钟源、外部晶振、P0.7引脚上的外部时钟)。其中
7~6 保留。
5  32KHZ PLL 输入选择。置 1, 使用内部 32KHz 振荡器。默认值设置。清 0,使用外部 32KHz 晶振。
4~2 保留。
1~0 配置时钟模式。
       00 保留。
       01 PLL. 默认配置。
       10 保留。
       11 在 P0.7 引脚上的外部时钟。
POWCON 也是一个八位的寄存器,它用于配置系统时钟的工作模式以及分频。其中
7 保留。
6~4  配置PC 工作模式。
        000 Active 模式。
        001 Pause 模式。
        010 NAP 。
        011 Sleep 模式。 IRQ0 至 IRQ3 和定时器2 可以唤醒该器件。
        100 Stop 模式 IRQ0 至 IRQ3 可以唤醒该器件。
        其他 保留。
3 保留。
2~0  配置CPU 时钟分频。
        000 41.78 MHz.
        001 20.89 MHz.
        010 10.44 MHz.
        011 5.22 MHz.
        100 2.61 MHz.
        101 1.31 MHz.
        110 653 kHz.
        111 326 kHz.
而为了防止意外编程,写入PLLCON和POWCON寄存器时需要遵循特定的时序,即需要对PLLKEYx、POWKEYx写入相应的值。具体如下
Void SysClkInit(void)
{
    PLLKEY1=0xAA;
        PLLCON=0x21;   //PLL配置,选择内部32KHz振荡器以及默认设置  
        PLLKEY2=0x55;
/*这时对PLLCON进行写操作的标准时序,即先对PLLKEY1写0xAA,在对PLLCON进行写操作,之后对PLLKEY2写0x55,不然对PLLCON写操作无效。同理,对POECON进行写操作也需要相应的操作,如下*/
        POWKEY1=0x01;
        POWCON=0x00;  //配置CPU时钟,选择Active模式,不分频41.78MHz
        POWKEY2=0xF4;
}
这样,我们的系统时钟便配置好了。

最新回复

nmg
楼主真是与日俱进!  详情 回复 发表于 2015-1-13 10:08

赞赏

1

查看全部赞赏

点赞 关注
 
 

回复
举报

1071

帖子

7

TA的资源

纯净的硅(中级)

沙发
 
本帖最后由 dj狂人 于 2015-1-12 17:19 编辑


     接下来我们开始进行串口使用前的一些初始化,要初始化串口我们需要用到COMCON0、COMDIV0、COMDIV1、COMSTA0、COMTX、COMRX 这六个寄存器。其中

COMDIV0、COMDIV1 用于选择波特率(有两种方式发生UART波特率,普通的450 UART波特率发生器和小数分频器,这里我们讲的是普通的450UART波特率发生器)。

COMTX、COMRX分别是发送寄存器和接收寄存器。其中COMDIV0 和COMTX、COMRX共用同一个地址。当COMCON0寄存器的第7位为0时,COMTX和COMRX可以被存取。当COMCON0寄存器的第7位为1时,存取COMDIV0。

COMCON0 是线路控制寄存器。其中
7 DLAB 分频锁存访问。置 1 ,可以访问COMDIV0 和COMDIV1 寄存器。清 0 ,可以访问 COMRX 和COMTX 寄存器。
6 BRK 设置断点位。置 1 ,可以强制 SOUT 至零。清0,工作在正常模式。
5 SP 附加奇偶校验位。置 1 ,则附加奇偶校验位:,若 EPS = 1 , PEN = 1,附加位为 1 ;若 EPS =0 ,PEN =1 则附加位为 0 。
4 EPS 偶校验选择位。置 1 为偶校验。 清 0 为奇校验。
3 PEN 奇偶校验使能位。置 1 ,发送奇偶校验位并进行奇偶校验。清 0 ,则不发送奇偶校验位也不进行奇偶校验。
2 STOP 停止位。置 1 ,如果数据长度为 5 位则传送 1.5个停止位; 如果数据长度为 6 、 7 或 8 位则传送 2个停止位。不管停止位有多少,接收器只检查第一个停止位。清 0 ,在发送的数据中只有一个停止位。
1~0 WLS 数据长度选择位: 00 = 5 位、 01 =6 位、 10 = 7位、 11 = 8 位

COMSTA0 为总线状态寄存器,在这里我们只用到它的第五位和最低位,第五位是COMTX 和 COMRX 空状态指示位 。如果COMTX 和 COMRX 同时空该位自动置 1 。当其中一个寄存器接收到数据后该位自动清 0 ;最低位则是数据准备就绪位。 COMRX 满时该位自动置 1 。读 COMRX 后该位清 0 。。(利用COMSTA0可以有效防止发送数据和接收数据发生冲突)。

 
 
 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

板凳
 
本帖最后由 dj狂人 于 2015-1-12 17:20 编辑


     当然和UART有关的寄存器不止这几个,但是实现简单的串口工功能用到这几个就够了,接下来我们编程实现串口的初始化以及发送/接收数据。

#include
Void SysClkInit(void);
Void Send_StringChar(unsignedchar * dat);
int main(void)
{
    unsigned char i=0;
        unsigned char receive[10];  
        SysClkInit();/*配置系统时钟,系统时钟默认为5.22MHz,这里配置成41.78MHz,SysClkInit()函数相关声明前面有讲。*/
        GP1CON = 0x11;/* 将P1.0和P1.1分别配置为rx和tx引脚。ADUC702X 系列单片机有两个 UART 串口,分别是P1.0(SIN) & P1.1(SOUT), P0.7(SIN)& P2.0(SOUT)。*/
    COMCON0 = 0x080;      // 将DLAB置位寻址COMDIV0和COMDIV1
    COMDIV0= 0x088 ;     
    COMDIV1= 0x000;      // 配置DIV0和 DIV1,这里是设置波特率为9600
    COMCON0= 0x003;      // 将DLAB 清零,方便后面寻址COMTX或COMRX
    while(i<5)//接收够五个单字节字符的数据后退出循环
    {
       while(!(0x01==(COMSTA0 & 0x01))); //等待接收数据
       receive[i++] = COMRX;
    }
    Send_StringChar(receive);    //打印接收到的信息
    Send_StringChar("\n");        //打印换行符
    Send_StringChar("Hello EEWorld World\n");
        //打印"HelloEEWorld World\n"

        While(1);
}
Void Send_StringChar(unsignedchar * dat)
{
    While(*dat != ‘\0’)
       {
        while(!(0x020==(COMSTA0 & 0x020)));
        COMTX = *dat++;
       }
}
VoidSysClkInit(void)
{
    PLLKEY1=0xAA;
        PLLCON=0x21;   //PLL配置,选择内部32KHz振荡器以及默认设置  
        PLLKEY2=0x55;
        POWKEY1=0x01;
        POWCON=0x00;  //配置CPU时钟,选择Active模式,不分频41.78MHz
        POWKEY2=0xF4;
}
    这样我们便实现了简单的使用串口进行数据的接收/发送。好,撸完收工

 
 
 

回复

1

帖子

1

TA的资源

一粒金砂(初级)

4
 
    。。。。。。。。。。。。。。。。
 
 
 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

5
 
23lengfeng 发表于 2015-1-12 19:59
。。。。。。。。。。。。。。。。



 
 
 

回复

403

帖子

6

TA的资源

纯净的硅(中级)

6
 
没用过ADI的单片机,只能这里精神支持了

点评

恩 谢谢,ADuc7026这款芯片还是不错的,它里面的硬件资源不多也不少,给人一种小巧的感觉。特别是它的寄存器少。要不我也没法那么嚣张的直接面对寄存器编程,哈哈  详情 回复 发表于 2015-1-13 09:55
个人签名如果天空是黑暗的,那就摸黑生存;如果发出声音是危险的,那就保持沉默...但不要习惯了黑暗就为黑暗辩护;不要为自己的苟且而得意;不要嘲讽那些比自己更勇敢热情的人们。人可以卑微如尘土,不可扭曲如蛆虫。
 
 
 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

7
 
jackfrost 发表于 2015-1-13 08:40
没用过ADI的单片机,只能这里精神支持了



恩  谢谢,ADuc7026这款芯片还是不错的,它里面的硬件资源不多也不少,给人一种小巧的感觉。特别是它的寄存器少。要不我也没法那么嚣张的直接面对寄存器编程,哈哈

点评

nmg
楼主真是与日俱进!  详情 回复 发表于 2015-1-13 10:08
 
 
 

回复

5263

帖子

239

TA的资源

管理员

8
 
dj狂人 发表于 2015-1-13 09:55
恩  谢谢,ADuc7026这款芯片还是不错的,它里面的硬件资源不多也不少,给人一种小巧的感觉。特别是它的寄存器少。要不我也没法那么嚣张的直接面对寄存器编程,哈哈



楼主真是与日俱进!
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

点评

主要是论坛送的芯片给力  详情 回复 发表于 2015-1-13 11:18
 
 
 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

9
 
nmg 发表于 2015-1-13 10:08
楼主真是与日俱进!


主要是论坛送的芯片给力

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表