S3C2440裸奔之uart0使用

写给正打算接触嵌入式的朋友们分享,行家就不用看了 一个很简单的程序 而且还是修改的别人的

功能:从终端(键盘)接收数据 回发到终端(串口)显示

开发板: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());
	}
	
}

该程序说明: 该程序为W35(320*240)LCD显示屏显示+触摸屏驱动程序+UART0通信 显示文字取模软件使用说明: 该显示程序用到的取模方式为:阴码、列行式、逆向、十六进制。在软件菜单选项中设定。 该程序可以在LCD显示数字、字母、汉字,显示的汉字要先用取模软件进行取模后,才能用。 触摸屏可以识别了,做了个小实例,按左边黄色的矩形框,显示“你好”,按右边的框,显示“LOVE” UART0串口通信 接收上位机发送命令,采用中断方式完成。(1、2、3) 接收为正确指令,发送相应回答。 接收为不正确指令,发送“please input 1/2/3” int main(void) { int i; U8 key; U32 mpll_val = 0 ; Port_Init(); Isr_Init(); i = 2 ; //hzh, don't use 100M! //boot_params.cpu_clk.val = 3; switch ( i ) { case 0: //200 key = 12; mpll_val = (92<<12)|(4<<4)|(1); break; case 1: //300 key = 13; mpll_val = (67<<12)|(1<<4)|(1); break; case 2: //400 key = 14; mpll_val = (92<<12)|(1<<4)|(1); break; case 3: //440!!! key = 14; mpll_val = (102<<12)|(1<<4)|(1); break; default: key = 14; mpll_val = (92<<12)|(1<>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3); ChangeClockDivider(key, 12); cal_cpu_bus_clk(); consoleNum = 0; // Uart 0 select for debug. Uart_Init( 0,115200 ); //串口初始化 Uart_Select( consoleNum ); uart0_int(); //串口中断初始化 #if 0 UsbdMain(); MMU_Init(); //MMU should be reconfigured or turned off for the debugger, #else MMU_Init(); //hzh #ifdef DEBUG_VERSION #endif #endif Uart_Printf("please input 1/2/3 \n"); uarttem=0; while(1) { switch(uarttem) { case '1': Uart_Printf("我是小丑!\n"); uarttem=0; break; case '2': Uart_Printf("但我很自信!\n"); uarttem=0; break; case '3': Uart_Printf("我也有梦想!\n"); uarttem=0; break; default: break; } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sanzhong104204

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值