Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Ответ:

Отправлено 1111 23 июня 2009, г. 12:47
В ответ на: Помогите пожалуйста разобраться c IAP в LPC2000. Совсем запутался! То ли в Си то ли в описании. отправлено пользователем progchip 23 июня 2009, г. 11:05


<code>
#define IAP_CMD_PREPARE_SECTORS 50
#define IAP_CMD_COPY_RAM_TO_FLASH 51
#define IAP_CMD_ERASE_SECTORS 52
#define IAP_RES_SUCCESS 0
#define IAP_RES_BUSY 11
#define IAP_LOCATION 0x7FFFFFF1ul

#define IAP_CCLK (XTAL/1000ul)

// Phase Locked Loop (PLL) definitions
#define IAP_PLL_BASE 0xE01FC080 //PLL Base Address
#define IAP_PLLCON_OFS 0x00000000 //PLL Control Offset
#define IAP_PLLSTAT_OFS 0x00000008 //PLL Status Offset
#define IAP_PLLFEED_OFS 0x0000000C //PLL Feed Offset
#define IAP_PLLCON_PLLE 0x00000001 //PLL Enable
#define IAP_PLLCON_PLLD 0x00000000 //PLL Disable
#define IAP_PLLCON_PLLC 0x00000003 //PLL Connect(0x02) | PLL Enable
#define IAP_PLLSTAT_PLOCK 0x00000400 //1<<10 // PLL Lock Status

typedef struct iap_in_data
{
u32_t cmd;
u32_t par[4];
}iap_in_t;

typedef void (*IAP)(iap_in_t*in, u32_t *result);

#define iap_entry ((IAP) 0x7FFFFFF1)//IAP entry point


//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Управление PLL
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
void Start_PLL (void) {
__asm {
LDR R0, =IAP_PLL_BASE
MOV R1, #0xAA
MOV R2, #0x55

// Enable PLL
MOV R3, #IAP_PLLCON_PLLE
STR R3, [R0, #IAP_PLLCON_OFS]
STR R1, [R0, #IAP_PLLFEED_OFS]
STR R2, [R0, #IAP_PLLFEED_OFS]

// Wait until PLL Locked
LDR R2, =IAP_PLLSTAT_PLOCK
PLL_Loop:
LDR R3, [R0, #IAP_PLLSTAT_OFS]
CMP R3, R2
BEQ PLL_Loop

// Switch to PLL Clock
MOV R2, #0x55
MOV R3, #IAP_PLLCON_PLLC
STR R3, [R0, #IAP_PLLCON_OFS]
STR R1, [R0, #IAP_PLLFEED_OFS]
STR R2, [R0, #IAP_PLLFEED_OFS]
}
}


void Stop_PLL(void) __arm {
__asm {
LDR R0, =IAP_PLL_BASE
MOV R1, #0xAA
MOV R2, #0x55

// Disable PLL
MOV R3, #IAP_PLLCON_PLLD
STR R3, [R0, #IAP_PLLCON_OFS]
STR R1, [R0, #IAP_PLLFEED_OFS]
STR R2, [R0, #IAP_PLLFEED_OFS]
}
}

//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Управление PLL
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
u32_t Get_Secnum(u32_t addr)
{
volatile u32_t n = 18;

switch(addr)
{
case 0x00ul:
{
n = 0;
break;}
case 0x2000ul:
{
n = 1;
break;}
case 0x4000ul:
{
n = 2;
break;}
case 0x6000ul:
{
n = 3;
break;}
case 0x8000ul:
{
n = 4;
break;}
case 0xa000ul:
{
n = 5;
break;}
case 0xc000ul:
{
n = 6;
break;}
case 0xe000ul:
{
n = 7;
break;}
case 0x10000ul:
case 0x12000ul:
case 0x14000ul:
case 0x16000ul:
case 0x18000ul:
case 0x1a000ul:
case 0x1c000ul:
case 0x1e000ul:
{
n = 8;
break;}
case 0x20000ul:
case 0x22000ul:
case 0x24000ul:
case 0x26000ul:
case 0x28000ul:
case 0x2a000ul:
case 0x2c000ul:
case 0x2e000ul:
{
n = 9;
break;}
case 0x30000ul:
{
n = 10;
break;}
case 0x32000ul:
{
n = 11;
break;}
case 0x34000ul:
{
n = 12;
break;}
case 0x36000ul:
{
n = 13;
break;}
case 0x38000ul:
{
n = 14;
break;}
case 0x3a000ul:
{
n = 15;
break;}
case 0x3c000ul:
{
n = 16;
break;}
}

/* if((addr >= 0x2000) && (addr <= 0xffff))
{
n = addr / 8192;
}
if((addr > 0xffff) && (addr <= 0x2ffff))
{
n = ((addr - 8192*8) / 65536) + 8;
}
if((addr > 0x2ffff) && (addr <= 0x3c000))
{
n = ((addr - 8192*8 - 65536*2) / 8192 + 10);
}*/

return (n); // sector number
}

//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Стирание
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
u32_t IAP_Erase (u32_t start, u32_t end)
{
iap_in_t iap; // IAP input parameters
u32_t result[16]; // IAP results
//u32_t save_VicInt; // for saving of interrupt enable register

//save_VicInt = VICIntEnable; // save interrupt enable status
//VICIntEnClr = 0xFFFFFFFF; // disable all interrupts

Stop_PLL();

iap.cmd = IAP_CMD_PREPARE_SECTORS;// IAP Command: Prepare Sectors for Write
iap.par[0] = start; // start sector
iap.par[1] = end; // end sector
iap_entry (&iap, result); // call IAP function
if (result[0]) goto exit; // an error occured?

iap.cmd = IAP_CMD_ERASE_SECTORS; // IAP command: Erase Flash
iap.par[0] = start; // start sector
iap.par[1] = end; // end sector
iap.par[2] = IAP_CCLK; // CPU clock
iap_entry (&iap, result); // call IAP function

exit:
Start_PLL();

//VICIntEnable = save_VicInt; // enable interrupts
return (result[0]);
}

//::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Запись
//::::::::::::::::::::::::::::::::::::::::::::::::::::::
u32_t IAP_Write (void *flash_addr, void *data, u32_t size)
{
iap_in_t iap; // IAP input parameters
u32_t result[16]; // IAP results
//u32_t save_VicInt; // for saving of interrupt enable register

//save_VicInt = VICIntEnable; // save interrupt enable status
//VICIntEnClr = 0xFFFFFFFF; // disable all interrupts

Stop_PLL();

iap.cmd = IAP_CMD_PREPARE_SECTORS;// IAP Command: Prepare Sectors for Write
iap.par[0] = Get_Secnum((u32_t)flash_addr);// start sector
iap.par[1] = iap.par[0]; // end Sector
iap_entry (&iap, result); // call IAP function
if (result[0]) goto exit; // an error occured?

iap.cmd = IAP_CMD_COPY_RAM_TO_FLASH;// IAP Command: Copy RAM to Flash
iap.par[0] = (u32_t) flash_addr; // destination-addr
iap.par[1] = (u32_t) data; // source-addr
iap.par[2] = size; // number of bytes
iap.par[3] = IAP_CCLK; // CPU clock
iap_entry (&iap, result); // call IAP function

exit:
Start_PLL();

//VICIntEnable = save_VicInt; // enable interrupts
return (result[0]);
}

</code>


Составить ответ | Вернуться на конференцию.

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
поделите 6 на два:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru