реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> IAR AVR + ATMega32 = Bootloader?, написание бутлодера на Си
Андрей К. Ф.
сообщение Jun 27 2008, 06:08
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 23-05-08
Пользователь №: 37 753



Программа до безобразия проста, но это не мешает ей не работать smile.gif
Код
#include <iom32.h>
#define QRZ 16000000L
#define LED_INIT  DDRC |= (1<<PC6)
#define LED_INVERS PORTC ^= (1<<PC6);

__C_task void main( void )
{
  //....
  GICR = 1<<IVCE;
  GICR = 1<<IVSEL;
  __disable_interrupt();
  LED_INIT;
  while (1)
  {
    LED_INVERS;
    __delay_cycles(0.5*QRZ);
  }
}

Компилятор: IAR C/C++ Compiler for AVR 4.20A/W32 [Evaluation] (4.20.1.3)
Компилирую программу и прошиваю ее "как обычно" (т.е. начиная с адреса 0x0000) --- она работает.
Прописываю в опциях линкера разместить программу по адресу 0x3800 (начало бутлоадера) "-M0=3800". HEX при этом выглядит так:
Код
:103800000C94720018951895189518951895189598
:103810001895189518951895189518951895189540
:103820001895189518951895189518951895189530
:103830001895189518951895189518951895189520
:103840001895189518951895189518951895189510
:10385000189518951895189548E055E060E8220FDE
:10386000001F111F10F4052716274A95C1F7089568
:10387000E897D15001E00BBF02E00BBFF894A69A85
:1038800000E415B3102715BB0FEF19E628E101502E
:1038900010402040E1F700C00000F2CF090161E0D4
:1038A00006C0002E69E003C063E001C065E0F801D6
:1038B00008D04FB7F89467BFE895FFFF00004FBFEF
:1038C000089577B770FDFDCF0895FBDF05D00EBBDF
:1038D0001FBB2DBBE29AE19AE199FECF089500004B
:1038E0008895FECF0FE90DBF00E00EBFC0E8D0E025
:1038F0000E9480000E9438000E946F000C946F00AC
:0439000001E0089545
:00000001FF

Фузы прошиваю так:
BOOTSZ = 00
BOOTRST = 0

И, естественно, ничего не работает. Программа не хочет запускаться из секции бутлоадера!
Что я делаю не так???
Go to the top of the page
 
+Quote Post
GDI
сообщение Jun 27 2008, 06:18
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Почему бы не взять готовый бутлоадер из апноута атмел и не посмотреть как там все сделано? AVR911 вроде он называется. В нем, кстати есть екселевский файл для рассчета адреса размещения в зависимости от контроллера и от размера области бутлоадера.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
IJAR
сообщение Jun 27 2008, 07:15
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 26-02-07
Из: г. Зеленоград
Пользователь №: 25 669



Цитата(Андрей К. Ф. @ Jun 27 2008, 10:08) *
Программа до безобразия проста, но это не мешает ей не работать smile.gif
Код
#include <iom32.h>
#define QRZ 16000000L
#define LED_INIT  DDRC |= (1<<PC6)
#define LED_INVERS PORTC ^= (1<<PC6);

__C_task void main( void )
{
  //....
  GICR = 1<<IVCE;
  GICR = 1<<IVSEL;
  __disable_interrupt();
  LED_INIT;
  while (1)
  {
    LED_INVERS;
    __delay_cycles(0.5*QRZ);
  }
}

Компилятор: IAR C/C++ Compiler for AVR 4.20A/W32 [Evaluation] (4.20.1.3)
Компилирую программу и прошиваю ее "как обычно" (т.е. начиная с адреса 0x0000) --- она работает.
Прописываю в опциях линкера разместить программу по адресу 0x3800 (начало бутлоадера) "-M0=3800". HEX при этом выглядит так:
Код
:103800000C94720018951895189518951895189598
:103810001895189518951895189518951895189540
:103820001895189518951895189518951895189530
:103830001895189518951895189518951895189520
:103840001895189518951895189518951895189510
:10385000189518951895189548E055E060E8220FDE
:10386000001F111F10F4052716274A95C1F7089568
:10387000E897D15001E00BBF02E00BBFF894A69A85
:1038800000E415B3102715BB0FEF19E628E101502E
:1038900010402040E1F700C00000F2CF090161E0D4
:1038A00006C0002E69E003C063E001C065E0F801D6
:1038B00008D04FB7F89467BFE895FFFF00004FBFEF
:1038C000089577B770FDFDCF0895FBDF05D00EBBDF
:1038D0001FBB2DBBE29AE19AE199FECF089500004B
:1038E0008895FECF0FE90DBF00E00EBFC0E8D0E025
:1038F0000E9480000E9438000E946F000C946F00AC
:0439000001E0089545
:00000001FF

Фузы прошиваю так:
BOOTSZ = 00
BOOTRST = 0

И, естественно, ничего не работает. Программа не хочет запускаться из секции бутлоадера!
Что я делаю не так???


Правильно - не должна работать:
:10 3800 00 0C 94 72 00 18 95 18 95 18 95 18 95 1895189598
означает:
начиная с адреса 0x3800 записать следующие 16 байт
0x3800 0x940C 0x0072 jmp 0x0072
0x3802 0x9518 reti
0x3803 0x9518 reti
......

т.е. при старте с адреса 0x3800 будет выполнен
переход на адрес 0x0072 - где может быть все что угодно,
но только не Ваша программа

Чтобв компилятор положил код с нужного адреса надо отрихтовать файл .xls


--------------------
Вяжешь - вой, а поедешь - песни пой.
Между "хочу" и "можно" всегда есть дистанция
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 13:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01367 секунд с 7
ELECTRONIX ©2004-2016