您的位置:首页 > 其它

02-JZ2440裸机学习之系统时钟和UART串口实验

2017-03-28 22:48 288 查看
1、S3C2440的系统时钟

1.1、2440的几种频率

笔记本CPU可以 1G 2G ,内存133M等

2440CPU:400MHz -------FCLK-----CPU

SDRAM:100M/133M---- HCLK----存储区控制器,中断控制器,LCD,DMA,USB主机模块

串口IIC: -------------------PCLK----IIS,IIC,PWM,MMC,SD,ADC,UART,GPIO,RTC,SPI

定时器:---------------------PCLK

1.2时钟选择与启动方式选择

 S3C2440可以选择晶振,或外部时钟。:





1.3PLL

两种PLL:

(1)MPLL:产生F/H/PCLK

(2)UPLL:提供48M的USB时钟信号UCLK

通过设置时钟寄存器(称为PLL),把晶振频率变为其他频率,12变为400MHz。400分频为100M,50M等。



怎么设置FCLK HCLK PCLK

(1)    晶振—PLL—400M





所涉及寄存器:

l  锁定时间内调整频率,锁定时间可以设定

l  PLL寄存器

l  分频寄存器

(1)锁定时间

voidclock_init(void)

{

// LOCKTIME = 0x00ffffff;   //使用默认值即可



(2)PLL相关寄存器

    /* 判断是S3C2410还是S3C2440*/

   if ((GSTATUS1 == 0x32410000) || (GSTATUS1 == 0x32410002))

    {

       MPLLCON = S3C2410_MPLL_200MHZ;  /*现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */

    }

   else

    {

       MPLLCON = S3C2440_MPLL_200MHZ;  /*现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */

   }   



(3)分频

 400M—分频--

   CLKDIVN  = 0x03;            // FCLK:HCLK:PCLK=1:2:4,HDIVN=1,PDIVN=1

 

   /* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */

__asm__(

   "mrc    p15, 0, r1, c1, c0,0\n"        /* 读出控制寄存器 */

   "orr    r1, r1,#0xc0000000\n"          /* 设置为“asynchronous bus mode” */

   "mcr    p15, 0, r1, c1, c0,0\n"        /* 写入控制寄存器 */

);



2、2440串口





(1)串口初始化

初始化:引脚设置UART,数据位,校验位,停止位,波特率

ULCON0  =0x03;     // 8N1(8个数据位,无较验,1个停止位)



中断方式



时钟选择



Fifo

   UFCON0  = 0x00;     // 不使用FIFO



UMCON0  = 0x00;    // 不使用流控



UBRDIV0波特率设置寄存器



发送接收函数

(1)    发送

/*

 * 发送一个字符

 */

void putc(unsigned char c)

{

    /* 等待,直到发送缓冲区中的数据已经全部发送出去 */

    while (!(UTRSTAT0 &TXD0READY));

   

    /* 向UTXH0寄存器中写入数据,UART即自动将它发送出去 */

    UTXH0 = c;

}

/*

 * 接收字符

 */

unsigned char getc(void)

{

    /* 等待,直到接收缓冲区中的有数据 */

    while (!(UTRSTAT0 & RXD0READY));

    

    /* 直接读取URXH0寄存器,即可获得接收到的数据 */

    return URXH0;

}
/*

 * 判断一个字符是否数字

 */

int isDigit(unsigned char c)

{

    if (c >= '0' && c <= '9')

        return 1;

    else

        return 0;       

}

/*

 * 判断一个字符是否英文字母

 */

int isLetter(unsigned char c)

{

    if (c >= 'a' && c <= 'z')

        return 1;

    else if (c >= 'A' && c <= 'Z')

        return 1;       

    else

        return 0;

}

int main()

{

    unsigned char c;

    uart0_init();   // 波特率115200,8N1(8个数据位,无校验位,1个停止位)

    while(1)

    {

        // 从串口接收数据后,判断其是否数字或子母,若是则加1后输出

        c = getc();

        if (isDigit(c) || isLetter(c))

            putc(c+1);

    }

    return 0;

}



    /* 等待,直到发送缓冲区中的数据已经全部发送出去 */

    while (!(UTRSTAT0 & TXD0READY));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: