写给正打算接触嵌入式的朋友们分享,行家就不用看了 一个很简单的程序 而且还是修改的别人的
功能:从终端(键盘)接收数据 回发到终端(串口)显示
开发板:TQ2440 Nandflash启动
开发工具信息:
IDE-Version:
μVision V4.10
Copyright (C) 2010 KEIL, An ARM(R) Company
工程配置:
1.target选项卡
Start Size
ROM1: 0x00 0x10000000
RAM1: 0x30000000 0x4000000
IRAM1: 0x40000000 0x1000
2.user选项卡
Run user programs after build/rebuild:
C:\Program Files\Keil\ARM\BIN40\fromelf.exe --bin --output ./Opt/uart.bin ./Opt/uart.axf
;@******************************************************************************
;@ File:1.S
;@ 功能:设置时钟 关看门狗 跳入main函数 设置SP
;@******************************************************************************
PRESERVE8
IMPORT main
IMPORT disable_watch_dog
IMPORT clock_init
AREA RESET, CODE, READONLY
Reset
ldr sp, =4096 ;@ 设置栈指针到4KB SRAM末尾,以下都是C函数,调用前需要设好栈
bl disable_watch_dog ;@ 关闭WATCHDOG,否则CPU会不断重启
bl clock_init ;@ 设置MPLL,改变FCLK、HCLK、PCLK
ldr pc, =main ;@ 调用main函数
ldr pc, = Reset ;@ 复位 重启
END
//******************************************************************************
// File:2.C
// 功能:几个初始化函数的函数定义
//******************************************************************************
#include <S3C2440.H>
#include "2.h"
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 & (1<<2)));
UTXH0 = c;
}
/*
* 接收字符
*/
unsigned char getc(void)
{
/* 等待,直到接收缓冲区中的有数据 */
while (!(UTRSTAT0 & (1 << 0)));
return URXH0;
}
/*
* 关闭WATCHDOG,否则CPU会不断重启
*/
void disable_watch_dog(void)
{
WTCON = 0; // 关闭WATCHDOG很简单,往这个寄存器写0即可
}
void clock_init(void)
{
int r1; //汇编语句中用到变量r1 汇编之后不一定使用r1寄存器
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;orr r1, r1, #0xc0000000;mcr p15, 0, r1, c1, c0, 0");
MPLLCON = S3C2440_MPLL_200MHZ; /* 现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */
}
//******************************************************************************
// File:2.H
// 功能:几个初始化函数的函数声明 2.C的头文件
//******************************************************************************
#ifndef _3_H_
#define _3_H_
#define S3C2440_MPLL_200MHZ ((0x5c<<12)|(0x01<<4)|(0x02))
#define PCLK 50000000 // 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)
void disable_watch_dog(void);
void clock_init(void);
void uart0_init(void);
void putc(unsigned char c);
unsigned char getc(void);
#endif
//******************************************************************************
// File:3.C
// 功能:main函数
//******************************************************************************
#include "2.h"
int main()
{
uart0_init();
while(1)
{
putc(getc());
}
}