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

    xiaoxiao2021-03-25  14

    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));

    转载请注明原文地址: https://ju.6miu.com/read-200029.html

    最新回复(0)