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

📄 hwdevice111.c

📁 SZ328片上设备驱动程序,应用于龙珠系列CPU的应用开发.
💻 C
📖 第 1 页 / 共 3 页
字号:
			stepvalue = (unsigned char)divider;
			*(volatile unsigned char *)((unsigned char *)NIPR + 1) = stepvalue;
			return 1;
		}
		else if(divider >= 32.0f)
		{   //step: 1/8;  tap selection(bit 10,9,8): 100
			*(volatile unsigned short *)NIPR |=  0x0400;
			*(volatile unsigned short *)NIPR &= ~0x0300;
			divider -= 32.0f;
			divider *= 8.0f;
			divider += 0.5f;
			stepvalue = (unsigned char)divider;
			*(volatile unsigned char *)((unsigned char *)NIPR + 1) = stepvalue;
			return 1;
		}
		else if(divider >= 16.0f)
		{   //step: 1/16;  tap selection(bit 10,9,8): 011
			*(volatile unsigned short *)NIPR |=  0x0300;
			*(volatile unsigned short *)NIPR &= ~0x0400;
			divider -= 16.0f;
			divider *= 16.0f;
			divider += 0.5f;
			stepvalue = (unsigned char)divider;
			*(volatile unsigned char *)((unsigned char *)NIPR + 1) = stepvalue;
			return 1;
		}
		else if(divider >= 8.0f)
		{   //step: 1/32;  tap selection(bit 10,9,8): 010
			*(volatile unsigned short *)NIPR |=  0x0200;
			*(volatile unsigned short *)NIPR &= ~0x0500;
			divider -= 8.0f;
			divider *= 32.0f;
			divider += 0.5f;
			stepvalue = (unsigned char)divider;
			*(volatile unsigned char *)((unsigned char *)NIPR + 1) = stepvalue;
			return 1;
		}
		else if(divider >= 4.0f)
		{   //step: 1/64;  tap selection(bit 10,9,8): 001
			*(volatile unsigned short *)NIPR |=  0x0100;
			*(volatile unsigned short *)NIPR &= ~0x0600;
			divider -= 4.0f;
			divider *= 64.0f;
			divider += 0.5f;
			stepvalue = (unsigned char)divider;
			*(volatile unsigned char *)((unsigned char *)NIPR + 1) = stepvalue;
			return 1;
		}
		else if(divider >= 2.0f)
		{   //step: 1/128;  tap selection(bit 10,9,8): 000
			*(volatile unsigned short *)NIPR &= ~0x0700;
			divider -= 2.0f;
			divider *= 128.0f;
			divider += 0.5f;
			stepvalue = (unsigned char)divider;
			*(volatile unsigned char *)((unsigned char *)NIPR + 1) = stepvalue;
			return 1;
		}
		else 
			return 0;

	}
	else
	{   // use integral prescaler
		unsigned char prescalerValue;

		*(volatile unsigned short *)NIPR &= ~0x8000;
		if(divider <= 4.0f * 65.0f)
		{  // divider(bit 10,9,8): 010
			*(volatile unsigned short *)UBAUD |=  0x0200;
			*(volatile unsigned short *)UBAUD &= ~0x0500;
			divider /= 4.0f;
			divider += 0.5f;
			prescalerValue = (unsigned char) divider;
			prescalerValue = 65 - prescalerValue ;
			*(volatile unsigned char *)((unsigned char *)UBAUD + 1) = prescalerValue;
			return 1;
		}
		else if(divider <= 8.0f * 65.0f)
		{  // divider value(bit 10,9,8): 011
			*(volatile unsigned short *)UBAUD |=  0x0300;
			*(volatile unsigned short *)UBAUD &= ~0x0400;
			divider /= 8.0f;
			divider += 0.5f;
			prescalerValue = (unsigned char) divider;
			prescalerValue = 65 - prescalerValue ;
			*(volatile unsigned char *)((unsigned char *)UBAUD + 1) = prescalerValue;
			return 1;
		}
		else if(divider <= 16.0f * 65.0f)
		{  // divider value(bit 10,9,8): 100
			*(volatile unsigned short *)UBAUD |=  0x0400;
			*(volatile unsigned short *)UBAUD &= ~0x0300;
			divider /= 16.0f;
			divider += 0.5f;
			prescalerValue = (unsigned char) divider;
			prescalerValue = 65 - prescalerValue ;
			*(volatile unsigned char *)((unsigned char *)UBAUD + 1) = prescalerValue;
			return 1;
		}
		else if(divider <= 32.0f * 65.0f)
		{  // divider value(bit 10,9,8): 101
			*(volatile unsigned short *)UBAUD |=  0x0500;
			*(volatile unsigned short *)UBAUD &= ~0x0200;
			divider /= 32.0f;
			divider += 0.5f;
			prescalerValue = (unsigned char) divider;
			prescalerValue = 65 - prescalerValue ;
			*(volatile unsigned char *)((unsigned char *)UBAUD + 1) = prescalerValue;
			return 1;
		}
		else if(divider <= 64.0f * 65.0f)
		{  // divider value(bit 10,9,8): 110
			*(volatile unsigned short *)UBAUD |=  0x0600;
			*(volatile unsigned short *)UBAUD &= ~0x0100;
			divider /= 64.0f;
			divider += 0.5f;
			prescalerValue = (unsigned char) divider;
			prescalerValue = 65 - prescalerValue ;
			*(volatile unsigned char *)((unsigned char *)UBAUD + 1) = prescalerValue;
			return 1;
		}
		else if(divider <= 128.0f * 65.0f)
		{  // divider value(bit 10,9,8): 111
			*(volatile unsigned short *)UBAUD |=  0x0700;
			divider /= 128.0f;
			divider += 0.5f;
			prescalerValue = (unsigned char) divider;
			prescalerValue = 65 - prescalerValue ;
			*(volatile unsigned char *)((unsigned char *)UBAUD + 1) = prescalerValue;
			return 1;
		}
		else 
			return 0;
	}
}

/*****************************************************************************************
名  称:unsigned long GetTotalSecond(void)
功  能:将系统的时间换算成总秒数
参  数:无
返回值:系统当前的总秒数:=3600*24*day+3600*hour+60*minute+second
******************************************************************************************/
unsigned long GetTotalSecond(void)
{
#if __TURBOC__
	static unsigned long time = 0;
	time++;
	return	time;
#else
	unsigned long time,tmp;
	tmp = *RTCTIME;
	time = ( ((tmp & 0x1f000000)>>24)*3600 );
	time += ( ((tmp & 0x003f0000)>>16)*60 );
	time += (tmp & 0x0000003f);
	return time;
#endif
}

/*****************************************************************************************
名  称:void SetTxdHigh(void)
功  能:将TXD脚置为输出高电平
参  数:无
******************************************************************************************/
void SetTxdHigh(void)
{
#if __TURBOC__
	return;
#else
	*(volatile unsigned char *)PEDATA|= 0x20;  //PE5(TXD) output high;
	*(volatile unsigned char *)PEDIR |= 0x20;  //PE5(TXD) as output;
	*(volatile unsigned char *)PESEL |= 0x20;  //PE5(TXD) as I/O
#endif
}

/*****************************************************************************************
名  称:void SetTxdLow(void)
功  能:将TXD脚置为输出低电平
参  数:无
******************************************************************************************/
void SetTxdLow(void)
{
#if __TURBOC__
	return;
#else
	*(volatile unsigned char *)PEDATA&=~0x20;  //PE5(TXD) output low;
	*(volatile unsigned char *)PEDIR |= 0x20;  //PE5(TXD) as output;
	*(volatile unsigned char *)PESEL |= 0x20;  //PE5(TXD) as I/O
#endif
}

/*****************************************************************************************
名  称:void SetCtsHigh(void)
功  能:将CTS脚置为输出高电平
参  数:无
******************************************************************************************/
void SetCtsHigh(void)
{
#if __TURBOC__
	return;
#else
	*(volatile unsigned char *)PEDATA|= 0x80;  //PE7(CTS) output high;
	*(volatile unsigned char *)PEDIR |= 0x80;  //PE7(CTS) as output;
	*(volatile unsigned char *)PESEL |= 0x80;  //PE7(CTS) as I/O
#endif
}

/*****************************************************************************************
名  称:void SetCtsLow(void)
功  能:将CTS脚置为输出低电平
参  数:无
******************************************************************************************/
void SetCtsLow(void)
{
#if __TURBOC__
	return;
#else
	*(volatile unsigned char *)PEDATA&=~0x80;  //PE7(CTS) output low;
	*(volatile unsigned char *)PEDIR |= 0x80;  //PE7(CTS) as output;
	*(volatile unsigned char *)PESEL |= 0x80;  //PE7(CTS) as I/O
#endif
}

/*****************************************************************************************
名  称:void SetRtsHigh(void)
功  能:将RTS脚置为输出高电平
参  数:无
******************************************************************************************/
void SetRtsHigh(void)
{
#if __TURBOC__
	return;
#else
	*(volatile unsigned char *)PEDATA|= 0x40;  //PE6(RTS) output high;
	*(volatile unsigned char *)PEDIR |= 0x40;  //PE6(RTS) as output;
	*(volatile unsigned char *)PESEL |= 0x40;  //PE6(RTS) as I/O
#endif
}

/*****************************************************************************************
名  称:void SetRtsLow(void)
功  能:将RTS脚置为输出低电平
参  数:无
******************************************************************************************/
void SetRtsLow(void)
{
#if __TURBOC__
	return;
#else
	*(volatile unsigned char *)PEDATA&=~0x40;  //PE6(RTS) output low;
	*(volatile unsigned char *)PEDIR |= 0x40;  //PE6(RTS) as output;
	*(volatile unsigned char *)PESEL |= 0x40;  //PE6(RTS) as I/O
#endif
}

/*****************************************************************************************
名  称:void SetCsd1High(void)
功  能:将CSD1脚置为输出高电平
参  数:无
******************************************************************************************/
void SetCsd1High(void)
{
#if __TURBOC__
	return;
#else
	*(volatile unsigned char *)PBDATA|= 0x20;  //PB5(CSD1) output high;
	*(volatile unsigned char *)PBDIR |= 0x20;  //PB5(CSD1) as output;
	*(volatile unsigned char *)PBSEL |= 0x20;  //PB5(CSD1) as I/O
#endif
}

/*****************************************************************************************
名  称:void SetCsd1Low(void)
功  能:将CSD1脚置为输出低电平
参  数:无
******************************************************************************************/
void SetCsd1Low(void)
{
#if __TURBOC__
	return;
#else
	*(volatile unsigned char *)PBDATA&=~0x20;  //PB5(CSD1) output low;
	*(volatile unsigned char *)PBDIR |= 0x20;  //PB5(CSD1) as output;
	*(volatile unsigned char *)PBSEL |= 0x20;  //PB5(CSD1) as I/O
#endif
}

/*****************************************************************************************
名  称:void SetBootsHigh(void)
功  能:将BOOTS脚置为输出高电平
参  数:无
******************************************************************************************/
void SetBootsHigh(void)
{
#if __TURBOC__
	return;
#else
	*(volatile unsigned char *)PGDATA|= 0x20;  //PG5(BOOTS) output high;
	*(volatile unsigned char *)PGDIR |= 0x20;  //PG5(BOOTS) as output;
	*(volatile unsigned char *)PGSEL |= 0x20;  //PG5(BOOTS) as I/O
#endif
}

/*****************************************************************************************
名  称:void SetBootsLow(void)
功  能:将BOOTS脚置为输出低电平
参  数:无
******************************************************************************************/
void SetBootsLow(void)
{
#if __TURBOC__
	return;
#else
	*(volatile unsigned char *)PGDATA&=~0x20;  //PG5(BOOTS) output low;
	*(volatile unsigned char *)PGDIR |= 0x20;  //PG5(BOOTS) as output;
	*(volatile unsigned char *)PGSEL |= 0x20;  //PG5(BOOTS) as I/O
#endif
}

/*****************************************************************************************
名  称:void SetPg2High(void)
功  能:将PG2脚置为输出高电平
参  数:无
******************************************************************************************/
void SetPg2High(void)
{
#if __TURBOC__
	return;
#else
	*(volatile unsigned char *)PGDATA|= 0x04;  //PG2 output high;
	*(volatile unsigned char *)PGDIR |= 0x04;  //PG2 as output;
	*(volatile unsigned char *)PGSEL |= 0x04;  //PG2 as I/O
#endif
}

/*****************************************************************************************
名  称:void SetPg2Low(void)
功  能:将PG2脚置为输出低电平
参  数:无
******************************************************************************************/
void SetPg2Low(void)
{
#if __TURBOC__
	return;
#else
	*(volatile unsigned char *)PGDATA&=~0x04;  //PG2 output low;
	*(volatile unsigned char *)PGDIR |= 0x04;  //PG2 as output;
	*(volatile unsigned char *)PGSEL |= 0x04;  //PG2 as I/O
#endif
}


/*****************************************************************************************
名  称:void SetCommToInputPin(void)
功  能:将COMM脚设为通用IO的输入脚
参  数:无
******************************************************************************************/
void SetCommToInputPin(void)
{
#if __TURBOC__
	return;
#else
	*(volatile unsigned char *)PDSEL |= 0x04;  //PD2(COMM) as I/O
	*(volatile unsigned char *)PDPUEN|= 0x04;  //PD2(COMM) Pullup enable
	*(volatile unsigned char *)PDDIR &= ~0x04; //PD2(COMM) as input;
#endif
}

/*****************************************************************************************
名  称:void SetRxdHigh(void)
功  能:将RXD脚设为通用IO的输出脚,且输出高电平
参  数:无
******************************************************************************************/
void SetRxdHigh(void)
{
#if __TURBOC__
	return;
#else
	*(volatile unsigned char *)PEDATA|= 0x10;  //PE4(RXD) output high
	*(volatile unsigned char *)PEPUEN|= 0x10;  //PE4(RXD) Pullup enable
	*(volatile unsigned char *)PEDIR |= 0x10;  //PE4(RXD) as output;
	*(volatile unsigned char *)PESEL |= 0x10;  //PE4(RXD) as I/O
#endif
}

/*****************************************************************************************
名  称:void SetRxdLow(void)
功  能:将RXD脚设为通用IO的输出脚,且输出低电平
参  数:无
******************************************************************************************/
void SetRxdLow(void)
{
#if __TURBOC__
	return;
#else
	*(volatile unsigned char *)PEDATA&= ~0x10;  //PE4(RXD)output low
	*(volatile unsigned char *)PEPUEN|= 0x10;  //PE4(RXD) Pullup enable
	*(volatile unsigned char *)PEDIR |= 0x10;  //PE4(RXD) as output;
	*(volatile unsigned char *)PESEL |= 0x10;  //PE4(RXD) as I/O
#endif
}



/*****************************************************************************************
名  称:void SetRxdToInputPin(void)
功  能:将RXD脚设为通用IO的输入脚
参  数:无
******************************************************************************************/
void SetRxdToInputPin(void)
{
#if __TURBOC__
	return;
#else
	*(volatile unsigned char *)PESEL |= 0x10;  //PE4(RXD) as I/O
	*(volatile unsigned char *)PEPUEN|= 0x10;  //PE4(RXD) Pullup enable
	*(volatile unsigned char *)PEDIR &= ~0x10; //PE4(RXD) as input;
#endif
}

/*****************************************************************************************
名  称:void SetRxdToRxdPin(void)
功  能:将RXD设为UART的数据接收脚
参  数:无
******************************************************************************************/
void SetRxdToRxdPin(void)
{
#if __TURBOC__
	return;
#else
	*(volatile unsigned char *)PESEL &= ~0x10;  //PE4(RXD) as RXD
#endif
}


/*****************************************************************************************
名  称:unsigned short GetRxdLevel(void)
功  能:使能L_LINE通道
参  数:无
返回值:Rxd的电平为高时返否1,为低则返回0
******************************************************************************************/
unsigned short GetRxdLevel(void)
{
#if __TURBOC__
	return 1;
#else
	register unsigned short level;

	SetRxdToInputPin();
	level = (*(volatile unsigned char *)PEDATA & 0x10);
	level >>= 4;
	return level;
#endif
}


/*****************************************************************************************
名称:void InitializeUart()
功能:初始化串口,包括TX、RX脚及UART的相应控制寄存器。
参数:无
******************************************************************************************/
void InitializeUart()
{
#if __TURBOC__
	return;
#else
	volatile unsigned short tmp;
	unsigned char byte;
	*(volatile unsigned char *)PESEL   &= ~0x30;//PE4(RX),PE5(TX) as TX & RX
	*(volatile unsigned short *)USTCNT = 0xE100;
		//enable UART, RX , TX; 8 data bits, 1 stop bit, no parit bit, interrupt disable
	//*(volatile unsigned short *)NIPR &= ~0x8000; //use integral divider
	tmp = *(volatile unsigned short *)URX ;

⌨️ 快捷键说明

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