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

📄 main.c

📁 顺舟SZ05的ZIGBEE模块
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************************
* 文件名:ZIGBEE_UART0.C
* 功能:
* 说明:
* 硬件连接: 
*           
*           
*           
*          
*
*           
****************************************************************************************/
#include "config.h"

#define   UART0_INT		6 
#define RX_BUFFER_SIZE0 1024
#define TX_BUFFER_SIZE0 256
#define command_buffer_size0  20						//命令缓冲区大小 160


uint32    UART0_BPS=9600;		//定义通讯波特率       

// USART0 Receiver buffer
unsigned char rx_buffer0[RX_BUFFER_SIZE0];		//串口接收数据缓冲区
unsigned int rx_wr_index0;						//接收数组缓冲区中写指针
unsigned int rx_rd_index0; 					//接收数组缓冲区中读指针
unsigned int rx_counter0;						//全部的接收字符 

// USART0 Transmitter buffer
unsigned char tx_buffer0[TX_BUFFER_SIZE0];		//串口发送数据缓冲区
unsigned int tx_wr_index0;						//串口发送数据缓冲区中写指针
unsigned int tx_rd_index0;						//串口发送数据缓冲区中读指针
unsigned int tx_counter0;						//全部的发送字符,队列计数器

/* 该宏先发送回车字符0x0d到EasyARM串口调试软件,然后再发送换行字符0x0a */
#define	  DISP_CHANGEROW0()		UART0_SendByte (0x0d);	UART0_SendByte (0x0a)	

unsigned char zigbee_config_count;
uint8 zigbee_config_flag=0;


unsigned char command_buffer0[command_buffer_size0];	//命令接收缓冲区
uint8 zigbee_rcv_len=0;
#define PIN108 (1<<8)

/*
*********************************************************************************************************
** 函数名称 :DelayNS()
** 函数功能 :长软件延时
** 入口参数 :dly	延时参数,值越大,延时越久
** 出口参数 :无
*********************************************************************************************************
*/
void DelayNS (uint32 dly)
{
	uint32 i;
	
	for ( ; dly>0; dly--)
		for (i=0; i<50000; i++);
}

/*********************************************************************************************************
** 函数名称:  IRQ_Timer0
** 函数功能:  定时器0中断服务程序,取反蜂鸣器控制口。
** 入口参数:  无
** 出口参数:  无
*************

********************************************************************************************/
void __irq IRQ_Timer0(void)
{
	
     IO1CLR |= PIN108;//输出低电平  
	 DelayNS (200);
	 IO1SET |= PIN108;//输出高电平  
	 DelayNS (200);

	T0IR        = 0x01;					// 清除中断标志	
	VICVectAddr = 0x00;					// 通知VIC中断处理结束
}


/*********************************************************************************************************
** 函数名称 :time0_init()
** 函数功能 :定时器初始化
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void time0_init(void)
{
 /* 定时器0初始化 */
	T0TC   = 0;						// 定时器设置为0							
	T0PR   = 0;						// 时钟不分频								
	T0MCR  = 0x03;					// 设置T0MR0匹配后复位T0TC,并产生中断标志	
	T0MR0  = Fpclk;		// 10MS秒钟定时,T0MR0=12MHz
	//T0MR0  = Fpclk /10;				// 100mS秒钟定时,T0MR0=12MHz
    //T0MR0  = Fpclk / 2;				// 500mS秒钟定时,T0MR0=12MHz
    //T0MR0  = Fpclk ;
	
	T0TCR  = 0x01;					// 启动定时器								
    
	VICVectPri4  = 0x07;					// 设置定时器0中断最高优先级	

	VICVectAddr4 = (uint32)IRQ_Timer0;	// 设置中断服务程序地址					
	VICIntEnable = 1 << 0x04;			// 使能定时器0中断						
}


/*********************************************************************************************************
** 函数名称 :UART0_SendByte
** 函数功能 :以查询方式发送一字节数据
** 入口参数 :dat	要发送的数据
** 出口参数 :无
*********************************************************************************************************/
void UART0_SendByte(char dat)
{
	U0THR = dat;
	while ((U0LSR & 0x40) == 0);			// 等待数据发送完毕
}

/**********************************************************************************************************
** 函数名称 :UART0_SendStr
** 函数功能 :向串口发送一字符串
** 入口参数 :str	要发送的字符串的指针
** 出口参数 :无
**********************************************************************************************************/
void UART0_SendStr(char *str)
{
	while (1)
	{
		if (*str == '\0')	
		{
			break;							// 遇到结束符,退出
		}
		UART0_SendByte(*str++);			
	}
}

/*********************************************************************************************************
** 函数名称 :UART0_SendBuf
** 函数功能 :向串口发送数据
** 入口参数 :uint32  snd_n:  发送数据的个数。snd_n 小于8
**			  uint8* RcvBufPt:缓存地址  
** 出口参数 :无
**********************************************************************************************************/
void UART0_SendBuf(uint8* RcvBufPt, uint32 snd_n)
{
	uint32 i;
  
    VICIntEnClr  |= 1 << UART0_INT;			// 保护字符接收数组不被其它中断破坏
    
	for (i = 0; i < snd_n; i++)				// 使用发送FIFO发送数据
	{
		U0THR     = RcvBufPt[i];
	}
	while ((U0LSR & 0x40) == 0);			// 等待数据发送完毕

	VICIntEnable |= 1 << UART0_INT;		

}

//函数名称:UART0_RcvByte
//函数功能:使用查询方式,从串口接收一个字节的数据
//入口参数:
//出口参数:
uint8 UART0_RcvByte (void)
{
uint8 rcv_data=0;
while((U0LSR&0x01)==0);//查询数据是否接收完毕
rcv_data=U0RBR;
return (rcv_data);
}


/*********************************************************************************************************
** 函数名称 :UART0_getchar
** 函数功能 :取一个字节数据
** 入口参数 :无
** 出口参数 :无
*******************************************************************************************************/
char UART0_getchar(unsigned char *c_ptr)                
{
	if(rx_counter0 == 0)
		return FALSE;

	*c_ptr=rx_buffer0[rx_rd_index0];
	if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;

	//#asm("cli")
	--rx_counter0;
	//#asm("sei")
	return TRUE;
}

/*********************************************************************************************************
** 函数名称 :UART0_putchar
** 函数功能 :向串口0发送一字节数据,中断方式
** 入口参数 :c	要发送的数据
** 出口参数 :无
*********************************************************************************************************/
void UART0_putchar(char c)
{
	while (tx_counter0 == TX_BUFFER_SIZE0);
	//#asm("cli")
	//if (tx_counter0 || ((UCSRA & DATA_REGISTER_EMPTY)==0))
   	if (tx_counter0 || ( (U0LSR & 0X40)==0 ))
   	{
   		tx_buffer0[tx_wr_index0]=c;
   		if (++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0;
   		++tx_counter0;
   	}
	else U0THR=c;
	//#asm("sei")
}

/**********************************************************************************************************
** 函数名称 :UART0_putstr
** 函数功能 :向串口2发送一个字符串
** 入口参数 :string	要发送的字符串的指针
** 出口参数 :无
**********************************************************************************************************/
void UART0_putstr( char *string)
{
    	while(*string)    		
    	{
        	UART0_putchar(*string);		
			string++;
    	}    
    
}

/*********************************************************************************************************
** 函数名称 :UART0_SendBuf
** 函数功能 :向串口发送数据
** 入口参数 :uint32  snd_n:  发送数据的个数。snd_n 小于8
**			  uint8* RcvBufPt:缓存地址  
** 出口参数 :无
**********************************************************************************************************/
void UART0_putBuf(uint8* RcvBufPt, uint32 snd_n)
{
	uint32 i;
	for (i = 0; i < snd_n; i++)				// 使用发送FIFO发送数据
	  {
	  while (tx_counter0 == TX_BUFFER_SIZE0);
	//#asm("cli")
	//if (tx_counter0 || ((UCSRA & DATA_REGISTER_EMPTY)==0))
   	  if (tx_counter0 || ( (U0LSR & 0X40)==0 ))
   	    {
   		tx_buffer0[tx_wr_index0]=RcvBufPt[i];
   		if (++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0;
   		++tx_counter0;
   	    }
	  else
	    U0THR=RcvBufPt[i];//发送缓冲区没有数据,直接发送   	     }
	  }
	
}




/*********************************************************************************************************
** 函数名称 :IRQ_UART0
** 函数功能 :串口0接收中断服务程序
** 入口参数 :无
** 出口参数 :无
*******************************************************************************************************/

//void __irq IRQ_UART0_RX(void)
void __irq IRQ_UART0(void)
{

	uint32 i   = 0;
	
	//unsigned char status;
	unsigned char data;
	//unsigned char Rcv_Buf;

	uint32 IIR = 0;
	
	while (((IIR = U0IIR) & 0x01) == 0)		// 若尚有中断待处理,
	{
		switch (IIR & 0x0e)			//与0000 1110
		{
			case 0x04:				//0000 0100 ,bit3~1=010=2 RDA接收数据就绪 中断处理入口												
				
				for (i = 0; i < 1; i++)
				{	
				//status=UCSRA;
				data=U0RBR;
				//if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   				//{
   				if(rx_counter0 < (RX_BUFFER_SIZE0-1))
   				{
   					rx_buffer0[rx_wr_index0]=data;
   					if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
   					rx_counter0++;
      			}
      			//}				
				
				}	
				break;	
		
			case 0x0c:						//0000 1100 ,bit3~1=110=6 CTI中断
			
				for (i = 0; i < 1; i++)	
				{
					if ((U0LSR & 0x01) == 0x01)		//RDR=1,接收有数据
					{
						data=U0RBR;
						//if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   						
   						if(rx_counter0 < (RX_BUFFER_SIZE0-1))
   						{
   							rx_buffer0[rx_wr_index0]=data;
   							if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
   							rx_counter0++;
      					}
						
						
					}
					else
					{
						break;
					}
				}
									
			case 0x02:			//0000 0010 ,bit3~1=001=1 THRE发送中断处理入口		
				
				if (tx_counter0)
				{
					--tx_counter0;
					U0THR=tx_buffer0[tx_rd_index0];
					if (++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0;
				}												
				break;	
		
			default:
				break;
		
		
		} //end switch 
	} //end while
	VICVectAddr = 0x00;		
	
}

/*********************************************************************************************************
** 函数名称 :ClrRcvFIFO0
** 函数功能 :读空接收FIFO0
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void ClrRcvFIFO0(void)
{
	volatile uint32 i, temp = 0;

	for (i = 0; i < 1; i++)	
	{
		if ((U0LSR & 0x01) == 0x01)			//接收FIFO有数据
		{
			temp = U0RBR;					//读空接收FIFO
		}
		else
		{
			break;
		}
	}		
}	

/*********************************************************************************************************
** 函数名称 :UART0_Init
** 函数功能 :令串口0完成全部初始化工作:  波特率 9600		
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void UART0_Init(void)
{
	char str[64];
	uint32 baud;
	uint32 	Fdiv = 0;

	uint16 dlm, dll;
	
	/* 在PCONP里启用UART0 */
	PCONP 	|= 1 << 3;						// 使能UART0 功率/时钟控制位  p123

	/* 初始化引脚 */
	PINSEL0  = (0x01 << 4) | (0x01 << 6);	// 设置P0.2和P0.3连接到UART0
	

⌨️ 快捷键说明

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