我的博客更详细,也有其它试验: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)));
}
} |