Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс. e-mail:jobsmp@pochta.ru |
<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>