JZ2440裸板之系统时钟和UART实验

发布者:平安心境最新更新时间:2018-10-13 来源: eefocus关键字:JZ2440  系统时钟  UART 手机看文章 扫描二维码
随时随地手机看文章

启动程序源码head.S:

@******************************************************************************

@ File:head.S

@ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行

@******************************************************************************       

   

.extern     main

.text 

.global _start 

_start:

Reset:                  

    ldr sp, =4096                      @ 设置栈指针,以下都是C函数,调用前需要设好栈

    bl  disable_watch_dog      @ 关闭WATCHDOG,否则CPU会不断重启

    // bl是位置无关码,相当于:PCnew = PC + 偏移

    //                                           PCnew = (4+8) + 0x28 = 0x34

    //ldr pc, =disable_watch_dog  这一条指令即为位置相关的,用绝对地址(链接地址)跳转

    

    bl  clock_init                                        @ 设置MPLL,改变FCLK、HCLK、PCLK

    bl  memsetup                                      @ 设置存储控制器以使用SDRAM

    bl  copy_steppingstone_to_sdram     @ 复制代码到SDRAM中

    ldr pc, =on_sdram                               @ 跳到SDRAM中继续执行

on_sdram:

    ldr sp, =0x34000000     @ 设置栈指针

    ldr lr, =halt_loop           @ 设置返回地址

    ldr pc, =main                @ 调用main函数

halt_loop:

    b   halt_loop

=====================================================================

init.c源码:

// init.c: 进行一些初始化

#include "s3c24xx.h"

 

void disable_watch_dog(void);

void clock_init(void);

void memsetup(void);

void copy_steppingstone_to_sdram(void);

// 关闭WATCHDOG,否则CPU会不断重启

void disable_watch_dog(void)

{

    WTCON = 0;  // 关闭WATCHDOG很简单,往这个寄存器写0即可

}

#define S3C2410_MPLL_200MHZ     ((0x5c<<12)|(0x04<<4)|(0x00))

#define S3C2440_MPLL_200MHZ     ((0x5c<<12)|(0x01<<4)|(0x02))

// 对于MPLLCON寄存器,[19:12]为MDIV,[9:4]为PDIV,[1:0]为SDIV

// 有如下计算公式:

//  S3C2410: MPLL(FCLK) = (m * Fin)/(p * 2^s)

//  S3C2440: MPLL(FCLK) = (2 * m * Fin)/(p * 2^s)

//  其中: m = MDIV + 8, p = PDIV + 2, s = SDIV

// 对于本开发板,Fin = 12MHz

// 设置CLKDIVN,令分频比为:FCLK:HCLK:PCLK=1:2:4,

// FCLK=200MHz,HCLK=100MHz,PCLK=50MHz

 

void clock_init(void)

{

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

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

    );

    // 判断是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 

    }       

}

// 设置存储控制器以使用SDRAM

void memsetup(void)

{

    volatile unsigned long *p = (volatile unsigned long *)MEM_CTL_BASE;

    // 这个函数之所以这样赋值,而不是像前面的实验(比如mmu实验)那样将配置值

    // 写在数组中,是因为要生成”位置无关的代码”,使得这个函数可以在被复制到

    // SDRAM之前就可以在steppingstone中运行

     

    // 存储控制器13个寄存器的值 

    p[0] = 0x22011110;     //BWSCON

    p[1] = 0x00000700;     //BANKCON0

    p[2] = 0x00000700;     //BANKCON1

    p[3] = 0x00000700;     //BANKCON2

    p[4] = 0x00000700;     //BANKCON3  

    p[5] = 0x00000700;     //BANKCON4

    p[6] = 0x00000700;     //BANKCON5

    p[7] = 0x00018005;     //BANKCON6

    p[8] = 0x00018005;     //BANKCON7    

                            

    // HCLK=12MHz:  0x008C07A3,

    // HCLK=100MHz: 0x008C04F4                                              

    p[9]  = 0x008C04F4;     //REFRESH

    

    p[10] = 0x000000B1;     //BANKSIZE

    p[11] = 0x00000030;     //MRSRB6

    p[12] = 0x00000030;     //MRSRB7

}

void copy_steppingstone_to_sdram(void)

{

    unsigned int *pdwSrc  = (unsigned int *)0;

    unsigned int *pdwDest = (unsigned int *)0x30000000;

    

    while (pdwSrc < (unsigned int *)4096)

    {

        *pdwDest = *pdwSrc;

        pdwDest++;

        pdwSrc++;

    }

}

=====================================================================

serial.h源码:

void uart0_init(void);

void putc(unsigned char c);

unsigned char getc(void);

int isDigit(unsigned char c);

int isLetter(unsigned char c);

=====================================================================

serial.c源码:

#include "s3c24xx.h"

#include "serial.h"

#define TXD0READY   (1<<2)

#define RXD0READY   (1)

#define PCLK                50000000           // init.c中的clock_init函数设置PCLK为50MHz

#define UART_CLK        PCLK                  //  UART0的时钟源设为PCLK

#define UART_BAUD_RATE  115200      // 波特率

#define UART_BRD        ((UART_CLK  / (UART_BAUD_RATE * 16)) - 1)

// 初始化UART0

// 115200,8N1,无流控

void uart0_init(void)

{

    GPHCON  |= 0xa0;           // GPH2,GPH3用作TXD0,RXD0

    GPHUP   = 0x0c;              // GPH2,GPH3内部上拉

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

    UCON0   = 0x05;             // 查询方式,UART时钟源为PCLK

    UFCON0  = 0x00;            // 不使用FIFO

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

    UBRDIV0 = UART_BRD;  // 波特率为115200

}

// 发送一个字符

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;

}

=====================================================================

main.c源码:

#include "serial.h"

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;

}

=====================================================================

Makefile文件:

objs := head.o init.o serial.o main.o

uart.bin: $(objs)

    arm-linux-ld -Tuart.lds -o uart_elf $^

    arm-linux-objcopy -O binary -S uart_elf $@

    arm-linux-objdump -D -m arm uart_elf > uart.dis

    

%.o:%.c

    arm-linux-gcc -Wall -O2 -c -o $@ $<

%.o:%.S

    arm-linux-gcc -Wall -O2 -c -o $@ $<

clean:

    rm -f uart.bin uart_elf uart.dis *.o        

=====================================================================

uart.lds文件:

SECTIONS {

    . = 0x30000000;

    .text            : { *(.text) }

    .rodata ALIGN(4) : {*(.rodata)} 

    .data ALIGN(4)   : { *(.data) }

    .bss ALIGN(4)    : { *(.bss)  *(COMMON) }

}


关键字:JZ2440  系统时钟  UART 引用地址:JZ2440裸板之系统时钟和UART实验

上一篇:JZ2440裸板之LCD实验
下一篇:JZ2440裸板之中断控制器

推荐阅读最新更新时间:2024-03-16 16:16

arm9为何上电时候要改变系统时钟
因为在没有上电时候,开发板是工作在12Mhz,那么用到时钟的硬件资源比如cpu 内存 uart等也工作在12Mhz,那么我知道正常情况下也即上电的话,开发板是工作在500Mhz,这样的话,需要一个切换的过程,这个过程如下: 1 系统工作时钟频率 在对系统时钟进行提速之前,让我们先来了解下 S3C2440 上的工作时钟频率, FCLK , HCLK , PCLK ,其中 FCLK 主要为 ARM920T 内核提供工作频率,如图 2-44 所示: 图 2-44 ARM920T 内核结构 HCLK 主要为 S3C2440 AHB 总线( Advanc
[单片机]
arm9为何上电时候要改变<font color='red'>系统</font><font color='red'>时钟</font>
SM2965微控制器及其ISP应用技术
  “在系统编程”(In-SystemProgramming,简称ISP)技术的出现是对传统编程方法的重大突破,它是指在用户设计的微控制器系统中为配置新的系统功能而对器件进行重新编程,并在线地将程序代码(固件)下载到程序存储器中的一种编程技术,继SST公司推出具备ISP功能的FlashFlex51系列微控制器之后,PHILISPS、WINBOND、LG、 ATMEL、SynC- MOS等公司都相继推出了具有ISP/IAP(In-Appli-cation Programming)功能的51系列微控制器,这些器件的增强性能主要表现在下面几方面:   (1)内部ROM采用FLASH存储器,容量可达32~64k字节,内部RAM容量可达51
[单片机]
SM2965微控制器及其ISP应用技术
s3c2440裸机-UART编程(一、UART硬件介绍及传输原理)
1.uart硬件介绍UART的全称是Universal Asynchronous Receiver and Transmitter(异步收发器)。 uart主要用于: 1.打印调试 2.数据传输 串口通过三根线即可,发送、接收、地线。 pc的TxD - arm的RxD (UART write) arm的TxD - pc的RxD (UART read) 2.uart的参数和格式 波特率:表示每秒传输多少bit,bits per second(bps).一般波特率都会有9600,19200,115200等选项。 格式: 起始位: 先发出一个逻辑”0”的信号,表示传输数据的开始。 数据位:可以是5~8位逻辑”0”或”1”。一般7
[单片机]
s3c2440裸机-<font color='red'>UART</font>编程(一、<font color='red'>UART</font>硬件介绍及传输原理)
STM8 时钟安全系统(CSS)
时钟安全系统用于监控HSE时钟源是否失效。当fMASTER使用HSE做为时钟源时,如果HSE时钟由于谐振器损坏、断开或其它原因而失效,时钟控制器将激活安全恢复机制,将fMASTER自动切换到辅助时钟源HSI/8。STM8系统将一直使用辅助时钟源,直至MCU被复位。 设置时钟安全系统寄存器CLK_CSSR中的CSSEN位,可使能STM8的时钟安全系统。为安全起见,CSS一旦使能就不能被关闭,直到下一次复位。 必须满足下面的条件,CSS方可检测HSE石英晶体的失效: HSE晶体开:(外部时钟寄存器CLK_ECKR中的位HSEEN=1) HSE振荡器被置为石英晶体(选项位EXTCLK为1) CSS功能开:(寄存器CLK_CSSR
[单片机]
一文搞懂UART通信协议
UART(Universal Asynchronous Receiver/Transmitter)通信协议是一种常见的串口通信协议,它广泛应用于嵌入式系统和计算机通信中。本文将介绍UART通信协议的基本原理、通信流程和常见应用场景,帮助读者了解UART通信协议。 一、UART通信协议基本原理 UART通信协议是一种异步通信协议,它通过串口将数据传输到另一个设备。UART通信协议的传输方式是并行传输,即每个字节的数据同时通过多个数据位进行传输,而不是像串行传输一样按照顺序逐位传输。 UART通信协议的传输速率是由波特率(Baud Rate)决定的,波特率表示每秒钟传输的比特数。例如,如果波特率为9600,就表示每秒钟传输9600
[单片机]
e络盟开售Analog Devices多通道系统时钟器件
中国上海,2023年4月21日 – 安富利旗下全球电子元器件产品与解决方案分销商e络盟宣布开售Analog Devices的AD-SYNCHRONA14-EBZ多通道系统时钟器件。 AD-SYNCHRONA14-EBZ是一款独立器件,非常适合用于对需要高精度频率和相位控制源时钟的应用进行评估和原型设计。该器件基于AD9545和HMC7044而设计,大大简化了复杂系统中的时钟分配和多通道同步。 AD-SYNCHRONA14-EBZ专为经过培训的专业人员在实验室环境中使用,而不能作为最终产品进行商用。它既可以作为一个完整的参考设计,也可根据需要自定义设计,用于各种最终客户应用中。用户还可以免费获取完整的设计详细信息。 A
[网络通信]
e络盟开售Analog Devices多通道<font color='red'>系统</font><font color='red'>时钟</font>器件
STM32如何使用内部时钟源当系统时钟
由于最近老师让做一个项目,要用到STM32但是考虑成本问题,决定不用外部时钟,所以在网上搜集整理了一些资料,加上自己的一些想法。 参考资料: http://bbs.ednchina.com/BLOG_ARTICLE_3011869.HTM http://bbs.21ic.com/icview-587714-1-1.html 首先在主程序中注释掉SystemInit(); 然后使用下面的函数做为系统时钟的初始化函数 void RCC_Configuration(void) { RCC_DeInit();//将外设 RCC寄存器重设为缺省值 RCC_HSICmd(ENABLE);//使能HSI
[单片机]
STM32如何使用内部<font color='red'>时钟</font>源当<font color='red'>系统</font><font color='red'>时钟</font>
DMA和UART的深刻认识--串口接收的3种工作方式(附STM32F4代码)
可能会遇到的问题: 1.能实现接收但不发送 注意是否是识别函数出错 2.DMA单次传输模式要求再初始化,否者出现第二次中断不执行。使用循环模式出现的问题是要结合配置公式: 3.DMA再次初始化不完全,会出现接收一次成功,再来一次不行。第三次能接收的问题 4.串口调试连续点击的次数太快,会使的里面的发送程序出错 一.串口uart中断接收 遇到的问题: 1、串口调试接收引脚坏掉 2.接收数据识别,使用的库函数出错 串口设置的一般步骤可以总结为如下几个步骤: 1) 串口时钟使能, GPIO 时钟使能。 2) 设置引脚复用器映射:调用 GPIO_PinAFConfig 函数。 3) GPIO 初始
[单片机]
DMA和<font color='red'>UART</font>的深刻认识--串口接收的3种工作方式(附STM32F4代码)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
发布文章
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved