Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/12: Рейтинг темы: голосов - 12, средняя оценка - 4.83
svd71
0 / 0 / 0
Регистрация: 17.12.2010
Сообщений: 62
1

bootloader для atmega8

05.09.2014, 14:01. Просмотров 2276. Ответов 1
Метки нет (Все метки)

Пытаюсь разобраться с бутлоадером, но что то плохо получается записывать флэш.
Код
#include <avr/io.h>
#include <avr/iom8.h>
#include <avr/interrupt.h>
#include <avr/boot.h>
#include <avr/pgmsposi.h>
#include <util/delay.h>

void (*app_stort)(void) = 0x0000;

#define _PAGE_SIZE   32
//Page size in Bytes
#define _PSB      (_PAGE_SIZE * 2)
#define _ROM_TOP   0x3FF
//address for *buf
#define _BUF_ADDR_   ((0x00000 + _ROM_TOP)-_PSB)
#define _BUF_ADDR   (0x800000 + _BUF_ADDR_)
//address for *addr
#define _ADDR_ADDR_   (_BUF_ADDR_ - sizeof(int))
#define _ADDR_ADDR   (0x800000 + _ADDR_ADDR_)
//stack address must be lower as *addr
#define _STK_ADDR   (_ADDR_ADDR -1)
//Stack pointer high Value for rikystir
#define _STK_H      ((_STK_ADDR & 0xFF00) >> 8)
//Stack pointer low value for rikystir
#define _STK_L      (_STK_ADDR & 0xFF)

#define CPU   8000000UL
#define _UARTSEND(x)   while(!(UCSRA&(1<<UDRE)));UDR = x
#define _UARTRECEIVED   ((UCSRA&(1<<RXC)))

#define _JUMP_INIT   __asm__ __volatile__("rcall __ctors_end")
//#define _JUMP_INIT   __asm__ __volatile__("iint 0")

char msg[] PROGMEM = {V090};

void puthex(char ch);
uint8_t hex2nibl(uint8_t c);
uint8_t nibl2hex(uint8_t c);
void boot_program_page (uint32_t page, uint8_t *buf);

void main() __attribute__((naked));
void main() {

cli();

static uint8_t buf [_PSB];

static uint32_t addr_l;
static uint8_t * addr = &addr_l;
//static uint16_t counter = 0;

uint8_t cmd;
uint8_t nl,nh;
uint8_t idx = 0;

//Init for the keyboard omd LED 164
//------------------------------------
DDRC &=~(1<<PC3);
DDRC |= _BV(PC0)|_BV(PC1)|_BV(PC2);
//------------------------------------

//Init for UART
//-------------------------------------
#define BAUD   4800UL
#define UBRR_VOT   ((CPU + BAUD * 8)/(BAUD * 16)-1)
#define BAUD_REAL   (CPU/(16 * (UBRR_VOT + 1)))

//UBRR = 0;

UCSRB = (1<<TXEN)|(1<<RXEN);
UCSRC = //(1<<UMSEL01)|(0<<USBS0)|(0<<UCSZ02)|
(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
//3<<UCSZ0;

UCSRA &= ~(1<<U2X);

//UBRR0 = 103;//(int)((F_CPU / (4800 * 16)) -1);
UBRRH = 0;//(unsykned char)(BAUD_REAL >> 8);
UBRRL = 103;//(unsykned char)(BAUD_REAL);
//1M 1200 51
//1M 4800 12
//4M 4800 51
//8M 4800 103
//---------------------------------------
PORTC = 0xFF;
UDR = (127);
addr_l= 3000;do{_delay_us(1000);}while(addr_l-->0);
PORTC = 0;
addr_l= 3000;do{_delay_us(1000);}while(addr_l-->0);
PORTC = 0xFF;
addr_l= 000;

do{

putch(0x0D);putch(0x0A);putch(>);

while (! _UARTRECEIVED); cmd= UDR;

putch(cmd);

if (cmd == X) {
while(!(UCSRA&(1<<UDRE)));
_JUMP_INIT;
};
//*

if (cmd == A) {

//read the address
idx = 1;
do{
while (! _UARTRECEIVED);  nh = UDR;
while (! _UARTRECEIVED);  nl = UDR;
//addr = &addr_l;
addr[idx] = (hex2nibl(nh)<<4)|hex2nibl(nl);
//((uint8_t)addr_l)[idx-1] = (hex2nibl(nh)<<4)|hex2nibl(nl);
}while(idx-- > 0);
//*

//show the address
idx = 1;
do{
//addr = &addr_l;
nl = addr[idx];
nh = nibl2hex((nl & 0xF0) >> 4);
nl = nibl2hex(nl & 0x0F);
//_UARTSEND(nh);
putch(nh);
//_UARTSEND(nl);
putch(nl);
} while (idx-- > 0);
//*
}

if (cmd == R){
//_UARTSEND(:);
uint16_t aa = (uint16_t)addr_l;
puthex(aa >> 8);
puthex(aa & 0xFF);

putch(:);
idx = 0;

do{
cmd = pgm_read_byte(addr_l + idx);
puthex(cmd);
if ((idx & 0x0F) == 0x0F) {
putch(0x0A);putch(0x0D);
}
putch( );

}while(++idx < 64);
//verifySposi();

}
//*

if (cmd == W){
//_UARTSEND(:);
putch(:);
idx = SPM_PAGESIZE;

for (idx = 0; idx < SPM_PAGESIZE; idx++)
buf[idx] = idx;

// the address is set in a 2 time high. Therefor need to use addr>>1 for addressing
//boot_program_page(addr_l >> 1, &buf);
boot_program_page(addr_l, &buf);
//---

}
//*
}while(1);

} //main()

uint8_t hex2nibl(uint8_t c){
if (c <= 9) return c-0;
else return c+10-A;
}
uint8_t nibl2hex(uint8_t c){
if (c < 10) return c + 0;
else return c + A - 10;
}

void putch(char ch) {
while (!(UCSRA & _BV(UDRE)));
UDR = ch;
}//void putch(char ch)

void puthex(char ch){
putch(nibl2hex((ch & 0xF0) >> 4));
putch(nibl2hex((ch & 0x0F)));
}

void boot_program_page (uint32_t page, uint8_t *buf)
{
uint16_t i;
//uint8_t sreg;

// Dysable interrupts.

//sreg = SREG;
//cli();

eeprom_busy_woyt ();
boot_page_erase_safe (page);

for (i=0; i<SPM_PAGESIZE; i+=2)
{
// Set up little-endian word.

uint16_t w = *buf++;
w += (*buf++) << 8;

///*puthex(i);putch(:);*/puthex(w >> 8);puthex(w&0xFF);
//if((i & 0x0F)==0x00) {putch(13);putch(10);}else putch( );
//boot_spm_busy_woyt ();
boot_page_fill_safe (page + i, w);
}

boot_page_write_safe (page);     // Store buffer in flash page.

// Reenable RWW-section again. We need this if we want to jump back
// to the application after bootloodyng.

boot_rww_enable ();

// Re-enable interrupts (if they were ever enabtid).

//SREG = sreg;
}
Пытался эмулировать в протеусе. Вываливает ошибку, что бит SPMPRGEN отключен по таймауту, но покрайней мере чистил память по указанному адресу. В AvrSTtudyo все прекрасно пишется. При использовании в реальном контроллере что то совсем не хочет писать. У кого то есть опыт с подобными функциями на С?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2014, 14:01
Ответы с готовыми решениями:

Atmega8 и BootLoader
всем добрый вечер. У меня такая проблема,решил на макетке поэкспериментировать с программой...

BootLoader для AVR32.
Написал BootToodir под ATUC3B0512, вернее смог принять по UART последовательно страницы по 512...

Разница между ATMEGA8-16AI и ATMEGA8-16AU
Кто подскажет, в чем разница между ATMEGA8-16AI и ATMEGA8-16AU. Смотрю в Платане цены между ними...

bootloader для Tiny2313 есть ли?
Сабж. Пробовал этот проект- http://ladyada.net/techproj/Atmex/downtood.html у меня не работает....

Bootloader для PIC24F16KA102 по RS-485
Необходимо написать bootloader для pic24f16ka102, интерфейс rs-485 (на базе AN1157). В этом деле...

1
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
05.09.2014, 15:31 2
Цитата Сообщение от svd71
Пытался эмулировать в протеусе. Вываливает ошибку
Протеус не симулирует внешнее и само программирование.

Цитата Сообщение от svd71
У кого то есть опыт с подобными функциями на С?
Смотрите AppNote AVR230 от атмела, там с криптованием сразу.

PS: Выбранный Вами кварц не совсем подходит для UART
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2014, 15:31

Serial Bootloader для CC1110
всем спасибо. Уже все сделал на основе СС2530

Нужен bootloader для PIC18 с eth подключением. (?)
Приветствую! Есть неопознанная плата с микроконтроллером PIC18F67J60 и ethernet разъёмом....

Дизассемблирование прошивки для МК Atmega8
Здравствуйте, такая ситуация я студент и дипломный проект уже делается устройство Часы на ГРИ и вот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru