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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> как работать с IAP?
bigarmer
сообщение Feb 7 2009, 07:32
Сообщение #16


Участник
*

Группа: Новичок
Сообщений: 52
Регистрация: 5-12-08
Пользователь №: 42 221



CODE


===========IAP.C=============



#include "IAP.h"

#define IAP_CLK Fcclk

#define IAP_LOCATION 0x7FFFFFF1
#define iap_entry(a, cool.gif ((void (*)())(IAP_LOCATION))(a, cool.gif

unsigned long command[5] = {0,0,0,0,0};
unsigned long result[3]= {0,0,0};


/*************************************************************************
* Function Name: IAP_PrepareSec
* Parameters: unsigned long StartSecNum -- Start Sector Number
* unsigned long EndSecNum -- End Sector Number
* Return: unsigned long -- Status Code
*
* Description: This command must be executed before executing "Copy RAM to Flash" or
* "Erase Sector(s)" command.
*
*************************************************************************/
unsigned long IAP_PrepareSec (unsigned long StartSecNum, unsigned long EndSecNum)
{
if (EndSecNum < StartSecNum)
return IAP_STA_INVALD_PARAM;

command[0] = IAP_CMD_PrepareSec;
command[1] = StartSecNum;
command[2] = EndSecNum;
iap_entry(command, result);

return result[0];
}

/*************************************************************************
* Function Name: IAP_CopyRAMToFlash
* Parameters: unsigned long dst -- Destination Flash address, should be a 256 byte boundary.
* unsigned long src -- Source RAM address, should be a word boundary
* unsigned long number -- 256 | 512 |1024 |4096
* Return: unsigned long -- Status Code
*
* Description: This command is used to program the flash memory.
*
*************************************************************************/
unsigned long IAP_CopyRAMToFlash (unsigned long dst, unsigned long src,
unsigned long number)
{
command[0] = IAP_CMD_CopyRAMToFlash;
command[1] = dst;
command[2] = src;
command[3] = number;
command[4] = IAP_CLK / 1000; // Fcclk in KHz
iap_entry(command, result);

return result[0];
}


/*************************************************************************
* Function Name: IAP_EraseSec
* Parameters: unsigned long StartSecNum -- Start Sector Number
* unsigned long EndSecNum -- End Sector Number
* Return: unsigned long -- Status Code
*
* Description: This command is used to erase a sector or multiple sectors of on-chip Flash
* memory.
*
*************************************************************************/
unsigned long IAP_EraseSec (unsigned long StartSecNum, unsigned long EndSecNum)
{
if (EndSecNum < StartSecNum)
return IAP_STA_INVALD_PARAM;

command[0] = IAP_CMD_EraseSec;
command[1] = StartSecNum;
command[2] = EndSecNum;
command[3] = IAP_CLK / 1000;
iap_entry(command, result);

return result[0];
}

/*************************************************************************
* Function Name: IAP_BlankChkSec
* Parameters: unsigned long StartSecNum -- Start Sector Number
* unsigned long EndSecNum -- End Sector Number
* Return: unsigned long -- Status Code
*
* Description: This command is used to blank check a sector or mutilple sectors of on-chip
* Flash memory.
*
*************************************************************************/
unsigned long IAP_BlankChkSec (unsigned long StartSecNum, unsigned long EndSecNum,
unsigned long * pResult)
{
if (EndSecNum < StartSecNum)
return IAP_STA_INVALD_PARAM;

command[0] = IAP_CMD_BlankChkSec;
command[1] = StartSecNum;
command[2] = EndSecNum;

iap_entry(command, result);

if (result[0] == IAP_STA_SECTOR_NOT_BLANK)
{
*pResult = result[0];
*(pResult+1) = result[1];
}

return result[0];
}

/*************************************************************************
* Function Name: IAP_ReadParID
* Parameters: unsigned long * PartID
* Return: unsigned long -- Status Code
*
* Description: This command is used to read the part identification number.
*
*************************************************************************/
unsigned long IAP_ReadParID (unsigned long * PartID)
{

command[0] = IAP_CMD_ReadParID;
iap_entry(command, result);
*PartID = result[1];

return result[0];
}

/*************************************************************************
* Function Name: IAP_ReadBootVer
* Parameters: char * MajorVer
* char * MinorVer
* Return: unsigned long -- Status Code
*
* Description: This command is used to read the boot code version number.
*
*************************************************************************/
unsigned long IAP_ReadBootVer (unsigned long * MajorVer, unsigned long * MinorVer)
{
command[0] = IAP_CMD_ReadBootVer;
iap_entry(command, result);
*MajorVer = (result[1] & 0xff00)>>8;
*MinorVer = result[1] & 0xff;

return result[0];
}

/*************************************************************************
* Function Name: IAP_Compare
* Parameters: unsigned long dst -- Destination Flash address
* unsigned long src -- Source RAM address
* unsigned long number -- Should be in mutilple of 4
* Return: unsigned long -- Status Code
*
* Description: This command is used to compary the memory contents at two locations.
*
* NOTE: Compary result may not be correct when source or destination address contains
* any of the first 64 bytes starting from address zero. First 64 bytes can be re-mapped
* to RAM.
*
*************************************************************************/
unsigned long IAP_Compare (unsigned long dst, unsigned long src,
unsigned long number, unsigned long *offset)
{
command[0] = IAP_CMD_Compare;
command[1] = dst;
command[2] = src;
command[3] = number;
iap_entry(command, result);

if (result[0] == IAP_STA_COMPARE_ERROR)
*offset = result[1];

return result[0];
}

void IAP_ReinvokeISP(void)
{
command[0] = IAP_CMD_REINVOKEISP;
iap_entry(command, result);;
}

=====================================
===========IAP.H=============
#ifndef __IAP_H
#define __IAP_H

/* IAP Command */
#define IAP_CMD_PrepareSec 50 //select sector
#define IAP_CMD_CopyRAMToFlash 51 //copy data from ram to flash
#define IAP_CMD_EraseSec 52 //erase sector
#define IAP_CMD_BlankChkSec 53 //check if sector is blank
#define IAP_CMD_ReadParID 54 //read chip ID
#define IAP_CMD_ReadBootVer 55 //read BOOT version
#define IAP_CMD_Compare 56 //compare
#define IAP_CMD_REINVOKEISP 57 //reinvoke ISP command

/* IAP Status Codes */
#define IAP_STA_CMD_SUCCESS 0
#define IAP_STA_INVALID_COMMAND 1
#define IAP_STA_SRC_ADDR_ERROR 2
#define IAP_STA_DST_ADDR_ERROR 3
#define IAP_STA_SRC_ADDR_NOT_MAPPED 4
#define IAP_STA_DST_ADDR_NOT_MAPPED 5
#define IAP_STA_COUNT_ERROR 6
#define IAP_STA_INVALID_SECTOR 7
#define IAP_STA_SECTOR_NOT_BLANK 8
#define IAP_STA_SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION 9
#define IAP_STA_COMPARE_ERROR 10
#define IAP_STA_BUSY 11

#define IAP_STA_INVALD_PARAM 12

extern unsigned long IAP_PrepareSec (unsigned long, unsigned long);
extern unsigned long IAP_CopyRAMToFlash (unsigned long dst, unsigned long src,
unsigned long number);
extern unsigned long IAP_EraseSec (unsigned long StartSecNum, unsigned long EndSecNum);
extern unsigned long IAP_BlankChkSec (unsigned long StartSecNum, unsigned long EndSecNum,
unsigned long * pResult);
extern unsigned long IAP_ReadParID (unsigned long * PartID);
extern unsigned long IAP_ReadBootVer (unsigned long * MajorVer, unsigned long * MinorVer);
extern unsigned long IAP_Compare (unsigned long dst, unsigned long src,
unsigned long number, unsigned long *offset);
extern void IAP_ReinvokeISP(void);


#endif

Go to the top of the page
 
+Quote Post
TanT
сообщение Feb 18 2009, 12:27
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 61
Регистрация: 22-11-05
Из: Россия->Омск
Пользователь №: 11 210



Позвольте задать вопрос в этой теме касаемо IAP. В мануале на LPC2378, который использую, написанно чёрным по-нерусски: "Up to 512 kB on-chip Flash Program Memory with In-System Programming (ISP) and In-Application Programming (IAP) capabilities. Single Flash sector or full-chip erase in 400 ms and 256 bytes programming in 1 ms". То есть для стирания !одного! или !всех! секторов без разницы надо 400 мс, а для записи 4кб=256*16=16мс? а сколько надо для подготовки сектора к записи и стиранию, и сравнения двух секторов? по этим операциям временных рамок не нашёл.


--------------------
Если вы не можете объяснить что-то шестилетнему ребенку, значит, вы сами этого не понимаете.
Альберт Эйнштейн
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 18 2009, 18:16
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(TanT @ Feb 18 2009, 15:27) *
а сколько надо для подготовки сектора к записи и стиранию
D
В миллисекундном измерении приблизительно "нисколько".
Цитата
, и сравнения двух секторов?

А это вообще бесполезность - сами можете сравнить - за сколько сравните, за столько и будет.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
TanT
сообщение Feb 19 2009, 05:49
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 61
Регистрация: 22-11-05
Из: Россия->Омск
Пользователь №: 11 210



Я так и думал smile.gif . А касаемо стирания одного сектора? "Single Flash sector or full-chip erase in 400 ms "
И вообще имеет смысл каждый раз чистить сектор перед употреблением? То есть, не правильно выразился, какова вероятность ошибочной записи сектора без его предворительного стирания?


--------------------
Если вы не можете объяснить что-то шестилетнему ребенку, значит, вы сами этого не понимаете.
Альберт Эйнштейн
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 19 2009, 06:06
Сообщение #20


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(TanT @ Feb 19 2009, 08:49) *
И вообще имеет смысл каждый раз чистить сектор перед употреблением? То есть, не правильно выразился, какова вероятность ошибочной записи сектора без его предворительного стирания?

Такя же, как и вероятность записи единицы на место записанного ранее нуля. То есть, не так выразился, записать можно только ноль на месте единицы, для обратной записи нужно стирание


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
TanT
сообщение Feb 19 2009, 06:45
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 61
Регистрация: 22-11-05
Из: Россия->Омск
Пользователь №: 11 210



Цитата
(TanT @ Feb 19 2009, 08:49)
И вообще имеет смысл каждый раз чистить сектор перед употреблением? То есть, не правильно выразился, какова вероятность ошибочной записи сектора без его предворительного стирания?

Глупый вопрос, blush.gif Следующий раз буду внимательнее слушать старших товарищей.

Однако, всё таки кто-нибудь сможет ответить на вопрос: сколько требуется времени для стирания одного сектора по IAP для LPC2378?


--------------------
Если вы не можете объяснить что-то шестилетнему ребенку, значит, вы сами этого не понимаете.
Альберт Эйнштейн
Go to the top of the page
 
+Quote Post
MikePic
сообщение Feb 19 2009, 07:11
Сообщение #22


Участник
*

Группа: Новичок
Сообщений: 57
Регистрация: 7-11-06
Пользователь №: 22 054



TanT
Цитата
Однако, всё таки кто-нибудь сможет ответить на вопрос: сколько требуется времени для стирания одного сектора по IAP для LPC2378?

А просто взять и измерить?
1. Таймером - считать значение до входа в процедуру стирания, считать значение после выхода, вывести в UART разницу
2. Осциллом - установить пин из 0 в 1 до входа, из 1 в 0 после выхода
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 19 2009, 09:59
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(MikePic @ Feb 19 2009, 10:11) *
А просто взять и измерить?

Зачем? Получить некое конкретное зачение для данного чипа в данный момент времени? Что будет у другого экземпляра? Что будет после 1000 стираний? Производитель документирует 400 - их и нужно придерживаться.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
TanT
сообщение Feb 19 2009, 10:04
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 61
Регистрация: 22-11-05
Из: Россия->Омск
Пользователь №: 11 210



Цитата
Производитель документирует 400 - их и нужно придерживаться.


Игорь, простите, конечно, настырность, но эти милисекунды очень критичны. Развейте наконец мои сомнения. Сколько времени требуется для стирания одного сектора? А десяти?


--------------------
Если вы не можете объяснить что-то шестилетнему ребенку, значит, вы сами этого не понимаете.
Альберт Эйнштейн
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 19 2009, 10:33
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(TanT @ Feb 19 2009, 13:04) *
Сколько времени требуется для стирания одного сектора? А десяти?

Столько, сколько Вы прочитали в документации - любое стирание хоть чипа, хоть одного сектора 400ms. Десять секторов последовательно - в десять раз больше одного сектора. Любые надежды на ускорение и из последствия на Вашей совести. Когда-то давно давно еще на LPC2114 измерения делал - результаты где-то в глубинах форума должны быть. Время стирания помнится много меньше 400ms ну и что? Хотите занятся радиолюбительством? - Измеряйте и занимайтесь sad.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
TanT
сообщение Feb 19 2009, 11:22
Сообщение #26


Участник
*

Группа: Участник
Сообщений: 61
Регистрация: 22-11-05
Из: Россия->Омск
Пользователь №: 11 210



Спасибо большое, именно это хотел услышать.
А радиолюбительством я вроде и не собирался заниматься, не тот случай. wink.gif


--------------------
Если вы не можете объяснить что-то шестилетнему ребенку, значит, вы сами этого не понимаете.
Альберт Эйнштейн
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Feb 19 2009, 11:41
Сообщение #27


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Если уж хочется что-то поделать пока идет стирание, можно разместить функцию в RAM. Если нужны прерывания - мапировать векторы в RAM и разместить в RAM обработчики. У меня так сбрасывается внешний вочдог пока идет стирание.
Go to the top of the page
 
+Quote Post
Denisvak
сообщение Feb 24 2009, 14:18
Сообщение #28


Частый гость
**

Группа: Участник
Сообщений: 141
Регистрация: 7-03-06
Из: Санкт-Петербург
Пользователь №: 15 038



Позвольте задать вопрос в этой же теме дабы не создавать новой.
Собираюсь писать свой загрузчик под LPC21хх через модуль IAP.
Состоит из программы ПК и программы для контроллер. ПО на ПК будет принимать прошивку в в виде hex файла и отправлять контроллеру через хх интерфейс, допусти 232. Надо ли мне как-то преобразовывать в другой формат прежде чем писать прошивку во флеш, или хватит просто класть по нужным адресам?

Ещё вопрос по созданию проектов в IAR
Бутлодер должен висеть в самом начале флеша(первые 4кб), и запускаться первым затем передавать управление основной программе функцией ((void (*)())0x1000)();
Основная программа расположена с адреса 0x1000. Как в данном случае должна происходить работа прерываний для этих разный областей.
Go to the top of the page
 
+Quote Post
etoja
сообщение Feb 24 2009, 15:18
Сообщение #29


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

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



Прилагаю подробную инструкцию по IAP для использования с компилятором Crossworks.
Извиняюсь перед автором этого документа, что не записал его адрес в интернете.
Прикрепленные файлы
Прикрепленный файл  IAP.zip ( 4.03 килобайт ) Кол-во скачиваний: 110
 
Go to the top of the page
 
+Quote Post
Denisvak
сообщение Feb 24 2009, 16:26
Сообщение #30


Частый гость
**

Группа: Участник
Сообщений: 141
Регистрация: 7-03-06
Из: Санкт-Петербург
Пользователь №: 15 038



Цитата(etoja @ Feb 24 2009, 18:18) *
Прилагаю подробную инструкцию по IAP для использования с компилятором Crossworks.
Извиняюсь перед автором этого документа, что не записал его адрес в интернете.

Спасибо за пример, разбираюсь smile.gif

Вопрос по прерываниям в основной программой. Если я линкеру укажу файлик "LPC2148_flash.xcl" в котором ручками поправлю начало флеш
Код
-DROMSTART=00001000
вместо
Код
-DROMSTART=00000040
и прерывания
Код
-Z(CODE)INTVEC=00001000-0000103f
вместо
Код
-Z(CODE)INTVEC=00000000-0000003f
будут ли корректно работать прерывания? Камешек lpc2148
Всем спасибо.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 28th June 2025 - 01:51
Рейтинг@Mail.ru


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