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

 
 
> IAP и LPC1768, Непонятные проблемы со стиранием
Polaris
сообщение Mar 16 2010, 16:18
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 266
Регистрация: 8-12-05
Пользователь №: 11 964



Добрый день!

Пытаюсь использовать для размещения констант флэш LPC1768 (ее там много, а ставить что-то снаружи не хочется), на базе примера EEPROM для LPC2368 слегка изменил код и подстроил его под свои нужды. На LPC2368 код работал без проблем. Сейчас возникают непонятные зависоны при стирании флэша (только при стирании, запись работает как часы). Вот мой код:

Код
#define IAP_LOCATION             0x1fff1ff1

#define EE1_SEC_L        14                //Flash sector where EEPROM begins (see UM for details)
#define EE1_SEC_H        14                  //Flash sector where EEPROM ends (see UM for details)
#define EE1_ADDR_L        0x0000E000        //Must match the EE_SEC_L Flash sector start address
#define EE1_ADDR_H        0x0000EFFF         //Must match the EE_SEC_H Flash sector end address
#define EE_CCLK        96000            //system clock cclk expressed in kHz (96MHz)

typedef void (*IAP)(unsigned int [],unsigned int[]);
IAP iap_entry;

TDWord EEPROM_Erase(void)
{
    unsigned int command_iap[5];
    unsigned int result_iap[3];

    __disable_irq();

    command_iap[0]=50;                    //prepare sectors from EE_SEC_L to EE_SEC_H for erase
    command_iap[1]=EE1_SEC_L;
    command_iap[2]=EE1_SEC_H;
    iap_entry=(IAP) IAP_LOCATION;
    iap_entry(command_iap,result_iap);

    command_iap[0]=52;                    //erase sectors from EE_SEC_L to EE_SEC_H
    command_iap[1]=EE1_SEC_L;
    command_iap[2]=EE1_SEC_H;
    command_iap[3]=EE_CCLK;
    iap_entry=(IAP) IAP_LOCATION;
    iap_entry(command_iap,result_iap);

    command_iap[0]=53;                    //blankcheck sectors from EE_SEC_L to EE_SEC_H
    command_iap[1]=EE1_SEC_L;
    command_iap[2]=EE1_SEC_H;
    iap_entry=(IAP) IAP_LOCATION;
    iap_entry(command_iap,result_iap);

    __enable_irq();

    return result_iap[0];
}


При прохождении отладчиком не виснет, если же просто загрузить приложение, то виснет секунд на 30, потом работает нормально. Запись во флэш производится, что удивительно. Никто с подобным не сталкивался??
Заранее спасибо!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Polaris
сообщение Mar 18 2010, 14:45
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 266
Регистрация: 8-12-05
Пользователь №: 11 964



Вроде бы обнаружил причину неправильной работы. Ранее я писал, что не работают прерывания. Они работают. За исключением одного - прерывания от RIT (Repetitive Interrupt Timer). Впечатление о неработающей остальной периферии сложилось из-за того, что я использую RIT в качестве системного таймера, где вызывается ряд других обработчиков. Да, я в курсе, что в Кортексах есть System Tick Timer, но мне нужна была частота повыше, чем 100 Гц (500 Гц конкретно). В общих чертах анамнез следующий: при вызывании функции IAP Erase Sector происходит блокировка прерываний RIT примерно на 30-40 секунд, что в условиях моего приложения имело катастрофические последствия (зависание системы на это время). В чем причина - не знаю, ничего в документах про подобное поведение не обнаружил. Других причин быть не может, урезал уже до самого минимального функционала программу - ничего не изменилось. Вся проблема именно в блокировке RIT. Очень смахивает на какой-то баг в ядре LPC17xx. С удовольствием послушал бы возможные версии причин smile.gif
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 06:59
Рейтинг@Mail.ru


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