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

📄 sio.c

📁 bootloader
💻 C
字号:
head	1.1;access;symbols;locks	ICCAVR:1.1; strict;comment	@ * @;1.1date	2006.11.14.14.10.17;	author ICCAVR;	state Exp;branches;next	;desc@对方@1.1log@Initial revision@text@#include "config.h"#if USEUART0siocirqueue RTbuf_UART0;#endif#if USEUART1siocirqueue RTbuf_UART1;#endif#if (CPU_TYPE == M32)||(CPU_TYPE == M16)||(CPU_TYPE == M8)#define USEUART0  TRUE#define USEUART1  FALSE#define iv_USART0_RXC   iv_USART_RXC#define iv_USART0_TXC   iv_USART_TXC#define UDR0  	  UDR #define UCSR0A    UCSRA#define UCSR0B    UCSRB#define UCSR0C	  UCSRC#define UBRR0H	  UBRRH#define UBRR0L	  UBRRL#define RXCIE0	  RXCIE#define TXCIE0	  TXCIE#endif/*********************************************************************************************************** 函数名称: Com_init** 功能描述: 初始化串行口** 输 入: ** 全局变量: 无** 调用模块: Com_baudrate** 说明:** 注意:********************************************************************************************************/void Com_init (void) {	//WDR(); //喂狗 //CLI();                     // 关中断#if USEUART0Tbuf_init(&RTbuf_UART0);              //初始化接收缓冲Rbuf_init(&RTbuf_UART0);UCSR0B = 0x00; //disable while setting baud rateUCSR0A=0x00;#if CPU_TYPE <= M32UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);UCSR0B = (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);  // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1#elseUCSR0C=0x06;  //8 DATA ,1 STOP, NO PARITYUCSR0B = (1<<RXCIE0)|(1<<TXCIE0)|(1<<RXEN0)|(1<<TXEN0);  // RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1#endif#endif#if USEUART1Tbuf_init(&RTbuf_B);              //初始化接收缓冲Rbuf_init(&RTbuf_B);UCSR1B = 0x00; //disable while setting baud rateUCSR1A = 0x00;UCSR1C = 0x06;UCSR1B = 0xD8;#endifCom_baudrate (9600);		 // //SEI();                     // 开中断}/*********************************************************************************************************** 函数名称: Com_baudrate** 功能描述: 利用定时器T1产生由参数baudrate指定的波特率** 输 入: baudrate指定的波特率** 全局变量: 无** 调用模块: 无** 说明:** 注意:********************************************************************************************************/void Com_baudrate (uint16 baudrate) {uint16 tmp;tmp= F_CPU/baudrate/16-1;#if USEUART0UBRR0H=(uint8)(tmp>>8);UBRR0L=(uint8)tmp;#endif#if USEUART1UBRR1H=(uint8)(tmp>>8);UBRR1L=(uint8)tmp;#endif}/*********************************************************************************************************** 函数名称: Com_putchar** 功能描述: 从串行口输出一个字符c** 输 入: c:输出字符** 输出	 : 0:失败 1:成功** 全局变量: 无** 调用模块: ** 说明:** 注意:********************************************************************************************************/uint8 Com_putchar (uint8 c,siocirqueue *RTbuf) {//WDR(); //喂狗if (Tbuf_full(RTbuf))    return(0);else{	Tbuf_putchar(c,RTbuf);				// 将数据加入到发送缓冲区并开中断	return(1);	}}/*********************************************************************************************************** 函数名称: Com_putstring** 功能描述: 从串行口输出一个字符串** 输 入: p:指向输出字符串 len:输出长度** 输出	 : ** 全局变量: 无** 调用模块: ** 说明:** 注意:********************************************************************************************************/void Com_putstring (uint8 *p,uint8 len,siocirqueue *RTbuf) {uint8 i;//WDR(); //喂狗if (len!=0 ){	for(i=0;i<len;i++)	while(Com_putchar(p[i],RTbuf)==0);//WDR(); //喂狗;	}	else {		do{			while(Com_putchar(*p,RTbuf)==0);//WDR(); //喂狗;			}while(*p++!='\n');	}	}/*********************************************************************************************************** 函数名称: Com_getchar** 功能描述: 从串行口输入一个字符** 输 入: mode:0不需等待,在调用函数前检测Com_R_count的值**              1 等待数据到来** 输出	 : 读入的字符** 全局变量: 无** 调用模块: ** 说明:** 注意:********************************************************************************************************/uint8 Com_getchar (uint8 mode,siocirqueue *RTbuf) {//WDR(); //喂狗//    Delay(Delay_Comget,MaxLimit_Comget_Delay);//	if (mode>0) while(Com_R_count(RTbuf)==0 && !DelayOvf(Delay_Comget))//WDR(); //喂狗;//	if (DelayOvf(Delay_Comget))//	    return 0;    //时间超时//	else 	    		while(!Com_R_count(RTbuf));		return (Rbuf_getchar(RTbuf));// 串行口输入正确,返回输入的字符}void Com_Rbuf_Clear(siocirqueue *RTbuf){	Rbuf_init(RTbuf);}uint8 Com_getstring (uint8 *p,uint8 len,siocirqueue *RTbuf) {uint8 i=0;//WDR(); //喂狗if (len>0 ){	for(i=0;i<len;i++){		//WDR(); //喂狗		*p++=Com_getchar(1,RTbuf);		}	return(len);	}	else{						do{				*p++=Com_getchar(1,RTbuf);				i++;				//WDR(); //喂狗			}while(*(p-1)!='\n');//			*p++=Com_getchar(1,RTbuf);//			*(p)=0;		return(i);		}	}/*********************************************************************************************************** 函数名称: Com_R_count** 功能描述: 返回接收缓冲区字符个数函数** 输 入: ** 输出	 : 字符个数** 全局变量: 无** 调用模块: ** 说明:** 注意:********************************************************************************************************/uint8 Com_R_count(siocirqueue *RTbuf){return RTbuf->R_count;}/*********************************************************************************************************** 函数名称: Rbuf_init** 功能描述: 接收缓冲区初始化** 输 入: ** 输出	 : ** 全局变量: 无** 调用模块: ** 说明:** 注意:********************************************************************************************************/void Rbuf_init(siocirqueue *RTbuf){	RTbuf->R_front=0;	RTbuf->R_rear=0;    RTbuf->R_count=0;	RTbuf->R_overflow=0;}/*********************************************************************************************************** 函数名称: Tbuf_init** 功能描述: 发送缓冲区初始化** 输 入: ** 输出	 : ** 全局变量: 无** 调用模块: ** 说明:** 注意:********************************************************************************************************/void Tbuf_init(siocirqueue *RTbuf){	RTbuf->T_front=0;	RTbuf->T_rear=0;    RTbuf->T_count=0;	RTbuf->T_disabled=1;	}/*********************************************************************************************************** 函数名称: Rbuf_empty** 功能描述: 接收缓冲区判空** 输 入: ** 输出	 :  TRUE 空 FALSE 非空** 全局变量: 无** 调用模块: ** 说明:** 注意:********************************************************************************************************/uint8 Rbuf_empty(siocirqueue *RTbuf){	return RTbuf->R_count==0;	}/*********************************************************************************************************** 函数名称: Tbuf_empty** 功能描述: 发送缓冲区判空** 输 入: ** 输出	 :  TRUE 空 FALSE 非空** 全局变量: 无** 调用模块: ** 说明:** 注意:********************************************************************************************************uint8 Tbuf_empty(void){	return RTbuf->T_count==0;	}/*********************************************************************************************************** 函数名称: Rbuf_full** 功能描述: 接收缓冲区判满** 输 入: ** 输出	 :  TRUE 满 FALSE 非满** 全局变量: 无** 调用模块: ** 说明:** 注意:********************************************************************************************************uint8 Rbuf_full (void){	return RTbuf->R_count==RBUF_SIZE;	}/*********************************************************************************************************** 函数名称: Tbuf_full** 功能描述: 发送缓冲区判满** 输 入: ** 输出	 :  TRUE 满 FALSE 非满** 全局变量: 无** 调用模块: ** 说明:** 注意:********************************************************************************************************/uint8 Tbuf_full(siocirqueue *RTbuf){	return RTbuf->T_count==TBUF_SIZE;	}/*********************************************************************************************************** 函数名称: Rbuf_putchar** 功能描述: 把一个字符放入接收缓冲区** 输 入: ** 输出	 :  ** 全局变量: 无** 调用模块: ** 说明:** 注意:********************************************************************************************************void  Rbuf_putchar (uint8 x){	if(!Rbuf_full()){		REV_DIS();		RTbuf->R_count++;		RTbuf->R_buf[RTbuf->R_rear]=x;		RTbuf->R_rear=(RTbuf->R_rear+1) % RBUF_SIZE;		REV_EN();	}}/*********************************************************************************************************** 函数名称: Tbuf_putchar** 功能描述: 把一个字符放入发送缓冲区** 输 入: ** 输出	 :  ** 全局变量: 无** 调用模块: ** 说明:** 注意:********************************************************************************************************/void Tbuf_putchar(uint8 x,siocirqueue *RTbuf){	if(!Tbuf_full(RTbuf)){		TXC_DIS();		if (RTbuf->T_disabled)			{			UDR0=x;			RTbuf->T_disabled=0;			}		else			{			RTbuf->T_count++;			RTbuf->T_buf[RTbuf->T_rear]=x;			RTbuf->T_rear=(RTbuf->T_rear+1) % TBUF_SIZE;			}		TXC_EN();	}}/*********************************************************************************************************** 函数名称: Rbuf_getstring** 功能描述: 从接收缓冲区返回当前子串指针** 输 入: ** 输出	 :  当前子串指针** 全局变量: 无** 调用模块: ** 说明:** 注意:********************************************************************************************************uint8 * Rbuf_getstring(void){	return (RTbuf->R_buf[RTbuf->R_front]);}/*********************************************************************************************************** 函数名称: Tbuf_getstring** 功能描述: 从发送缓冲区返回当前子串指针** 输 入: ** 输出	 :  当前子串指针** 全局变量: 无** 调用模块: ** 说明:** 注意:********************************************************************************************************uint8 * Tbuf_getstring(void){	return (RTbuf->T_buf[RTbuf->T_front]);}/*********************************************************************************************************** 函数名称: Rbuf_putchar** 功能描述: 从接收缓冲区读一个字符** 输 入: ** 输出	 :  读字符** 全局变量: 无** 调用模块: ** 说明:** 注意:********************************************************************************************************/uint8 Rbuf_getchar(siocirqueue *RTbuf){	uint8 Btemp=0;	if (!Rbuf_empty(RTbuf)){		Btemp=RTbuf->R_buf[RTbuf->R_front];		REV_DIS();		RTbuf->R_count--;		RTbuf->R_front=(RTbuf->R_front+1) % RBUF_SIZE;		REV_EN();		}	return (Btemp);	}/*********************************************************************************************************** 函数名称: Tbuf_getchar** 功能描述: 从发送缓冲区读一个字符** 输 入: ** 输出	 :  读字符** 全局变量: 无** 调用模块: ** 说明:** 注意:********************************************************************************************************uint8 Tbuf_getchar(void){	uint8 Btemp;	if (!Tbuf_empty()){		Btemp=RTbuf->T_buf[RTbuf->T_front];		TXC_DIS();		RTbuf->T_count--;		RTbuf->T_front=(RTbuf->T_front+1) % TBUF_SIZE;		TXC_EN();		return (Btemp);	}}*//******************************* 中断处理函数 **************************** 功能:完成数据得的接收和发送***********************************************************************/#if USEUART0#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC void uart0_rx_isr(void){ uint8 status,data; siocirqueue *RTbuf; RTbuf=&RTbuf_UART0;// CLI(); status=UCSR0A; data=UDR0; //WDR(); //喂狗 if((status & (FRAMING_ERROR | DATA_OVERRUN))==0) 	{	if(RTbuf->R_count<RBUF_SIZE){		RTbuf->R_count++;		RTbuf->R_buf[RTbuf->R_rear]=data;		RTbuf->R_rear=(RTbuf->R_rear+1) % RBUF_SIZE;		}	else 	   {	   RTbuf->R_overflow=1;	   }	}//SEI();}	#pragma interrupt_handler uart0_tx_isr: iv_USART0_TXCvoid uart0_tx_isr(void){//CLI(); siocirqueue *RTbuf; //WDR(); //喂狗 RTbuf=&RTbuf_UART0; if (RTbuf->T_count>0){	UDR0=RTbuf->T_buf[RTbuf->T_front];	RTbuf->T_count--;	RTbuf->T_front=(RTbuf->T_front+1) % TBUF_SIZE;	} else RTbuf->T_disabled=1;//SEI();}#endif#if USEUART1#pragma interrupt_handler uart1_rx_isr:iv_USART1_RXC void uart1_rx_isr(void){ uint8 status,data; siocirqueue *RTbuf; RTbuf=&RTbuf_B;// CLI();//WDR(); //喂狗 status=UCSR1A; data=UDR1; if((status & (FRAMING_ERROR | DATA_OVERRUN))==0) 	{	if(RTbuf->R_count<RBUF_SIZE){		RTbuf->R_count++;		RTbuf->R_buf[RTbuf->R_rear]=data;		RTbuf->R_rear=(RTbuf->R_rear+1) % RBUF_SIZE;		}	else 	   {	   RTbuf->R_overflow=1;	   }	}//SEI();}	#pragma interrupt_handler uart1_tx_isr: iv_USART1_TXCvoid uart1_tx_isr(void){//CLI(); siocirqueue *RTbuf; //WDR(); //喂狗 RTbuf=&RTbuf_B; if (RTbuf->T_count>0){	UDR1=RTbuf->T_buf[RTbuf->T_front];	RTbuf->T_count--;	RTbuf->T_front=(RTbuf->T_front+1) % TBUF_SIZE;	} else RTbuf->T_disabled=1;//SEI();}#endif@

⌨️ 快捷键说明

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