|
как работать с IAP? |
|
|
|
 |
Ответов
|
Jan 30 2009, 06:51
|

Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 11-07-06
Из: Dubna
Пользователь №: 18 729

|
да, я читал application note AN10256 компилятор Keil, target опция USE THUMB MODE включена.... CODE /* * IAP In-System Application Programming */
#include <LPC21xx.H>
// Clock Frequency #define XTAL 12000000 // Oscillator Frequency
#ifdef BYPASS_IAP #define CPUCLK XTAL // CPU Clock without PLL #else #define CPUCLK (XTAL*4) // CPU Clock with PLL #endif
#define CCLK (XTAL / 1000) // CPU Clock without PLL in kHz
// Phase Locked Loop (PLL) definitions #define PLL_BASE 0xE01FC080 // PLL Base Address #define PLLCON_OFS 0x00 // PLL Control Offset #define PLLSTAT_OFS 0x08 // PLL Status Offset #define PLLFEED_OFS 0x0C // PLL Feed Offset #define PLLCON_PLLE 0x01 // PLL Enable #define PLLCON_PLLD 0x00 // PLL Disable #define PLLCON_PLLC 0x03 // PLL Connect(0x02) | PLL Enable #define PLLSTAT_PLOCK 0x0400 //1<<10 // PLL Lock Status
struct iap_in { unsigned int cmd; unsigned int par[4]; };
typedef void (*IAP)(struct iap_in *in, unsigned int *result); #define iap_entry ((IAP) 0x7FFFFFF1) // IAP entry point
/* Default Interrupt Function: may be called when interrupts are disabled */ void def_isr (void) __irq { ; }
#ifdef BYPASS_IAP /* * Switch CPU to PLL clock */ void start_pll (void) { __asm { LDR R0, =PLL_BASE MOV R1, #0xAA MOV R2, #0x55
// Enable PLL MOV R3, #PLLCON_PLLE STR R3, [R0, #PLLCON_OFS] STR R1, [R0, #PLLFEED_OFS] STR R2, [R0, #PLLFEED_OFS]
// Wait until PLL Locked LDR R2, =PLLSTAT_PLOCK PLL_Loop: LDR R3, [R0, #PLLSTAT_OFS] CMP R3, R2 BEQ PLL_Loop
// Switch to PLL Clock MOV R2, #0x55 MOV R3, #PLLCON_PLLC STR R3, [R0, #PLLCON_OFS] STR R1, [R0, #PLLFEED_OFS] STR R2, [R0, #PLLFEED_OFS] } }
/* * Switch CPU to standard XTAL */ void stop_pll(void) __arm { __asm { LDR R0, =PLL_BASE MOV R1, #0xAA MOV R2, #0x55
// Disable PLL MOV R3, #PLLCON_PLLD STR R3, [R0, #PLLCON_OFS] STR R1, [R0, #PLLFEED_OFS] STR R2, [R0, #PLLFEED_OFS] } }
#endif
/* * Convert 'addr' to sector number */ unsigned int get_secnum (void *addr) { unsigned int n;
n = ((unsigned int) addr >> 13) & 0x1F; // pseudo sector number
if (n >= (0x30000 >> 13)) { n -= 14; // high small 8kB Sectors ( } else if (n >= (0x10000 >> 13)) { n = 7 + (n >> 3); // large 64kB Sectors } return (n); // sector number }
/* * Erase Sector between 'start' and 'end' * Return: IAP error code (0 when OK) * NOTES: start needs to be a 256 byte boundary * size should be 256, 512, 1024 or 4089 */ unsigned int erase (void* start, void* end) { struct iap_in iap; // IAP input parameters unsigned int result[16]; // IAP results unsigned int save_VicInt; // for saving of interrupt enable register
save_VicInt = VICIntEnable; // save interrupt enable status VICIntEnClr = 0xFFFFFFFF; // disable all interrupts
#ifdef BYPASS_IAP stop_pll(); // IAP requires to run without PLL #endif
iap.cmd = 50; // IAP Command: Prepare Sectors for Write iap.par[0] = get_secnum (start); // start sector iap.par[1] = get_secnum (end); // end sector iap_entry (&iap, result); // call IAP function if (result[0]) goto exit; // an error occured?
iap.cmd = 52; // IAP command: Erase Flash iap.par[0] = get_secnum (start); // start sector iap.par[1] = get_secnum (end); // end sector iap.par[2] = CCLK; // CPU clock iap_entry (&iap, result); // call IAP function
exit:
#ifdef BYPASS_IAP start_pll(); // start PLL #endif
VICIntEnable = save_VicInt; // enable interrupts return (result[0]); }
/* * Program *data to flash_addr. number of bytes specified by size * Return: IAP error code (0 when OK) * Note: */ unsigned int program (void *flash_addr, void *data, unsigned int size) { struct iap_in iap; // IAP input parameters unsigned int result[16]; // IAP results unsigned int save_VicInt; // for saving of interrupt enable register
save_VicInt = VICIntEnable; // save interrupt enable status VICIntEnClr = 0xFFFFFFFF; // disable all interrupts
#ifdef BYPASS_IAP stop_pll(); // IAP requires to run without PLL #endif
iap.cmd = 50; // IAP Command: Prepare Sectors for Write iap.par[0] = get_secnum (flash_addr); // start sector iap.par[1] = iap.par[0]; // end Sektor iap_entry (&iap, result); // call IAP function if (result[0]) goto exit; // an error occured?
iap.cmd = 51; // IAP Command: Copy RAM to Flash iap.par[0] = (unsigned int) flash_addr; // destination-addr iap.par[1] = (unsigned int) data; // source-addr iap.par[2] = size; // number of bytes iap.par[3] = CCLK; // CPU clock iap_entry (&iap, result); // call IAP function
exit:
#ifdef BYPASS_IAP start_pll(); // start PLL #endif
VICIntEnable = save_VicInt; // enable interrupts return (result[0]); }
unsigned char vals[512];
void main (void) { unsigned int i;
unsigned int volatile start;
for (start = 0; start < 1000000; start++) { ; // wait for debugger connection (about 0.3 sec) }
VICDefVectAddr = (unsigned int) def_isr; // for spurious interrupts
for (i = 0; i < sizeof (vals); i++) { vals[i] = (unsigned char) i; }
program (0x30000, vals, sizeof (vals)); program (0x31000, vals, sizeof (vals)); program (0x32000, vals, sizeof (vals)); erase (0x30000, 0x31FFF); erase (0x32000, 0x33FFF);
while (1); }
|
|
|
|
Сообщений в этой теме
cornflyer как работать с IAP? Jan 28 2009, 14:26 zltigo Цитата(cornflyer @ Jan 28 2009, 17:26) Кт... Jan 28 2009, 15:10 cornflyer на форуме нет внятного описания как работать с IAP... Jan 29 2009, 12:47 Сергей Борщ Цитата(cornflyer @ Jan 29 2009, 14:47) вы... Jan 29 2009, 15:31 zltigo Цитата(cornflyer @ Jan 29 2009, 15:47) на... Jan 30 2009, 08:48 ar__systems Цитата(cornflyer @ Jan 29 2009, 07:47) на... Mar 16 2009, 02:31 Nixon Кроме документации существует еще и application no... Jan 29 2009, 13:14 Сега Кстати да, интересная тема. Может ктонибудь объясн... Jan 31 2009, 16:32 Сергей Борщ Цитата(Сега @ Jan 31 2009, 18:32) то есть... Jan 31 2009, 16:36 cornflyer внутренний flash стоит использовать для хранения р... Feb 2 2009, 07:21 Qwertty Цитата(cornflyer @ Feb 2 2009, 10:21) вот... Feb 2 2009, 07:46  yuri_t По поводу IAP можно посмотреть здесь:
http://www.... Feb 2 2009, 08:22 cornflyer преимущества софтового i2c :
- софтовый i2c меньше... Feb 2 2009, 11:17 zltigo Цитата(cornflyer @ Feb 2 2009, 14:17) со... Feb 2 2009, 12:48 cornflyer согласен.
перечитал еррату - действительно с i2с в... Feb 3 2009, 07:47 bigarmer RE: как работать с IAP? Feb 7 2009, 07:32 TanT Позвольте задать вопрос в этой теме касаемо IAP. В... Feb 18 2009, 12:27 zltigo Цитата(TanT @ Feb 18 2009, 15:27) а сколь... Feb 18 2009, 18:16 TanT Я так и думал . А касаемо стирания одного сектора... Feb 19 2009, 05:49 MrYuran Цитата(TanT @ Feb 19 2009, 08:49) И вообщ... Feb 19 2009, 06:06 TanT Цитата(TanT @ Feb 19 2009, 08:49)
И вообще имеет ... Feb 19 2009, 06:45 MikePic TanT
ЦитатаОднако, всё таки кто-нибудь сможет отве... Feb 19 2009, 07:11 zltigo Цитата(MikePic @ Feb 19 2009, 10:11) А пр... Feb 19 2009, 09:59 TanT ЦитатаПроизводитель документирует 400 - их и нужно... Feb 19 2009, 10:04 zltigo Цитата(TanT @ Feb 19 2009, 13:04) Сколько... Feb 19 2009, 10:33 TanT Спасибо большое, именно это хотел услышать.
А ра... Feb 19 2009, 11:22 HARMHARM Если уж хочется что-то поделать пока идет стирание... Feb 19 2009, 11:41 Denisvak Позвольте задать вопрос в этой же теме дабы не соз... Feb 24 2009, 14:18 etoja Прилагаю подробную инструкцию по IAP для использов... Feb 24 2009, 15:18 Denisvak Цитата(etoja @ Feb 24 2009, 18:18) Прилаг... Feb 24 2009, 16:26 Сергей Борщ Цитата(Denisvak @ Feb 24 2009, 18:26) буд... Feb 24 2009, 18:32 TanT Вопрос в продолжении темы IAP: команда 56 - сравне... Feb 26 2009, 05:05 etoja Цитата(TanT @ Feb 26 2009, 08:05) Вопрос ... Feb 26 2009, 07:21 TanT Если сравнение гарантирует 100% выявление ошибок, ... Feb 26 2009, 07:52 KRS Цитата(TanT @ Feb 26 2009, 10:52) Если ср... Feb 26 2009, 11:05  etoja Контрольная сумма нужна обязательно, поскольку в м... Feb 26 2009, 16:12 Denisvak Цитата(TanT @ Feb 26 2009, 10:52) Если ср... Feb 26 2009, 17:02 TanT ЦитатаКонтрольная сумма нужна обязательно, посколь... Mar 2 2009, 06:16 etoja Цитата(TanT @ Mar 2 2009, 09:16) Большие ... Mar 2 2009, 08:04 HARMHARM Цитата(TanT @ Mar 2 2009, 08:16) Вообще з... Mar 2 2009, 09:56 TanT ЦитатаЗапрет прерываний - требование не обязательн... Mar 2 2009, 12:23 Denisvak Сергей Борщ и etoja
Спасибо Вам за помощь все рабо... Mar 3 2009, 20:15 vesago Прошу совета по сабжу. Я использую LPC2214. C 0 по... Mar 15 2009, 17:31 GetSmart Ну дык если стёрли нулевой сектор, то стёрли и век... Mar 15 2009, 18:02 vesago Я думал, что если начало прошивки сконфигурировано... Mar 15 2009, 18:10 HARMHARM Цитата(vesago @ Mar 15 2009, 20:10) Я дум... Mar 15 2009, 19:23 GetSmart Цитата(vesago @ Mar 15 2009, 23:10) А как... Mar 15 2009, 19:34  IgorMarx Цитата(GetSmart @ Mar 15 2009, 23:34) В в... Aug 27 2009, 19:57 vesago Спасибо, все понятно. Mar 15 2009, 19:53 TanT Вопрос к etoja по поводу записи, точнее верификаци... Mar 17 2009, 06:19 ar__systems Цитата(TanT @ Mar 17 2009, 01:19) Вопрос ... Mar 17 2009, 11:42 TanT а вы правы, ar__systems. частота стояла из старого... Mar 17 2009, 12:14 HARMHARM Цитата(TanT @ Mar 17 2009, 14:14) а вы пр... Mar 17 2009, 12:16 KRS Цитата(TanT @ Mar 17 2009, 15:14) Паузы н... Mar 17 2009, 12:17  Wano Подскажите всё ли правильно делаю,чтобы зашить в L... Aug 3 2009, 09:32
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|