打印

s3c2440 UART裸奔试验-给新手看

[复制链接]
3715|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qiang1092|  楼主 | 2009-8-14 20:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的博客更详细,也有其它试验:http://chenjunqiang08.blog.163.com

试验目的:会用串口,了解一下串口寄存器。

试验环境:tq2440开发板+J-link+ADS

试验过程:

1.连上j-link,开发板上电。

2.c语言编写试验代码,并包含所需要的启动代码等文件。

3.设置ADS的RO Base为0x40000000,仿真。


4.重新设置ADS的RO Base为0x00000000。下载到板子的0地址,观察现象。

5.试验参考代码:
#include "2440addr.h"

#define PCLK 50000000//PCLK值,大小一定弄对
#define UART_BAUD 115200//串口波特率


void Delay(int a)//延时函数
{
int i=a;
while(i--);
}

//send chars发送函数,不用中断了,发完一个字符接着发下一个
void uart0_print(unsigned char * pbuf)
{
while((*pbuf)!='\0')//如果不是结束符就发。the current char is not over;
{
  while(!(rUTRSTAT0&0x2));//wait until send buffer is empty;
  rUTXH0=*pbuf;//send one char
  pbuf++;//the next char;
}
}

//receive chars。接受函数,采用中断方式,
//让CPU有时间干别的,不然总是在等待接受
void __irq uart0_receive()
{
unsigned char rec[2];//定义一个接受区,
rec[1]='\0';//后一个存结束符,便于发送。
rec[0]=rURXH0;//放在第一个
uart0_print(rec);//发送回去

//注意要先清楚子中断源,不然会产生两次中断,
//关于原因,请参考我写的关于中断的**,明天写,稍等啊
ClearSubPending(BIT_SUB_RXD0);
ClearPending(BIT_UART0);//清除中断标志SRCPND
}

//按键1的中断函数,按下会发送:我是Phoenix
void __irq Int1()
{
unsigned char buf_send[]="I am Phoenix !!";
Delay(500000);//延时一下,不然你按下一次按键会发生好多次中断
ClearPending(BIT_EINT1);//清除中断标志SRCPND
uart0_print(buf_send);//发送
}

//uart0 initialize,串口0初始化
void uart0_init()
{
rGPHCON|=0xaa;//use GPH port as uart0
rGPHUP=0x0f;//the pull up function is disabled

rULCON0=0x03;//data bits=8,stop bit=1,no parity
rUCON0=0x05;//PCLK for UART baud rate,interrupt request or polling mode
rUFCON0=0x0;//no FIFO
rUMCON0=0x0;//no AFC

//一定注意UBRDIV0值的计算,我就弄错了一次,
//主要是确定FCLK,TQ2440:Fin=12MHZ?
//MPLLCON和CLKDIVN的值,请仿真时直接观察寄存器,以防出错
rUBRDIV0=((PCLK/(UART_BAUD*16))-1);//the baud-rate is 115200 bps
}

void interrupt_init()
{
pISR_EINT1=(unsigned int)Int1;//中断处理函数
pISR_UART0=(unsigned int)uart0_receive;//串口收中断函数

rGPFCON=0x2aa;//设置按键为EINT中断
rEXTINT0=0x2;//设置为下降沿触发
rINTMOD=0;//所用中断都是IRQ

//下面开中断,如果你对中断不很熟悉,请看我写的**,(明天写,呵呵)
rINTMSK=0xeffffffd;//开按键和串口的中断
rINTSUBMSK=0x7fe;//开串口收的中断
}
int Main()
{
uart0_init();
interrupt_init();

// 将LED1-4对应的GPB5/6/7/8四个引脚设为输出,
//程序运行时灯闪烁,
rGPBCON =0x55555554;
rGPBDAT=~0;//关闭led

while(1)
{
  Delay(900000);//灯闪烁
  rGPBDAT =(rGPBDAT|(1<<8))&(~(rGPBDAT&(1<<8)));
}
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://chenjunqiang08.blog.163.com/

6

主题

10

帖子

0

粉丝