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

📄 dbgu.c

📁 at91sam7s64两个uart、一个debug的ads源程序,atmel的基于arm7内核的单片机。
💻 C
📖 第 1 页 / 共 2 页
字号:
//*********************************************************************************************************************
//【  版          权  】Copyright (c) 2007-2008 gliethttp
//
//【  文  件  版  本  】v1.x
//
//【  文  件  名  称  】dbgu.c
//
//【  创  建  日  期  】2007-04-04
//
//【  功  能  描  述  】
//*********************************************************************************************************************
#include <uart.h>
static void dbgu_irq_handler(void);
_dbgu_control dbgu_control;
uint32 dbgu_baud_rate;
static volatile uint32 dbgu_frame_over = false;
//---------------------------------------------------------------------------------------------------------------------
//【  版          本  】v1.0
//【  函  数  名  称  】void dbgu_ini(uint32 baud)
//【 创建人及创建时间 】gliethttp 2007-04-04
//【 修改人及修改时间 】
//【  修  改  原  因  】
//【  功  能  描  述  】
//---------------------------------------------------------------------------------------------------------------------
void dbgu_ini(uint32 baud)
{
	dbgu_baud_rate = baud;
    AT91F_DBGU_CfgPIO();
	AT91F_US_Configure (
		(AT91PS_USART) AT91C_BASE_DBGU,
		__MCLK,
		AT91C_US_ASYNC_MODE ,
		dbgu_baud_rate ,
		0);
	((AT91PS_USART)AT91C_BASE_DBGU)->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX;
    ((AT91PS_USART)AT91C_BASE_DBGU)->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
    
    AT91F_US_EnableIt((AT91PS_USART) AT91C_BASE_DBGU,AT91C_US_RXRDY);
	AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_SYS, 7,AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, dbgu_irq_handler);
	AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_SYS);
	
	dbgu_control.flag = 0x00000000;
	{uint32 i;
		for(i = 0;i < dbgu_control_vmalloc_max;i++)
		{
			dbgu_control.mm[i].status = 0;
			dbgu_control.mm[i].p = 0;
			dbgu_control.mm[i].len = 0;
		}
		dbgu_control.mm_cur_index = 0;
		dbgu_control.mm_buf_counts = 0;
		dbgu_control.mm_in = 0;
		dbgu_control.mm_out = 0;
		dbgu_control.mm_lastp = (void*)&dbgu_control.dbgu_cache_buffer[0];
		dbgu_control.mm_maxp  = (void*)&dbgu_control.dbgu_cache_buffer[dbgu_cache_buffer_max];//小于,无等于
	}
	dbgu_frame_over = false;
}
//---------------------------------------------------------------------------------------------------------------------
//【  版          本  】v1.0
//【  函  数  名  称  】static void dbgu_irq_handler(void)
//【 创建人及创建时间 】gliethttp 2007-04-04
//【 修改人及修改时间 】
//【  修  改  原  因  】
//【  功  能  描  述  】
//---------------------------------------------------------------------------------------------------------------------
static void dbgu_irq_handler(void)
{
	if( (AT91C_BASE_DBGU->DBGU_IMR & AT91C_US_TXBUFE) && (AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_TXBUFE) )
	{
		dbgu_frame_over = true;
		AT91F_US_DisableIt((AT91PS_USART) AT91C_BASE_DBGU,AT91C_US_TXBUFE);
	}
	
	if(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXRDY)
	{
		#define dbgu_tmp_local_max 20
		static char dbgu_tmp[dbgu_tmp_local_max];
		uint32 dbgu_tmp_index;
		uint32 time_out;
		   	dbgu_tmp_index = 0;
		   	for(time_out = 0;time_out < 0xffff;time_out++)
		   	{
		   		if(AT91C_BASE_DBGU->DBGU_CSR & AT91C_US_RXRDY)
		   		{
					dbgu_tmp[dbgu_tmp_index++] = AT91F_US_GetChar((AT91PS_USART)AT91C_BASE_DBGU);
					if(dbgu_tmp_index >= dbgu_tmp_local_max)break;
				}
			}
			
			#define __dbgu_control_dbgu_baud_get	"AT+TSBAUDD?"
			#define __dbgu_control_dbgu_baud_set	"AT+TSBAUDD="
			#define __dbgu_control_uart0_baud_set	"AT+TSBAUD0="
			#define __dbgu_control_uart0_baud_get	"AT+TSBAUD0?"
			#define __dbgu_control_uart1_baud_set	"AT+TSBAUD1="
			#define __dbgu_control_uart1_baud_get	"AT+TSBAUD1?"
			#define __dbgu_control_uart0_out_all	"AT+TSBAUD0!"
			#define __dbgu_control_uart1_out_all	"AT+TSBAUD1!"
			if(xmemcmp(dbgu_tmp,__dbgu_control_dbgu_baud_set,strlen(__dbgu_control_dbgu_baud_set)) == 0)
			{uint8 i;
			 uint8 width;
			 uint32 baud;
				i = strlen(__dbgu_control_dbgu_baud_set);
				width = dbgu_tmp_index - i;
				if( width > 6 )dbgu_send_string("baud error!\r\n");
				else
					{//读取波特率
						baud = 0;
						for(;i < dbgu_tmp_index;i++)
						{
							if(misc_char2num(&dbgu_tmp[i]))
							{uint32 tmp;
							 uint8 j;
								tmp = 1;
								for(j = 1;j < width;j++)tmp *= 10;
								if(width)width--;
								baud += dbgu_tmp[i]*tmp;
							}else 
								{
									//sprintf(dbgu_tmp,"baud error!\r\n");
									dbgu_send_string("baud error!\r\n");
									break;
								}
						}
						if(i == dbgu_tmp_index)
						{
							dbgu_send_string("+TSBAUDD\r\nOK\r\n");
							dbgu_wait_string();
							dbgu_set_baud(baud);
//							sprintf(dbgu_tmp,"+TSBAUD0:%ld\r\nOK\r\n",uart0_get_baud());
						}
					}
			}else if(xmemcmp(dbgu_tmp,__dbgu_control_dbgu_baud_get,dbgu_tmp_index) == 0)
				{uint32 baud;
					baud = dbgu_get_baud();
					dbgu_send_string("+TSBAUDD:");
					dbgu_send_uint32(baud);
					dbgu_send_string("\r\nOK\r\n");
//					sprintf(dbgu_tmp,"+TSBAUD0:%ld\r\nOK\r\n",uart0_get_baud());
				}else 
			if(xmemcmp(dbgu_tmp,__dbgu_control_uart0_baud_set,strlen(__dbgu_control_uart0_baud_set)) == 0)
			{uint8 i;
			 uint8 width;
			 uint32 baud;
				i = strlen(__dbgu_control_uart0_baud_set);
				width = dbgu_tmp_index - i;
				if( width > 6 )dbgu_send_string("baud error!\r\n");
				else
					{//读取波特率
						baud = 0;
						for(;i < dbgu_tmp_index;i++)
						{
							if(misc_char2num(&dbgu_tmp[i]))
							{uint32 tmp;
							 uint8 j;
								tmp = 1;
								for(j = 1;j < width;j++)tmp *= 10;
								if(width)width--;
								baud += dbgu_tmp[i]*tmp;
							}else 
								{
									//sprintf(dbgu_tmp,"baud error!\r\n");
									dbgu_send_string("baud error!\r\n");
									break;
								}
						}
						if(i == dbgu_tmp_index)
						{
							uart0_set_baud(baud);
							dbgu_send_string("+TSBAUD0\r\nOK\r\n");
//							sprintf(dbgu_tmp,"+TSBAUD0:%ld\r\nOK\r\n",uart0_get_baud());
						}
					}
			}else if(xmemcmp(dbgu_tmp,__dbgu_control_uart0_baud_get,dbgu_tmp_index) == 0)
				{uint32 baud;
					baud = uart0_get_baud();
					dbgu_send_string("+TSBAUD0:");
					dbgu_send_uint32(baud);
					dbgu_send_string("\r\nOK\r\n");
//					sprintf(dbgu_tmp,"+TSBAUD0:%ld\r\nOK\r\n",uart0_get_baud());
				}
			 else if(xmemcmp(dbgu_tmp,__dbgu_control_uart1_baud_set,strlen(__dbgu_control_uart1_baud_set)) == 0)
				{uint8 i;
				 uint8 width;
				 uint32 baud;
					i = strlen(__dbgu_control_uart1_baud_set);
					width = dbgu_tmp_index - i;
					if( width > 6 )dbgu_send_string("baud error!\r\n");
					else
						{//读取波特率
							baud = 0;
							for(;i < dbgu_tmp_index;i++)
							{
								if(misc_char2num(&dbgu_tmp[i]))
								{uint32 tmp;
								 uint8 j;
									tmp = 1;
									for(j = 1;j < width;j++)tmp *= 10;
									if(width)width--;
									baud += dbgu_tmp[i]*tmp;
								}else 
									{
										//sprintf(dbgu_tmp,"baud error!\r\n");
										dbgu_send_string("baud error!\r\n");
										break;
									}
							}
							if(i == dbgu_tmp_index)
							{
								uart1_set_baud(baud);
								dbgu_send_string("+TSBAUD1\r\nOK\r\n");
	//							sprintf(dbgu_tmp,"+TSBAUD1:%ld\r\nOK\r\n",uart1_get_baud());
							}
						}
				}
			 else if(xmemcmp(dbgu_tmp,__dbgu_control_uart1_baud_get,dbgu_tmp_index) == 0)
				{uint32 baud;
					baud = uart1_get_baud();
					dbgu_send_string("+TSBAUD1:");
					dbgu_send_uint32(baud);
					dbgu_send_string("\r\nOK\r\n");
//					sprintf(dbgu_tmp,"+TSBAUD1:%ld\r\nOK\r\n",uart1_get_baud());
				}
			 else if(xmemcmp(dbgu_tmp,__dbgu_control_uart0_out_all,dbgu_tmp_index) == 0)
				{
					if(dbgu_control.flag & flag_uart0_out_all)
					{
						dbgu_control.flag &= ~flag_uart0_out_all;
						dbgu_send_string("\r\nU0OFF\r\n");
					}else
						{
							dbgu_control.flag |= flag_uart0_out_all;
							dbgu_send_string("\r\nU0ALL\r\n");
						}
				}
			 else if(xmemcmp(dbgu_tmp,__dbgu_control_uart1_out_all,dbgu_tmp_index) == 0)
				{
					if(dbgu_control.flag & flag_uart1_out_all)
					{
						dbgu_control.flag &= ~flag_uart1_out_all;
						dbgu_send_string("\r\nU1OFF\r\n");
					}else
						{
							dbgu_control.flag |= flag_uart1_out_all;
							dbgu_send_string("\r\nU1ALL\r\n");
						}
						
				}else dbgu_send_string("param error\r\n");
	}
	AT91C_BASE_DBGU->DBGU_CSR = AT91C_US_RSTSTA;
}
//---------------------------------------------------------------------------------------------------------------------
//【  版          本  】v1.0
//【  函  数  名  称  】uint32 dbgu_get_baud(void)
//【 创建人及创建时间 】gliethttp 2007-04-16
//【 修改人及修改时间 】
//【  修  改  原  因  】
//【  功  能  描  述  】
//---------------------------------------------------------------------------------------------------------------------
uint32 dbgu_get_baud(void)
{
	return dbgu_baud_rate;
}
//---------------------------------------------------------------------------------------------------------------------
//【  版          本  】v1.0
//【  函  数  名  称  】void dbgu_set_baud(uint32 baud)
//【 创建人及创建时间 】gliethttp 2007-04-16
//【 修改人及修改时间 】
//【  修  改  原  因  】
//【  功  能  描  述  】
//---------------------------------------------------------------------------------------------------------------------
void dbgu_set_baud(uint32 baud)
{
	if(baud)
	{
		dbgu_baud_rate = baud;
		AT91F_US_SetBaudrate((AT91PS_USART)AT91C_BASE_DBGU, __MCLK, dbgu_baud_rate);
	}
}
//---------------------------------------------------------------------------------------------------------------------
//【  版          本  】v1.0
//【  函  数  名  称  】void dbgu_send_char(uint8 data)
//【 创建人及创建时间 】gliethttp 2007-04-04
//【 修改人及修改时间 】
//【  修  改  原  因  】
//【  功  能  描  述  】
//---------------------------------------------------------------------------------------------------------------------
void dbgu_send_char(uint8 data)
{
	//while(AT91C_BASE_PDC_DBGU->PDC_TCR);
	while( (((AT91PS_USART)AT91C_BASE_DBGU)->US_CSR & AT91C_US_TXRDY) == false );
	((AT91PS_USART)AT91C_BASE_DBGU)->US_THR = data;
}
//---------------------------------------------------------------------------------------------------------------------
//【  版          本  】v1.0
//【  函  数  名  称  】void dbgu_send_string(char *string)
//【 创建人及创建时间 】gliethttp 2007-04-04
//【 修改人及修改时间 】
//【  修  改  原  因  】
//【  功  能  描  述  】
//---------------------------------------------------------------------------------------------------------------------
void dbgu_send_string(char *string)
{
	while(AT91C_BASE_PDC_DBGU->PDC_TCR);
	//while( (((AT91PS_USART)AT91C_BASE_DBGU)->US_CSR & AT91C_US_TXRDY) == false );
	AT91C_BASE_PDC_DBGU->PDC_TPR = (uint32)string;
	AT91C_BASE_PDC_DBGU->PDC_TCR = strlen(string);
}
//---------------------------------------------------------------------------------------------------------------------
//【  版          本  】v1.0
//【  函  数  名  称  】void dbgu_send_string(char *string)
//【 创建人及创建时间 】gliethttp 2007-04-04
//【 修改人及修改时间 】
//【  修  改  原  因  】
//【  功  能  描  述  】
//---------------------------------------------------------------------------------------------------------------------
void dbgu_wait_string(void)
{
	while(AT91C_BASE_PDC_DBGU->PDC_TCR);
}

⌨️ 快捷键说明

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