|
|
  |
at91sam7x256 + Keil. Спецы - ВЫРУЧАЙТЕ, Запись во внутреннюю FLASH -> проблемы |
|
|
|
Jan 5 2008, 09:16
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 29-09-06
Из: Зеленорад
Пользователь №: 20 810

|
Всем доброго времени суток!
Проблема в следующем:
Сделал проектик под Кейлом v3.50, в котором происходит заполнение массива из 256 байт (от 0x00 до 0xFF), а затем запись его в страницу внутренней флэш камня. Брал пример с этого форума, сделанный в IAR, переделал его под кейл...наступил на грабли...
после записи страницы
for (i = 0; i < EFC_PAGE_SIZE_UINT; i++) *(pflash + i ) = *(pbuf + i);
идут две волшебные строчки:
Строчка1 AT91C_BASE_MC->MC_FCR = (0x5A << 24) | (page << 8 ) |AT91C_MC_FCMD_START_PROG;
Строчка 2 while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY));
Так вот, если в отладке ставлю брекпоинт на строчке 2, то страница пишется, а после запуска Run программа нормально выполняется. Если же убираю этот брекпоинт, то выполнение строчки 2 не происходит, и программа вываливается в DAbt_Handler. Без эмулятора, похоже, программа также зависает в этом же месте. Эмулятор от Segger, устройство - пока на 7X-EK
Кто нить ловил такой глюк?
Заране благодарен
|
|
|
|
|
Jan 5 2008, 09:57
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 27-09-05
Пользователь №: 8 980

|
прерывания на момент активации записи во флеш запрещены? процедура записи исполняется из RAM?
|
|
|
|
|
Jan 5 2008, 11:23
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 29-09-06
Из: Зеленорад
Пользователь №: 20 810

|
Цитата(Dimentius @ Jan 5 2008, 12:57)  прерывания на момент активации записи во флеш запрещены? процедура записи исполняется из RAM? Да прерывания отключены (с помошью асмововой функции на уровне ядра) Функция записи во флеш находится в отдельном файле который кладется в ОЗУ т.е. по идее функция исполняется из RAM Если нужно могу выложить фрагменты кода
|
|
|
|
|
Jan 5 2008, 11:45
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 27-09-05
Пользователь №: 8 980

|
в регистре MC_FMR поле FMCN правильно задано?
When writing the rest of the Flash, this field defines the number of Master Clock cycles in 1.5 microseconds. This number must be rounded up.
|
|
|
|
|
Jan 5 2008, 12:52
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 29-09-06
Из: Зеленорад
Пользователь №: 20 810

|
Тут внимательно посмотрел в дизассемблере , оказывается, у меня функции записи лежат во флэше (адреса, начиная с 0x100000). Я же вроде в свойствах их файла указывал, что надо их помещать в IRAM1, который у меня начинается с 0x200000?
|
|
|
|
|
Jan 10 2008, 08:53
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 29-09-06
Из: Зеленорад
Пользователь №: 20 810

|
Разобрался я, как писать/читать флэш.
Но теперь встал другой вопрос. Как правильно отключить прерывания на уровне ядра?
Люди добрые, скиньте, плиз рабочий асмовый файл с этим кодом
|
|
|
|
|
Jan 10 2008, 13:50
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 29-09-06
Из: Зеленорад
Пользователь №: 20 810

|
KRS, последовал Вашему примеру
Вот кусок файла sam7.s
; Enter User Mode and set its Stack Pointer ;MSR CPSR_c, #Mode_USR MSR CPSR_c, #Mode_SVC MOV SP, R0 ;SUB SL, SP, #USR_Stack_Size SUB SL, SP, #SVC_Stack_Size
В общем, я подменил user mode на supervisor. Биты I и F стали управляемыим. Вопрос. В принципе, в этом режиме можно и остаться?
Сообщение отредактировал Niger - Jan 10 2008, 13:51
|
|
|
|
|
Jan 10 2008, 16:17
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(aaarrr @ Jan 10 2008, 18:32)  Почему это нельзя?
На процессорах класса SAM7 использовать отличные от supervisor режимы смысла не имеет, так как защита отсутствует в принципе. Потому что если используется SWI то R14_svc = address of next instruction after the SWI instruction SPSR_svc = CPSR CPSR[4:0] = 0b10011 /* Enter Supervisor mode */ CPSR[5] = 0 /* Execute in ARM state */ /* CPSR[6] is unchanged */ CPSR[7] = 1 /* Disable normal interrupts */ if high vectors configured then PC = 0xFFFF0008 else PC = 0x00000008 соответсвенно LR у вас испортится т.к. проц уже в supervisor mode Поэтому имеет смысл переключаться и оставаться в system mode
|
|
|
|
|
Jan 23 2008, 14:12
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 29-09-06
Из: Зеленорад
Пользователь №: 20 810

|
Все, работает!!!
Всем спасибо.
Если кому надо тестовый проект, обращайтесь
|
|
|
|
|
Feb 7 2008, 22:46
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Niger @ Jan 10 2008, 15:50)  В общем, я подменил user mode на supervisor. Биты I и F стали управляемыим. Вопрос. В принципе, в этом режиме можно и остаться? Можно замаскировать все прерывания через AIC: Код unsigned long iMask = pAIC->AIC_IMR; pAIC->AIC_IDCR = 0xFFFFFFFF;
..... тут прерывания запрещены
pAIC->AIC_IECR = iMask; .. тут восстановлены. Работает не зависимо от режима.
|
|
|
|
|
Feb 8 2008, 00:31
|

Частый гость
 
Группа: Новичок
Сообщений: 111
Регистрация: 10-02-07
Из: St.Petersburg, Russia
Пользователь №: 25 241

|
Цитата(Dimentius @ Jan 5 2008, 14:45)  в регистре MC_FMR поле FMCN правильно задано? When writing the rest of the Flash, this field defines the number of Master Clock cycles in 1.5 microseconds. This number must be rounded up. Кстати да. При неправильном задании глюки незабываемые (ввиду того, что к моменту завершения записи и установки флага FLASH всё ещё находится в нерабочем что ли состоянии -- понять сложно, но валится чаще в разные аборты). При исправлении этого значения на положенное сбоев нет.
--------------------
[ZX]
|
|
|
|
|
Feb 8 2008, 15:04
|
Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970

|
свои пять копеек  При неправильной установке FMCN проявлялись редкие баги с записью в флеш - в одном случае из 10-ти проц после обновления прошивки (удаленной, по сети) не поднимался. Иногда падал при старте, диагноз - испорченная нулевая страница SAM7X256/S256
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|