Хорошо, вот весь код. Попробуйте, плиз, компильнуть (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено vinogradov aleksei 23 ноября 2006 г. 14:19
В ответ на: все компилится нормально (ADS) т.е. синтаксис верен отправлено ы 23 ноября 2006 г. 14:14

//Программа для кварца на 14,7456 МГц
#include
#include

/* Коды команд IAP */
#define IAP_CMD_PREPARE 50
#define IAP_CMD_WRITE 51
#define IAP_CMD_ERASE 52
#define IAP_CMD_CHECK 53
#define IAP_CMD_PART 54
#define IAP_CMD_VERSION 55
#define IAP_CMD_COMPARE 56

/* Коды статуса */
#define CMD_SUCCESS 0
#define INVALID_COMMAND 1
#define SRC_ADDR_ERROR 2
#define DST_ADDR_ERROR 3
#define SRC_ADDR_NOT_MAPPED 4
#define DST_ADDR_NOT_MAPPED 5
#define COUNT_ERROR 6
#define INVALID_SECTOR 7
#define SECTOR_NOT_BLANK 8
#define SECTOR_NOT_PREPARED 9
#define COMPARE_ERROR 10
#define BUSY 11

//Точка входа в IAP при обращении к нему из ARM - кода
#define IAP_LOCATION 0x7FFFFFF1
typedef void (*IAP)(unsigned int[], unsigned int[]);
//Определить указатель на ф-цию, принимающую два массива и возвращающую "VOID"
IAP iap_entry;
//Проинициализировать этот указатель на функцию
iap_entry = (IAP) IAP_LOCATION;

unsigned char flash_loading_started[]="LPC2106: flash loading started...\n\r";
unsigned char flash_loading_done[]="LPC2106: flash loading done. Here is the flash content:\n\r";
unsigned char i; //Вспомогательная переменная

unsigned int command[5]; //Команды, передаваемые загрузчику
unsigned int result[2]; //Результаты, возвращаемые загрузчиком

unsigned char buffer[16384];

//Задержка
void wait (void)
{
T0TC=0; //Сбросить счетчик
T0PR=1; //инкрементировать счетчик при каждом втором такте Plck
T0PC=0; //
T0MR0=58982400 /8;
T0MCR=4; //Останавливать счетчик при совпадении
T0TCR=1; //запустить счетчик
while (T0TC!=58982400 /8){};
}

//Внутрипрограммное программирование Flash. Функция записи данных в сектор
void flash_write(void)
{
unsigned int *prom;
unsigned int i;

prom = 0x14000; //Адрес десятого сектора во Flash

// Производим сравнение RAM и Flash.
for (i = 0; i != 16384; i++){if (buffer[i] != *prom) {i=0x00; break;}
prom++;
}
if (i != 0) return;

// Подготовка сектора к стиранию.
while (1){command[0] = IAP_CMD_PREPARE;
command[1] = 0x0A;
command[2] = 0x0A;
command[3] = 0x00;
command[4] = 0x00;
iap_entry (command, result);
if (result[0] == CMD_SUCCESS) break;
if (result[0] == BUSY) continue;
return;
}

// Стирание сектора.
while (1){command[0] = IAP_CMD_ERASE;
command[1] = 0x0A;
command[2] = 0x0A;
command[3] = 58982400; //Частота на выходе модуля PLL
iap_entry (command, result);
if (result[0] == CMD_SUCCESS) break;
if (result[0] == BUSY) continue;
return;
}

// Подготовка сектора к записи.
while (1){command[0] = IAP_CMD_PREPARE;
command[1] = 0x0A;
command[2] = 0x0A;
command[3] = 0x00;
command[4] = 0x00;
iap_entry (command, result);
if (result[0] == CMD_SUCCESS) break;
if (result[0] == BUSY) continue;
return;
}

// Запись сектора.
while (1){command[0] = IAP_CMD_WRITE;
command[1] = 0x14000;
command[2] = buffer[0];
command[3] = 512;
command[4] = 58982400;
iap_entry (command, result);
if (result[0] == CMD_SUCCESS) break;
if (result[0] == BUSY) continue;
return;
}
}

//Функция "Main"
int main (void)
{
//Инициализируем UART0
PINSEL0 = 0x00000005; //Подключить RxD0 и TxD0 к UART0
U0LCR = 0x83; //8 битов данных,не проверять четность,1 стоп-бит,DLAB -> 1
U0DLL = 32; //115200 Бит/Сек., при этом VPB Clock = (14.7456 MHz * 4)
U0DLM = 0; //115200 Бит/Сек., при этом VPB Clock = (14.7456 MHz * 4)
U0IER = 0x00; //Запретить любые прерывания от UART0
U0LCR = 0x03; //DLAB -> 0

IODIR = 0xFFFF; //P0.0..15 defined as Outputs

//Вывод по UART сообщения о начале загрузки Flash
for (i=0;i IOSET = 0x00008000; /* Turn on LED */
while (!(U0LSR & 0x20)){}; //Подождать освобождения буфера передатчика
U0THR = flash_loading_started[i]; //Передать символ
while (!(U0LSR & 0x20)){}; //Подождать завершения передачи
IOCLR = 0x00008000; /* Turn off LED */
}
wait();

//Вывод по UART сообщения об окончании загрузки Flash
for (i=0;i IOSET = 0x00008000; /* Turn on LED */
while (!(U0LSR & 0x20)){}; //Подождать освобождения буфера передатчика
U0THR = flash_loading_done[i]; //Передать символ
while (!(U0LSR & 0x20)){}; //Подождать завершения передачи
IOCLR = 0x00008000; /* Turn off LED */
}

while (1) { //Бесконечный цикл
}
}

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа
Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

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


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание