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

📄 main.c

📁 通过本实验学习PC机串口与AVR单片机串口之间相互通讯的基本硬件接口电路和软件编程方法
💻 C
字号:
/*******************************************************/
/*作者:ntzwq@wx88.net     广州天河双龙电子公司    */
/*******************************************************
2004-10-20  肖 鹏 修改

修改目的主要是配合我的串口控制器的软件升级使用

1.原程序需要从BOOT启动,现修改为从应用程序区启动
2.为避免软件下载后单片机要硬件复位的不便,在BOOT程序中
  增加了看门狗复位功能
/******************************************************/
#include "self.h"
#include "assembly.h"
#include<iom8v.h>
extern unsigned char read_flash(unsigned int add);

/*  		字符输出函数 		 */
void sendchar(unsigned char c)
   {	 
     while (!(UCSRA&(1<<UDRE)));
     UDR=c;    
   }
/*  		字符输入函数 		 */	
unsigned char recchar(void)
   {
     while(!(UCSRA& (1<<RXC)));
     return UDR;
   }		
/*			UART初始化				*/	
void uart_init(void)
  {
    UCSRB=(1<<RXEN)|(1<<TXEN);//允许发送和接收
    UBBR=51;
    UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
  }

void iap(void)
  {
    unsigned int intval,address,data;
    unsigned char val, ldata;
    for(;;)                           
      {
       val=recchar();
       if(val=='b')                    //启动看门狗对CPU复位
          { 
	     WDTCR=(1<<WDCE)|(1<<WDE);
	  }       
       if(val=='a')                    
          { 
	     sendchar('Y');				    //Autoincrement is quicker
          }
       else if(val=='A')                   //write address 
          {
           address=recchar();                //read address 8 MSB
           address=(address<<8)|recchar();
           address=address<<1;               //convert from word address to byte address
           sendchar('\r');
          }
        else if(val=='c')                   //Write program memory, low byte
          {       
           ldata=recchar();
           sendchar('\r');
          }
        else if(val== 'C')                  //Write program memory, high byte 
          {
           data=ldata|(recchar()<<8);
           fill_temp_buffer(data,(address)); //call asm routine. 
           address+=2;  
           sendchar('\r');
          }        
         else if(val=='e')                   //Chip erase 
          {
           for(address=0;address < APP_END;address += PAGESIZE)  //Application section = 60 pages
             {
              write_page(address,0x03);       //Perform page erase
             }
           sendchar('\r');        
          }
         else if(val=='l')                   // write lockbits 
          {
           write_lock_bits(recchar());
           sendchar('\r');
          }       
         else if(val== 'm')                  // write page
          {
           write_page((address),0x05);       
           sendchar('\r');
          }        
         else if((val=='P')||(val=='L'))     // Enter programming mode 
          {
           sendchar('\r');
          }
         else if (val=='p')
          {
           sendchar('S');
          }              
         else if(val=='R')                   //Read program memory 
          {
		   if (address>=APP_END)
		     {
			  sendchar(0xff);
			  sendchar(0xff);
			  address+=2;
			 }
		   else
		     {           
              intval=read_program_memory(address,0x00);
              sendchar((char)(intval>>8));      //send MSB  
              sendchar((char)intval);           //send LSB
              address+=2;
		     }  
          }        
         else if (val == 'D')
          {
           EEARL = address;
           EEARH = (address >> 8);
           address++;
           EEDR = recchar();
           EECR |= (1<<EEMWE);
           EECR |= (1<<EEWE);
           while (EECR & (1<<EEWE))
              ;
           sendchar('\r');
           }
          else if (val == 'd')
           {
            EEARL = address;
            EEARH = (address >> 8);
            address++;
            EECR |= (1<<EERE);
            sendchar(EEDR);
           }       
          else if(val=='F')                   // read fuse bits
           {
            sendchar(read_program_memory(0x0000,0x09));
           }        
          else if(val=='r')                   // read lock bits
           {
            sendchar(read_program_memory(0x0001,0x09));
           }        
          else if(val=='N')                   // read high fuse bits
           {
            sendchar(read_program_memory(0x0003,0x09));
            }        
          else if(val=='t')                   // Return programmer type 
           {
            sendchar(device);
            sendchar(0);
            }
          else if ((val=='x')||(val=='y')||(val=='T'))
            {
             recchar();
             sendchar('\r');
            }       
          else if (val=='S')                  // Return software identifier 
            {
             sendchar('A');
             sendchar('V');
             sendchar('R');
             sendchar('B');
             sendchar('O');
             sendchar('O');
             sendchar('T');
            }			                       
          else if (val=='V')                  // Return Software Version
            {
             sendchar('1');
             sendchar('0');
             }        
          else if (val=='s')                  // Return Signature Byte
            {							
             sendchar(sig_byte3);
             sendchar(sig_byte2);
             sendchar(sig_byte1);
            }       
          else if(val!=0x1b)                  // if not esc
            {
             sendchar('?');
             }
         }	
}
void main(void)
  {
    uart_init();
    
    sendchar('0');   //进入BOOT区后,向串口发送“0upd”字符串
    sendchar('u');   //通知PC机CPU已经准备好了软件升级
    sendchar('p');
    sendchar('d');
    
    iap();
  }

⌨️ 快捷键说明

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