⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xdbgu.c

📁 ads7843+5个串口+1个定时器+at91rm9200测试源程序
💻 C
字号:
//*********************************************************************************************************************
//【  版          权  】Copyright (c) 2007-2008 http://gliethttp.cublog.cn
//
//【  文  件  版  本  】v1.x
//
//【  文  件  名  称  】XDBGU.c
//
//【  创  建  日  期  】2007-12-27
//
//【  功  能  描  述  】
//*********************************************************************************************************************
#include <XDBGU.h>
#include <stdarg.h>
#include <string.h>
/*
void DBGU_IRQ_proc(void)
{uint32 dummy;
	dummy = AT91C_BASE_ST->ST_SR;
	if( (dummy & 0x04) == 0 )
	{//串口引发中断
		goto XST_IRQ_Handler_Exit;
	}else
		{
			return;
		}
	
XST_IRQ_Handler_Exit:
	{	
		if(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXBUFF)
		{volatile static Boolean first = true;
			if(xDBGU_proc_over == true)
			{//串口接收到数据
				if(first == true)
				{
					if(xDBGU_proc_rcve_buf[0] == 0xf7)
					{int32 len;
						static Boolean cmd_first = true;
						 if(cmd_first == true)
						 {
						 	AT91C_BASE_DBGU->DBGU_RCR = 3;
						 	cmd_first = false;
						 }else
						 	 {
								cmd_first = true;
								//xDBGU_proc_rcve_buf[0] = xDBGU_proc_rcve_buf[1];
								//AT91C_BASE_DBGU->DBGU_RPR = (uint32)&xDBGU_proc_rcve_buf[1];
								len = xDBGU_proc_rcve_buf[1] + (xDBGU_proc_rcve_buf[2] << 8) - 4;
								if(len <= 0)
								{
									first = true;
									if(len == 0)
									{
										AT91F_US_DisableIt((AT91PS_USART) AT91C_BASE_DBGU, AT91C_US_ENDRX );
										xDBGU_proc_over = false;
										//xxxdprintf("无长度命令\r\n");
										OSQPost(XQ_buf_DBGU,(void*)1);
									}else
										{
											AT91C_BASE_DBGU->DBGU_RPR = (uint32)xDBGU_proc_rcve_buf;
											AT91C_BASE_DBGU->DBGU_RCR = 1;//sizeof(_xpccmd);
											dprintf("命令数据长度不匹配!\r\n");
										}
								}else
									{
										if(len <= xDBGU_proc_rcve_buf_MAX)
										{
											AT91C_BASE_DBGU->DBGU_RCR = len;
											first = false;
										}else
											{
												first = true;
												AT91C_BASE_DBGU->DBGU_RPR = (uint32)xDBGU_proc_rcve_buf;
												AT91C_BASE_DBGU->DBGU_RCR = 1;
												dprintf("数据长度超长!\r\n");
											}
										//dprintf("收到命令f7\r\n");
									}
							 }
					}else
						{
							AT91C_BASE_DBGU->DBGU_RPR = (uint32)xDBGU_proc_rcve_buf;
							AT91C_BASE_DBGU->DBGU_RCR = 1;
						}
				}else
					{
						first = true;
						AT91F_US_DisableIt((AT91PS_USART) AT91C_BASE_DBGU, AT91C_US_ENDRX );
						xDBGU_proc_over = false;
						AT91F_US_DisableRx((AT91PS_USART) AT91C_BASE_DBGU);
						OSQPost(XQ_buf_DBGU,(void*)1);
					}
			}
		}
	}
}
*/
//---------------------------------------------------------------------------------------------------------------------
//【  版          本  】v1.0
//【  函  数  名  称  】void XDBGU_ini(void)
//【 创建人及创建时间 】葛立新 2005-12-06 17:21
//【 修改人及修改时间 】
//【  修  改  原  因  】
//【  功  能  描  述  】
//---------------------------------------------------------------------------------------------------------------------
void XDBGU_ini(void)
{//static char data[]="DBGU的PDC测试数据!\r\n";
	AT91F_DBGU_CfgPIO();
	AT91F_DBGU_CfgPMC();
	AT91F_US_Configure (
		(AT91PS_USART) AT91C_BASE_DBGU,				// DBGU基址
		GMCLK,            							// GMCLK
		AT91C_US_ASYNC_MODE ,        				// mode Register to be programmed
		115200 ,                   					// baudrate to be programmed
		0);                        					// timeguard to be programmed
	//发送使能
	AT91F_US_EnableTx((AT91PS_USART) AT91C_BASE_DBGU);
	//接收使能
	//AT91F_US_EnableRx((AT91PS_USART) AT91C_BASE_DBGU);
	//-------------------------------------------------
//	AT91F_PDC_Open(AT91C_BASE_PDC_DBGU);
//	AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,
//						 AT91C_ID_SYS,
//						 XXSYS_IRQprio,
//						 AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,
//						 DBGU_IRQ_proc);
	
	AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RSTRX;
//	AT91C_BASE_DBGU->DBGU_RPR = (uint32)xDBGU_proc_rcve_buf;
	AT91C_BASE_DBGU->DBGU_RCR = 1;//sizeof(_xpccmd);
	AT91F_US_EnableIt((AT91PS_USART) AT91C_BASE_DBGU, AT91C_US_ENDRX );
	AT91C_BASE_DBGU->DBGU_CR = AT91C_US_RXEN;
	
	AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_SYS);

//	xDBGU_context->print_x = false;
//	xDBGU_context->updateing = false;
	
//	#if xPrint_IRQ_Addr
//	{static char data[100];
//		sprintf(data,"第%ld个:DBGU_IRQ_proc=0x%lx\r\n",++context.IRQ_NUMS,(uint32)DBGU_IRQ_proc);
//		xxxdprintf(data);
//	}
//	#endif
}
//---------------------------------------------------------------------------------------------------------------------
//【  版          本  】v1.0
//【  函  数  名  称  】void xxxdprintf(void)
//【 创建人及创建时间 】gliethttp 2007-12-27
//【 修改人及修改时间 】
//【  修  改  原  因  】
//【  功  能  描  述  】
//---------------------------------------------------------------------------------------------------------------------
void xxxdprintf(void *fmt)
{char *data = fmt;	
    for(;*data;)
    {
    	while( !(AT91C_BASE_DBGU->DBGU_CSR & 0x02) );
		AT91C_BASE_DBGU->DBGU_THR = *data++;
	}
}
void xxxdprintc(uint8 data)
{
   while( !(AT91C_BASE_DBGU->DBGU_CSR & 0x02) );
   AT91C_BASE_DBGU->DBGU_THR = data;
}
//---------------------------------------------------------------------------------------------------------------------
//【  版          本  】v1.0
//【  函  数  名  称  】void xxxdprintfc(void *data,uint16 len)
//【 创建人及创建时间 】gliethttp 2007-12-27
//【 修改人及修改时间 】
//【  修  改  原  因  】
//【  功  能  描  述  】
//---------------------------------------------------------------------------------------------------------------------
void xxxdprintfc(void *data,uint16 len)
{
	if(len >= 0xffff)len = 0xff;
	//阻塞
	while( (AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXBUFE) == 0 );
	//PDC
	AT91C_BASE_DBGU->DBGU_TPR = (uint32)data;
	AT91C_BASE_DBGU->DBGU_TCR = len;
	//阻塞
	while( (AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXBUFE) == 0 );

}
//---------------------------------------------------------------------------------------------------------------------
//【  版          本  】v1.0
//【  函  数  名  称  】void xxxdprintfc(void *data,uint16 len)
//【 创建人及创建时间 】gliethttp 2007-12-27
//【 修改人及修改时间 】
//【  修  改  原  因  】
//【  功  能  描  述  】
//---------------------------------------------------------------------------------------------------------------------
void xxxdprintfc_(void *data,uint16 len)
{/*uint16 i;
 char *dat = data;
	
	for(i = 0;i < len;i++)
	{
	    while( !(AT91C_BASE_DBGU->DBGU_CSR & 0x02) );
		AT91C_BASE_DBGU->DBGU_THR = *dat++;
	}
	*/
	if(len > 0xffff)len = 0xffff;
	//阻塞
	while( (AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXBUFE) == 0 );
	//PDC
	AT91C_BASE_DBGU->DBGU_TPR = (uint32)data;
	AT91C_BASE_DBGU->DBGU_TCR = len;
	//阻塞
	//while( (AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXBUFE) == 0 );

}

/*
void xDBGU_version(void)
{
#define xDEBGU_version	"Navtex_v1.1\r\n"
#define xDEBGU_DATE		__DATE__
#define xDEBGU_TIME		__TIME__
 	xxxdprintf(xDEBGU_version);
 	xxxdprintf(xDEBGU_DATE);
 	xxxdprintf("/"xDEBGU_TIME"\r\n");
}
//---------------------------------------------------------------------------------------------------------------------
//【  版          本  】v1.0
//【  函  数  名  称  】void xOnline_update_S(Boolean reset)
//【 创建人及创建时间 】葛立新 2006-05-23 16:52
//【 修改人及修改时间 】
//【  修  改  原  因  】
//【  功  能  描  述  】
//---------------------------------------------------------------------------------------------------------------------
void xOnline_update_S(Boolean reset)
{
	AT91C_BASE_AIC->AIC_IDCR = 0xffffffff;
	//XDBGU_ini();
	
	AT91F_DBGU_CfgPIO();
	AT91F_DBGU_CfgPMC();
	AT91F_US_Configure (
		(AT91PS_USART) AT91C_BASE_DBGU,				// DBGU基址
		GMCLK,            							// GMCLK
		AT91C_US_ASYNC_MODE ,        				// mode Register to be programmed
		115200 ,                   					// baudrate to be programmed
		0);                        					// timeguard to be programmed
	//发送使能
	AT91F_US_EnableTx((AT91PS_USART) AT91C_BASE_DBGU);
	//接收使能
	AT91F_US_EnableRx((AT91PS_USART) AT91C_BASE_DBGU);
	//-------------------------------------------------
	AT91F_PDC_Open(AT91C_BASE_PDC_DBGU);
	
 	xDBGU_version();
 	xxxdprintf("上电\r\n");
 	#if 0
 	xxxdprintf("输入92Mloader\r\n");
	xOnline_update_P((void*)0x10000000,true,false);
	xxxdprintf("输入程序XCttc-programADS-v1.x.bin\r\n");
	xOnline_update_P((void*)0x10010000,true,reset);
	#else
	{static char tmp[20];
	#define xMYADDRESS_NO1	0x10000000
	#define xMYADDRESS_NO2	0x10010000
	#define xMYADDRESS_NO3	0x10000000
	sprintf(tmp,"Boot地址:%X,Go,Go,Go!\r\n",xMYADDRESS_NO1);
	xxxdprintf(tmp);
	xOnline_update_P((void*)xMYADDRESS_NO1,true,false);
	sprintf(tmp,"u-Boot地址:%X,Go,Go,Go!\r\n",xMYADDRESS_NO2);
	xxxdprintf(tmp);
	xOnline_update_P((void*)xMYADDRESS_NO2,false,false);
	sprintf(tmp,"地址:%X,Go,Go,Go!\r\n",xMYADDRESS_NO3);
	xxxdprintf(tmp);
	xOnline_update_P((void*)xMYADDRESS_NO3,true,false);
	xxxdprintf("\r\n结束\r\n");
	for(;;);
	}
	#endif
}
//---------------------------------------------------------------------------------------------------------------------
//【  版          本  】v1.0
//【  函  数  名  称  】void xOnline_update_P(void *base_dst,Boolean bin,Boolean reset)
//【 创建人及创建时间 】葛立新 2006-04-11 16:57
//【 修改人及修改时间 】
//【  修  改  原  因  】
//【  功  能  描  述  】
//---------------------------------------------------------------------------------------------------------------------
void xOnline_update_P(void *base_dst,Boolean bin,Boolean reset)
{//32M字节SDRAM
 //static char xOnline_data[1024*400];
 #define xOnline_data_BASE (char*)(0x20000000+32*1024*1024-1024*1024*4)
 static char    *xOnline_data = xOnline_data_BASE;
 uint32	xOnline_One_Packets_nums;
 uint32  xDely_counts;
 //OS_CPU_SR  cpu_sr;
 uint16 CK16_CK;
 char	*dst;
 uint16 xPackets_num;
 #define xOnline_One_Packets		528
 #define xOnline_PC_ack_E		0
 #define xOnline_S_String "\r\n输入升级代码Bin文件......\r\n"
 #define xOnline_E_String "成功烧写!已经重启!\r\n"
 
	xDBGU_context->updateing = true;
	if(bin)xxxdprintfc(xOnline_S_String,sizeof(xOnline_S_String));
	else xxxdprintf("注意:你输入的为非Bin文件!\r\n");
	//OS_ENTER_CRITICAL();//禁止一切中断
	#if __xHardDog_OK
	//2007-06-05 gliethttp
	//添加硬件看门狗
	xDBGU_context->Hard_Dog_Feed_In_Time = true;
	#endif
		
	dst = xOnline_data;
	
	{
		AT91C_BASE_DBGU->DBGU_RPR = (uint32)xOnline_data;//小段
		AT91C_BASE_DBGU->DBGU_RCR = 2;//2个数据长度
		for(;(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXBUFF) == 0;)xWatch_Dog_Feed();//第接收数据包数
		{static char data[20];
			xPackets_num = xOnline_data[0]+(xOnline_data[1] << 8);
			sprintf(data,"总包数:%d\r\n",xPackets_num);
			xxxdprintfc(data,strlen(data));
		}
	}
	
	AT91C_BASE_DBGU->DBGU_RPR = (uint32)dst;
	AT91C_BASE_DBGU->DBGU_RCR = xOnline_One_Packets;
	
	xDely_counts = 0;
	for(;(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXBUFF) == 0;)xWatch_Dog_Feed();
	
	dst += xOnline_One_Packets;
	
	for(xOnline_One_Packets_nums = 1;xOnline_One_Packets_nums != xPackets_num;xOnline_One_Packets_nums++)
	{
		AT91C_BASE_DBGU->DBGU_RPR = (uint32)dst;
		AT91C_BASE_DBGU->DBGU_RCR = xOnline_One_Packets;
		
		xWatch_Dog_Feed();
		xxxdprintf("★");
		
		#if xOnline_PC_ack_E
		xxxdprintc(0xfe);//回执,启动下一包的发送
		#endif
		
		for(xDely_counts = 0;(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXBUFF) == 0;)
		{
			xDely_counts++;
			
			if(xDely_counts > 0x7fffff)
			{//Bin程序传输结束
			 //开始烧写
				xxxdprintf("数据传输超时,强制重启\r\n");
				//-----------------------------
				AT91C_BASE_ST->ST_WDMR = 0x08 | AT91C_ST_RSTEN | AT91C_ST_EXTEN;
				AT91C_BASE_ST->ST_CR = 0x01;
				//-----------------------------
				for(;;);
				
				//打印共多少包
				//烧写进度点
				
				//看门狗复位
			}
		}
		//调整指针
			dst += xOnline_One_Packets;
	}
	
	{//接收校验和
	 static char CK16_data[2];
		AT91C_BASE_DBGU->DBGU_RPR = (uint32)CK16_data;//小段
		AT91C_BASE_DBGU->DBGU_RCR = 2;//2个校验和
		for(;(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXBUFF) == 0;);
		//{static char data[20];
		xPackets_num = CK16_data[0]+(CK16_data[1] << 8);
		// sprintf(data,"\r\n校验和:%d\r\n",xPackets_num);
		// xxxdprintfc(data,strlen(data));
	    //}
	}
	
	{uint32 i;
	 uint32 max;
		max = xOnline_One_Packets*xOnline_One_Packets_nums;
	 	CK16_CK = 0;
		for(i = 0;i < max;i++)
		{
			CK16_CK += xOnline_data[i];
		}
		
		{static char data[50];
			sprintf(data,"\r\n本地校验和:%d\r\n状态:%s\r\n",
					CK16_CK,
					CK16_CK == xPackets_num ? "匹配":"不匹配"
				   );
			xxxdprintfc(data,strlen(data));
		}
	}
	
	{
		if(CK16_CK == xPackets_num)
		{
			if(bin && (xOnline_data[0] == 0x06))
			{
				xwrite2flash(xOnline_data,base_dst,xOnline_One_Packets*xOnline_One_Packets_nums);
				
				xxxdprintfc(xOnline_E_String,sizeof(xOnline_E_String));
			}else
				{
					if(bin)xxxdprintf("非法Bin代码,强制重启!\r\n");
				}
			if( (base_dst == (void*)0x10010000) && bin )
			{
				if(reset == true)
				{
					//-----------------------------
					AT91C_BASE_ST->ST_WDMR = 0x08 | AT91C_ST_RSTEN | AT91C_ST_EXTEN;
					AT91C_BASE_ST->ST_CR = 0x01;
					//-----------------------------
				}else xxxdprintf("程序停止!\r\n");
				for(;;);
			}else
				{
					if( (base_dst == (void*)0x10070000) || (base_dst == (void*)0x10010000) )
					{
						xxxdprintf("正在烧录......\r\n");
						xwrite2flash(xOnline_data,base_dst,xOnline_One_Packets*xOnline_One_Packets_nums);
					}
					else xxxdprintf("\r\n继续输入bin代码......\r\n");
				}
		}else
			{
				xxxdprintf("校验和出错!\r\n");
			}
													
	}
	xDBGU_context->updateing = false;
}
*/
//⊙⊙⊙
//⊙⊙⊙完了⊙⊙⊙
//⊙⊙⊙over⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙⊙

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -