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

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可以选择晶振,或外部时钟。:

02-JZ2440裸机学习之系统时钟和UART串口实验_第1张图片02-JZ2440裸机学习之系统时钟和UART串口实验_第2张图片

1.3PLL

两种PLL:

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

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

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

02-JZ2440裸机学习之系统时钟和UART串口实验_第3张图片


怎么设置FCLK HCLK PCLK

(1)    晶振—PLL—400M

02-JZ2440裸机学习之系统时钟和UART串口实验_第4张图片

02-JZ2440裸机学习之系统时钟和UART串口实验_第5张图片

所涉及寄存器:

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

l  PLL寄存器

l  分频寄存器

(1)锁定时间

voidclock_init(void)

{

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

02-JZ2440裸机学习之系统时钟和UART串口实验_第6张图片

(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 */

   }   

02-JZ2440裸机学习之系统时钟和UART串口实验_第7张图片

(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"        /* 写入控制寄存器 */

);

02-JZ2440裸机学习之系统时钟和UART串口实验_第8张图片


2、2440串口

02-JZ2440裸机学习之系统时钟和UART串口实验_第9张图片02-JZ2440裸机学习之系统时钟和UART串口实验_第10张图片

(1)串口初始化

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

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

02-JZ2440裸机学习之系统时钟和UART串口实验_第11张图片

中断方式

02-JZ2440裸机学习之系统时钟和UART串口实验_第12张图片

时钟选择

02-JZ2440裸机学习之系统时钟和UART串口实验_第13张图片

Fifo

   UFCON0  = 0x00;     // 不使用FIFO

02-JZ2440裸机学习之系统时钟和UART串口实验_第14张图片

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

02-JZ2440裸机学习之系统时钟和UART串口实验_第15张图片

UBRDIV0波特率设置寄存器

02-JZ2440裸机学习之系统时钟和UART串口实验_第16张图片

发送接收函数

(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;
}

02-JZ2440裸机学习之系统时钟和UART串口实验_第17张图片

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

    while (!(UTRSTAT0 & TXD0READY));



你可能感兴趣的:(S3C2440,S3C2440学习之旅)