Мигание светодиодов:
Код
#include <stdio.h>
#include <ioat91sam7s256.h>
#include <ioks32c5000a.h>
#include <stdlib.h>
int d,c,e;
int i,j;
int nc;//counter the number of calls to RT
int rt;
int ct;//confirmation of transfer data to host
AT91PS_PMC pmc = AT91C_BASE_PMC;
AT91PS_SYS regs = AT91C_BASE_SYS; //Инициализация структуры AT91PS_SYS, в
//которой содержатся адреса регистров
//управления PIO. regs - идентификатор, кот.
//опред. все регистры, чьи адреса определены
//в структуре AT91PS_SYS.
AT91PS_PITC regs1 = AT91C_BASE_PITC; //Подключение адресов регистров инт. таймера PIT
AT91PS_SPI regsm = AT91C_BASE_SPI; // Подключение адресов регистров SPI
AT91PS_AIC regAIC = AT91C_BASE_AIC;
AT91PS_UDP regUDP = AT91C_BASE_UDP;
AT91PS_PIO regPIO = AT91C_BASE_PIOA;
//------------------------------------------------------------------------------
//Инициализация тактового генератора
void clock_ini()
{
regs->PMC_MOR=0x201; //разрешение работы осн. такт. геннератора, уст. врем.
//зап. осн. такт. ген. (11/8=2)
while(d==1) //Ожидаем установки бита MOSCS
{
c=regs->PMC_SR;
c&=0x1;
if(c==0x1) d=0;
}
regs->PMC_PLLR=0xD423F0E; //DIV=14; MUL=73; число тактов SLCK (поле PLLCOUNT)- 11; USBDIV=2;
while(d==1) //Ожидаем установки бита Lock (ФАПЧ зафиксирован?)
{
c=regs->PMC_SR;
c&=0x4;
if(c==0x4) d=0;
}
regs->PMC_MCKR=0x4; //Записываем поле PRES=1 - дел. частоты сигн. MAINCK - 2
while(d==1) //Ожидаем установки бита MCKRDY рег. PMC_SR
{
c=regs->PMC_SR;
c&=0x8;
if(c==0x8) d=0;
}
regs->PMC_MCKR=0x7; //Записываем поле CSS=11 - источн. осн. синх. сигн. PLLCK
while(d==1) //Ожидаем установки бита MCKRDY рег. PMC_SR
{
c=regs->PMC_SR;
c&=0x8;
if(c==0x8) d=0;
}
regs->PMC_SCER=0x481; //Разрешает подачу такт. сигн. PCK на проц., 48 МГц на
//USB и PCK2 на дешифраторы DD1
regs->PMC_SCDR=~0x481;
pmc->PMC_PCKR[2]=0xF;//Источник прогр. такт. сигнала - PLLCK, значение
//предделителя-8, т.е. вых. частота на выходе PA6-12 МГЦ.
//(исп. для тактирования DD1)
while(d==1) //Ожидаем установки бита PCKRDY0 рег. PMC_SR
{
c=regs->PMC_SR;
c&=0x100;
if(c==0x100) d=0;
}
regs->PMC_PCER=0xFFFFFFFF;//Разрешает подачу такт. сигн. на все периф. модули
regs->PMC_PCDR=0xFFFFFFFF;
}
//Задержка 1 с
void Delay_1()
{
for(int i=0; i<30303030; i++)
{
asm("NOP");
}
}
//Инициализация PIO
void PIO_ini()
{
regs->PIOA_PER = 0xFFFFFFFF;//Все порты настр. на исп. в качестве в\в
regs->PIOA_PDR = ~0xFFFFFFFF;
regs->PIOA_OER = 0x7; //PA0-2 настраиваются как выходные
regs->PIOA_ODR = ~0x7;
regPIO->PIO_PPUDR = 0x7; //Запрещение подтягивающих резисторов на портах PA0-2
//(запрещение подтягивающих резисторов на используемых выводах для избежания большого тока)
regPIO->PIO_PPUER = ~0x7;
regs->PIOA_OWER = 0x7; //Разрешение вывода на линии PA0-2 из ODSR
regs->PIOA_OWDR = ~0x7;
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void main()
{
clock_ini();
PIO_ini();
unsigned int xxx=0;
//последовательное зажигание светодиодов, подкл. к портам PA0-2.
while(xxx<6)
{
Delay_1();
switch (xxx)
{
case 0: regs->PIOA_ODSR = ~0x1; break;
case 1: regs->PIOA_ODSR = ~0x2; break;
case 2: regs->PIOA_ODSR = ~0x4; break;
case 3: regs->PIOA_ODSR = ~0x4; break;
case 4: regs->PIOA_ODSR = ~0x2; break;
case 5: regs->PIOA_ODSR = ~0x1; break;
}
xxx++;
}
}
И всетаки, может я линковщик неправильно настроил. Допустимо ручками менять расширение выходного файла на bin?