|
|
  |
bootloader в IARe 3,10, Помогите разобраться как сделать |
|
|
|
Jan 20 2008, 19:27
|
Группа: Новичок
Сообщений: 9
Регистрация: 20-01-08
Пользователь №: 34 261

|
Эмм ошибка в пустой функции??? Кстати в АврСтудио все норм, как и должно быть а в железе чушь ((( Уже 5 ночей бьюсь ничего не помогает... Контроллер скажете вы, увы, пробовал на 3-х - один результат. Я грешу на настройки компилятора или фьюзы. Может есть какой нить заковыйрестый фьюзик? Вообще был бы благодарен если бы кто нить откомпили пустую функцию main в IAR 4 - тогда сразу бы нашел у себя ошибку.
|
|
|
|
|
Jan 20 2008, 19:52
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(Breese @ Jan 20 2008, 22:27)  Может есть какой нить заковыйрестый фьюзик? А что там у вас с M103C ? Анатолий.
|
|
|
|
|
Jan 20 2008, 20:08
|
Группа: Новичок
Сообщений: 9
Регистрация: 20-01-08
Пользователь №: 34 261

|
Цитата(aesok @ Jan 20 2008, 22:52)  А что там у вас с M103C ?
Анатолий. Был запрограммирован (PonyProg), щас распрограммировали и... ЗАРАБОТАЛО!!! Ребята вы боги!!!
|
|
|
|
|
Aug 22 2009, 18:52
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 10-07-07
Пользователь №: 29 035

|
вот и у меня пришло время писать boot loader, начитавшись и натренировавшись столкнулся с такой проблемой... бут лоадер грузит программу с адреса 000000 и вроде запускает, первые команды проходят а дальше тишина, такое впечатление что не работают прерывания, может кто сталкивался с подобным - помогите - сижу уже битый час и все никак.. (компилятор IAR проц ATMega1280)
|
|
|
|
|
Aug 22 2009, 21:01
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(YWAS @ Aug 22 2009, 21:52)  такое впечатление что не работают прерывания, Или вы переключили вектора на нулевые адреса, но забыли отключить какое-то из прерываний загрузчика. В результате оно стало попадать на пустой обработчик, а часть прерываний (TXE, UDR) не сбрасываются просто от самого факта входа в обработчик. Поставьте заглушки на все неиспользуемые вектора и дергайте в каждой заглушке своей ногой. Легко найдете, в каком прерывании вы зацикливаетесь. Если свободных ног мало, но есть осциллограф, можно наблюдать разные затычки на одной ноге так.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Aug 23 2009, 08:42
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 10-07-07
Пользователь №: 29 035

|
Сергей спасибо за подсказки... Все оказалось тривиально просто, после возвращения из бут лоадера не переключился бит IVSEL, и вектора остались в бут области, переключив этот бит в 0 все заработало на ура....чего и всем желаю... ------------------------------------------------------------------------------------------ __disable_interrupt(); char temp; temp = MCUCR; // Get MCUCR MCUCR = temp|(1<<IVCE); // Enable change of Interrupt Vectors MCUCR = temp|(1<<IVSEL); // Move interrupts to Boot Flash section ------------------------------------------------------------------------------------------- __disable_interrupt(); temp = MCUCR; // Get MCUCR MCUCR = temp|(1<<IVCE); // Enable change of Interrupt Vectors MCUCR = temp&(0<<IVSEL); // Move interrupts to 0x00000 Flash section
|
|
|
|
|
Aug 23 2009, 09:46
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 10-07-07
Пользователь №: 29 035

|
типа того, ошибся немного, было так MCUCR = temp|(0<<IVSEL); // Move interrupts to 0x00000 Flash section
|
|
|
|
|
Feb 17 2011, 13:30
|

4 синих кубика
   
Группа: Участник
Сообщений: 526
Регистрация: 19-09-08
Из: полупроводника, металла и стекла
Пользователь №: 40 326

|
Имеется основная программа в ATmega16, которая по команде с UARTа стирает одну страницу, вызывая следующую подпрограмму: Код void erase_test(void) @ "BOOTSECTION" { _WAIT_FOR_SPM(); _ENABLE_RWW_SECTION(); _PAGE_ERASE(0x2800); } Непосредственно перед вызовом прерывания запрещаю. Сама подпрограмма лежит в области загрузчика (в линкере секция BOOTSECTION прописана "куда надо"), страницу действительно стирает, но назад в основную программу не возвращается. Контроллер, кстати, продолжает генерировать ШИМ по одному из таймеров. В чём может быть проблема? Добавлю, что по адресу 0x2800..0x2880 (1 страница = 128 байт) нет кода программы, там лежат данные, так что сама себя программа стиранием этой области не портит.
--------------------
p-n-p-p-n-p-n-n-p-n-p структура однако очень эффективна
|
|
|
|
|
Feb 17 2011, 14:02
|

4 синих кубика
   
Группа: Участник
Сообщений: 526
Регистрация: 19-09-08
Из: полупроводника, металла и стекла
Пользователь №: 40 326

|
Сергей Борщ, спасибо. Похоже, надо делать так: Код void erase_test(void) @ "BOOTSECTION" { _PAGE_ERASE(0x2800);//стираем страницу _WAIT_FOR_SPM();//ждём выполнения команды SPM _ENABLE_RWW_SECTION();//активируем RWW-секцию _WAIT_FOR_SPM();//опять ждём выполнения команды SPM }
--------------------
p-n-p-p-n-p-n-n-p-n-p структура однако очень эффективна
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|