Вот набросал на досуге( правда нада отладить еще) для IARа. ( тактовая 128К)
Код
#define TB_BIT_IO BIT0
#define TB_PIN_IO PINB
#define TB_DDR_IO DDRB
#define TB_PORT_IO PORTB
#define TB_PASS 0xB63A
#pragma location="BootLoader"
uint8 __tinyBootloader_RX_bit( void)
{
uint8 ret = 0;
while( TB_PORT_IO & TB_BIT_IO){} //Wait '0'
__delay_cycles( 30);
if( TB_PORT_IO & TB_BIT_IO) // RX = 1
ret = 0x01;
while( !( TB_PORT_IO & TB_BIT_IO)){} //Wait '1'
return ret;
}
#pragma location="BootLoader"
void __tinyBootloader_TX_bit( uint8 q)
{
while( TB_PORT_IO & TB_BIT_IO){} //Wait '0'
if( !q) // TX = 0
{
TB_PORT_IO &= ~TB_BIT_IO;
TB_DDR_IO |= TB_BIT_IO;
__delay_cycles( 50);
TB_DDR_IO &= ~TB_BIT_IO;
TB_PORT_IO |= TB_BIT_IO;
}
__delay_cycles( 30);
while( !( TB_PORT_IO & TB_BIT_IO)){} //Wait '1'
}
#pragma location="BootLoader"
void tinyBootloader( void)
{
uint8 q;
uint16 addr, data;
__watchdog_reset();
// if( MCUSR ... XXXXXXXXX) // IF reset || PORF
// return;
// Init IO pin
TB_DDR_IO &= ~TB_BIT_IO;
TB_PORT_IO |= TB_BIT_IO;
__delay_cycles( 16);
// -------------------- Cheking START BootLoader ------------------------------- ???????????
// Wait '0' ???????????
q = 128; // ???????????
while( TB_PORT_IO & TB_BIT_IO) // ???????????
{ // ???????????
if( --q == 0) // TimeOut // ???????????
return; // ???????????
} // ???????????
// -------------------- Connecting ---------------------------------------------
// Wait PASS
__watchdog_reset();
WDTCR |= BIT4 | BIT3;//( 1 << WDCE) | ( 1 << WDE);
WDTCR = BIT3 | BIT2;//( 1 << WDE); // ~0.25 s
data = 0;
do
{
data <<= 1;
data |= __tinyBootloader_RX_bit();
}
while( data != TB_PASS);
// Confirm PASS
__watchdog_reset();
for( q = 16; q; q--)
{
__tinyBootloader_TX_bit( ( data & 0x8000));
data <<= 1;
}
// -------------------- Programming --------------------------------------------
// Program FLASH
__watchdog_reset();
for( addr = 0; addr < 0x300; addr += 2)
{
for( q = 16; q; q--)
{
data <<= 1;
data |= __tinyBootloader_RX_bit();
}
__AddrToZWordToR1R0ByteToSPMCR_SPM( ( void __flash*)addr, data, 1); // Fill Flash buffer
if( ( ( addr & 0xFF) & 0x0F) == 0x0E) //Page
{
__AddrToZByteToSPMCR_SPM( ( void __flash*)addr, 3); // Erase Page
__AddrToZByteToSPMCR_SPM( ( void __flash*)addr, 5); // Write Page
}
__watchdog_reset();
}
}
Принцип 1Ware с другими таймингами. Программатор( железо) будет простое: TXD(TTL) через диод к пину, RXD(TTL) к нему же напрямую. Скорость порта 9600 по прикидкам.
Впринципе до 256 байт еще недотягивает, так что можно приделать подтверждение постраничное......
Подготовку таблицы векторов доверю программе на РС.
Люди, кто писал бутлоадеры, посоветуйте чего нибудь полезного.
Сообщение отредактировал pt200 - Jun 25 2009, 12:23