Получил плату от Olimex с SAM7X256. Спаял wiggler. Установил IAR 4.41a и Keil. Так как примеры у атмела и Olimex для IAR начал разбираться с ним. Запустил пример олимекса, более менее разобрался, поудалял все, в главном цикле сделал вывод миандра на pb22. Вроде работало, виглер шил через H-JTAG, правда из RAM отладка не работала, работала только через FLASH. Никаких стартапов в пректе я не нашел. Базовый пример от Atmela я прошивать не стал, так как он инициализирует линии, которые на плате от олимекса используются для разных других целей.
Так вот, проблемы начались, когда я попытался создать совершенно пустой проект, откомпилировать и запустить в устройство (на С под железо раньше не писал). В связи с этим следующие вопросы:
1. Откуда запускается проект, с функции Main или откуда то еще?
2. Что за файлы .xcl (я понял, что это структура памяти для линковщика), как ими пользоваться, откуда брать и т.д.
3. Что за файлы mac для дебагера и можно ли без них (когда отключал, отладка не работала).
4. Если не сложно, то как по шагам сделать минимальный проект для отладки в RAM (как создать, какие файлы подключать, откуда брать, что прописать в настройках).
Вот листинг моей программы. Этот код вроде работает в проекте от Olimex, перенести его в свой пустой у меня не получилось.
Код
#include "at91sam7xc256.h"
//it's a simple delay
void Delay (unsigned long a) { while (--a!=0); }
int main()
{
//Enable RESET
AT91C_BASE_RSTC->RSTC_RCR = 0xA5000008;
AT91C_BASE_RSTC->RSTC_RMR = 0xA5000001;
Delay(1000);
// Set Flash Waite sate - Flash Memory Controler
// if MCK = 47923200 I have 50 Cycle for 1 usecond
AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(48 <<16)) | AT91C_MC_FWS_1FWS;
// Watchdog Disable
AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS;
// Set MCK at 47 923 200
// 1 Enabling the Main Oscillator:
// SCK = 1/32768 = 30.51 uSecond
// Start up time = 8 * 6 / SCK = 56 * 30.51 = 1,46484375 ms
AT91C_BASE_PMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x06 <<8) | AT91C_CKGR_MOSCEN ));
// Wait the startup time
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));
// 2 Checking the Main Oscillator Frequency (Optional)
// 3 Setting PLL and divider:
// - div by 5 Fin = 3,6864 =(18,432 / 5)
// - Mul 25+1: Fout = 95,8464 =(3,6864 *26)
// for 96 MHz the erroe is 0.16%
// Field out NOT USED = 0
// PLLCOUNT pll startup time estimate at : 0.844 ms
// PLLCOUNT 28 = 0.000844 /(1/32768)
AT91C_BASE_PMC->PMC_PLLR = ((AT91C_CKGR_DIV & 0x05) | (AT91C_CKGR_PLLCOUNT & (28<<8)) | (AT91C_CKGR_MUL & (25<<16)));
// Wait the startup time
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK));
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
// 4. Selection of Master Clock and Processor Clock
// select the PLL clock divided by 2
AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2;
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK ;
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
//enable the clock of the PIO
AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;
//enable the clock of the PIO
AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOB;
// GPIO init
AT91C_BASE_PIOA->PIO_ODR = 0xffffffff; // All as input
AT91C_BASE_PIOB->PIO_ODR = 0xffffffff; // All as input
AT91C_BASE_SYS->PIOA_PPUDR = 0xffffffff; // Disable Pull-up resistor
AT91C_BASE_SYS->PIOB_PPUDR = 0xffffffff; // Disable Pull-up resistor
AT91C_BASE_PIOB->PIO_OER = 1 << 22;
for (;;)
{
unsigned int waiting_time;
AT91C_BASE_PIOB->PIO_SODR = 1 << 22;
for(waiting_time = 0; waiting_time < 2000; waiting_time++);
AT91C_BASE_PIOB->PIO_CODR = 1 << 22;
for(waiting_time = 0; waiting_time < 2000; waiting_time++);
}
}
//it's a simple delay
void Delay (unsigned long a) { while (--a!=0); }
int main()
{
//Enable RESET
AT91C_BASE_RSTC->RSTC_RCR = 0xA5000008;
AT91C_BASE_RSTC->RSTC_RMR = 0xA5000001;
Delay(1000);
// Set Flash Waite sate - Flash Memory Controler
// if MCK = 47923200 I have 50 Cycle for 1 usecond
AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(48 <<16)) | AT91C_MC_FWS_1FWS;
// Watchdog Disable
AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS;
// Set MCK at 47 923 200
// 1 Enabling the Main Oscillator:
// SCK = 1/32768 = 30.51 uSecond
// Start up time = 8 * 6 / SCK = 56 * 30.51 = 1,46484375 ms
AT91C_BASE_PMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x06 <<8) | AT91C_CKGR_MOSCEN ));
// Wait the startup time
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));
// 2 Checking the Main Oscillator Frequency (Optional)
// 3 Setting PLL and divider:
// - div by 5 Fin = 3,6864 =(18,432 / 5)
// - Mul 25+1: Fout = 95,8464 =(3,6864 *26)
// for 96 MHz the erroe is 0.16%
// Field out NOT USED = 0
// PLLCOUNT pll startup time estimate at : 0.844 ms
// PLLCOUNT 28 = 0.000844 /(1/32768)
AT91C_BASE_PMC->PMC_PLLR = ((AT91C_CKGR_DIV & 0x05) | (AT91C_CKGR_PLLCOUNT & (28<<8)) | (AT91C_CKGR_MUL & (25<<16)));
// Wait the startup time
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK));
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
// 4. Selection of Master Clock and Processor Clock
// select the PLL clock divided by 2
AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2;
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK ;
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
//enable the clock of the PIO
AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;
//enable the clock of the PIO
AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOB;
// GPIO init
AT91C_BASE_PIOA->PIO_ODR = 0xffffffff; // All as input
AT91C_BASE_PIOB->PIO_ODR = 0xffffffff; // All as input
AT91C_BASE_SYS->PIOA_PPUDR = 0xffffffff; // Disable Pull-up resistor
AT91C_BASE_SYS->PIOB_PPUDR = 0xffffffff; // Disable Pull-up resistor
AT91C_BASE_PIOB->PIO_OER = 1 << 22;
for (;;)
{
unsigned int waiting_time;
AT91C_BASE_PIOB->PIO_SODR = 1 << 22;
for(waiting_time = 0; waiting_time < 2000; waiting_time++);
AT91C_BASE_PIOB->PIO_CODR = 1 << 22;
for(waiting_time = 0; waiting_time < 2000; waiting_time++);
}
}