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

📄 bootloader.c

📁 mega88的bootload, 基于串口,支持flash读写,eeprom读写,fuse读写,编译环境IAR for AVR 4.20, 包含xcl配置文件
💻 C
字号:
/*******************************************************************************
; Page Erase
; re-enable the RWW section
; transfer data to Flash page buffer
; execute Page Write
; re-enable the RWW section
; read back and check, optional
; return to RWW section
; verify that RWW section is safe to read

Return:
in temp1, SPMCSR
sbrs temp1, RWWSB ; If RWWSB is set, the RWW section is not ready yet
ret

; re-enable the RWW section

*******************************************************************************/

#include "bootloader.h"

#define	  SET_CD_STR 		(PORTB |= 1 << PB0)
#define	  CLR_CD_STR 		(PORTB &= ~ (1 << PB0))
#define   SET_SPI_DATA		(PORTB |= 1 << PB2)
#define	  CLR_SPI_DATA		(PORTB &= ~ (1 << PB2))	
#define   SET_SPI_CLK		(PORTB |= 1 << PB1)
#define	  CLR_SPI_CLK		(PORTB &= ~ (1 << PB1))	

//==============================================================================
void Led(BYTE cmd)
{
	BYTE	i;
	
	DDRB = B0000_0111;
  	CLR_CD_STR;
  	SET_CD_STR;
	
	for(i=0;i<8;i++){
		if(cmd& 0x80) SET_SPI_DATA;
		else  CLR_SPI_DATA;
		_NOP();_NOP();
		CLR_SPI_CLK;
		cmd <<= 1;
		SET_SPI_CLK	;
	}
	
  	CLR_CD_STR;
}
//==============================================================================
void Pause_1mS(BYTE delay)
{
	while(delay--){
		for(BYTE j = 10;j;j--)
			for(BYTE i = 100;i>0;i--){
			  _NOP();
			  _NOP();
			  _NOP();
			  _NOP();
			  _NOP();
			  _NOP();
			  _NOP();
			}
	}
}
//==============================================================================
void Spm_wait(void)
{
	WAIT_EEPROM;
	while(SPMCSR & (1<<RWWSB)) {
        while(SPMCSR & (1<<SPMEN));
        SPMCSR = 0x11;
        asm("spm ");
    }
}
//-------------------------------------------------------------------------
void Spm_page_cmd(unsigned int p_address,char code)
{
	asm("movw r30,  r16");
	SPMCSR = code;
    asm("spm");

	Spm_wait();
}

//-------------------------------------------------------------------------
void Spm_page_fill(unsigned int address,int data)
{
	asm("movw r30,r16");
	asm("movw r0,r18");
    SPMCSR = 0x01;
    asm("spm");
}

//-------------------------------------------------------------------------
/*	The Boot Lock bits can be set in software andin Serial or Parallel Programming
	mode, but they can be cleared by a Chip Erase commandonly.
*/
void Spm_fuse_write(unsigned int address,int data)
{
	asm("movw r30,r16");
	asm("movw r0,   r18");	
    SPMCSR = 0x09;
    asm("spm");
}
//-------------------------------------------------------------------------
// Fuse Low byte,	0x0000		FLB7 FLB6 FLB5 FLB4 FLB3 FLB2 FLB1 FLB0
// Lock bits, 		0x0001		– – BLB12 BLB11 BLB02 BLB01 LB2 LB1
// Fuse byte,  		0x0002		– – – – EFB3 EFB2 EFB1 EFB0
// Fuse High byte, 	0x0003		FHB7 FHB6 FHB5 FHB4 FHB3 FHB2 FHB1 FHB0
// cmd == 0, 		read falsh
// cmd == 0x09		read fuse and lock
// e2,ff,fa,9f(9E)

char Read_flash_fuse (unsigned int addr ,char cmd)
{
    asm("movw   r30,  r16	");        											// move adress to z pointer
	asm("sbrc   R18,  0	");
	SPMCSR = cmd;
	asm("lpm 	r16,  z		");
	asm("clr 	r17			");											// make warning here
}

//==============================================================================
void EEPPUT(unsigned int ADR,char val)
{
	Spm_wait();
 	EEAR = ADR;
	EEDR = val;
	EECR |= (1<<EEMPE);
	EECR |= (1<<EEPE);
}

//==============================================================================
char EEPGET(unsigned int ADR)
{
	Spm_wait();
    EEAR = ADR;
	EECR |= (1<<EERE);
	return EEDR;
}
//==============================================================================
void main(void)
{
	Disp_on();
	
	//_CLI();
	//DDRC  = B1100_0000;								// port switch
	//PORTC = B1000_0000;

//-----------------------------------------------------------------------------
    //RXCn TXCn UDREn FEn DORn UPEn U2Xn MPCMn (UCSRnA)
    UCSR0A = B0000_0010;
	
	//RXCIEn TXCIEn UDRIEn RXENn TXENn UCSZn2 RXB8n TXB8n (UCSRnB)
    UCSR0B = B0001_1000;
	
    //UMSELn1 UMSELn0 UPMn1 UPMn0 USBSn UCSZn1 UCSZn0 UCPOLn (UCSRnC)
    UCSR0C = B0000_1110;
	
#ifdef USE_UBRR0H
	UBRR0H = HIGH(BAUD_SET9600);
#endif
    UBRR0L = LOW(BAUD_SET9600);


//-----------------------------------------------------------------------------
/*TCCR0A = B0000_0010;TCCR0B = B0000_0101;
    //TCNT0
	OCR0A = TIMER_OCR0A;			//10ms-77,15ms-166,20ms-155
    //OCR0B

    //COM0A1 COM0A0 COM0B1 COM0B0 – – WGM01 WGM00 [TCCR0A]
    TCCR0A = B0000_0010;

    //FOC0A FOC0B – – WGM02 CS02 CS01 CS00 [TCCR0B]
    TCCR0B = B0000_0101;
	
	//– – – – – OCIE0B OCIE0A TOIE0 [TIMSK0]
    //TIMSK0 = B0000_0000;

	//– – – – – OCF0B OCF0A TOV0 [TIFR0]
    //TIFR0 = 0;
*/
	//TCNT0
	//OCR0 = TIMER_OCR0A;
	
	//FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00 [TCCR0]
	//TCCR0 = B0000_1111;
	
	//OCF2 TOV2 ICF1 OCF1A OCF1B TOV1 OCF0 TOV0 [TIFR]
	//TIFR = B0000_0000;

	TIMER_INIT();
	
//-----------------------------------------------------------------------------
	
	Wait = BOOT_WAIT;
	while(Wait){
	
#ifdef ALWAYS_CHECK_LINK		
		Slip_unpackage();
#else
		if(Slip_unpackage()){
			Wait = 0;
			while(1) Slip_unpackage();
		}
#endif		
		
	}
	Goto_app();
}

⌨️ 快捷键说明

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