Перейти к содержанию
    

Вопрос начинающего по АРМ

1. Можно ли как-то пользоваться SAM-BA после прошивки в контроллер своей программы,

не загружая ее с помощью замыкания перемычек на плате?

 

 

 

2. Не получается помигать светодиодом.

Команда, включающая или выключающая светодиод, которая находится

в LowLevelInit (сейча закоментарена) выполняется,

а дальше в Main - никаких движений

 

 

int main()

{

 

AT91F_LowLevelInit();

 

//программа как будто останавливается здесь

 

//loop forever

while(1)

{

AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, (1<<5) );

wait();

 

AT91F_PIO_SetOutput( AT91C_BASE_PIOA, (1<<5) );

wait();

 

}

 

}

 

 

---------------------------------------------------------------------------

#include "ioat91sam7s256.h"

#define __inline inline

#include "lib_AT91SAM7S256.h"

 

#define true -1

#define false 0

 

#define AT91F_Default_FIQ_handler 1

#define AT91F_Default_IRQ_handler 2

#define AT91F_Spurious_handler 3

 

void AT91F_LowLevelInit( void)

{

int i;

AT91PS_PMC pPMC = AT91C_BASE_PMC;

//* Set Flash Waite sate

// Single Cycle Access at Up to 30 MHz, or 40

AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_1FWS ;

 

//* Watchdog Disable

AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS;

 

//* Set MCK at 48 054 850

// 1 Enabling the Main Oscillator:

// SCK = 1/32768 = 30.51 uSecond

// Start up time = 8 * 6 / SCK = 56 * 30.51 = 1,46484375 ms

pPMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x06 <<8) | AT91C_CKGR_MOSCEN ));

// Wait the startup time

while(!(pPMC->PMC_SR & AT91C_PMC_MOSCS));

// 2 Checking the Main Oscillator Frequency (Optional)

// 3 Setting PLL and divider:

// - div by 14 Fin = 1.3165 =(18,432 / 14)

// - Mul 72+1: Fout = 96.1097 =(3,6864 *73)

// for 96 MHz the error is 0.11%

// Field out NOT USED = 0

// PLLCOUNT pll startup time estimate at : 0.844 ms

// PLLCOUNT 28 = 0.000844 /(1/32768)

pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & 14 ) |

(AT91C_CKGR_PLLCOUNT & (28<<8)) |

(AT91C_CKGR_MUL & (72<<16)));

 

 

// Wait the startup time

while(!(pPMC->PMC_SR & AT91C_PMC_LOCK));

while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));

// 4. Selection of Master Clock and Processor Clock

// select the PLL clock divided by 2

pPMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2 ;

while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));

 

pPMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK ;

while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));

 

// Set up the default interrupts handler vectors

 

AT91C_BASE_AIC->AIC_SVR[0] = (int) AT91F_Default_FIQ_handler ;

for (i=1;i < 31; i++)

{

AT91C_BASE_AIC->AIC_SVR = (int) AT91F_Default_IRQ_handler ;

}

AT91C_BASE_AIC->AIC_SPU = (int) AT91F_Spurious_handler ;

 

//------------------------------------------------------------------

//Init of PIO

 

//enable clock to PIOA

AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA );

 

//config directions

AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, (1<<5) ); //PER & OER

 

//AT91F_PIO_SetOutput( AT91C_BASE_PIOA, (1<<5) );

}

 

__ramfunc void wait(void)

{

int time;

 

for (time = 0; time < 1E+6; time++);

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Нет

2.На первый взгяд все правильно, тоько вот задержка вызывает сомнение. Не слишком ли велика? Я бы предолжил убрать ее и посмотреть ногу осциллом. Ну и еще раз проверить инициализацию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

__ramfunc void wait(void)
{
int time;

for (time = 0; time < 1E+6; time++); 
}

Я думаю ошибка в строке int time; Должно быть

 volatile int time;

Компилятор считает что раз в цикле ничего не происходит этот цикл просто не нужен и спокойно его выкидывает. Т.е. нога скорее всего дергается, но очень быстро.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Совсем убирал Wait, пробовал volatile. Ничего не меняется. На ножке 0 В. Осциллографом пока не смотрел. Видимо дело в инициализации, хотя сразу после нее состояние выхода устанавливается правильно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может возврат из процедуры происходит уже на туда куда надо. Что-то с памятью моей стало... Попробуёте ещё закомментить саму процедуру Wait.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверил инициализацию. Вроде бы все правильно

wait комментил - не помогло

Светодиод загорается только в момент включения и сразу же гаснет - как и раньше было.

Подключен через буфер.

 

Может надо какие-то настройки в Linker делать или еще где в проекте?

Там все по дефолту. Оптимизацию отключал

 

Подозрение такое, что генератор не запускается. Буду проверять...

Хотя с Самбой все работает.

Непонятные сообщения выдает SAMBA - Unlocked involved region - два раза

Это нормально?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверил инициализацию. Вроде бы все правильно

wait комментил - не помогло

Светодиод загорается только в момент включения и сразу же гаснет - как и раньше было.

Подключен через буфер.

 

Может надо какие-то настройки в Linker делать или еще где в проекте?

Там все по дефолту. Оптимизацию отключал

Киньте мне проект на serzh(ухо)rrt.lv. Погоняю через JTAG, посмотрю куда падает. Правда у меня только SAM7S64, но думаю это непринципиально. Я не пользовался библиотеками с at91.com, прописывал все необходимые регистры вручную по даташиту. И ногами дергал через макросы on() off() имени Аскольда Волкова.

Хотя с Самбой все работает.

Непонятные сообщения выдает SAMBA - Unlocked involved region - два раза

Это нормально?

С самбой пока не работал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И ногами дергал через макросы on() off() имени Аскольда Волкова.

 

Что это?

 

Хотя с Самбой все работает.

 

А как прошиваете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И ногами дергал через макросы on() off() имени Аскольда Волкова.

 

Что это?

В 2000г Аскольд Волков посылал в конференцию ru.embedded свои макросы работы с портами для AVR. А это творческая переработка:

#ifndef    ASCOLD_SAM7_H__
#define    ASCOLD_SAM7_H__

#ifdef    __IAR_SYSTEMS_ICC__

#define _setL(port,bit)                 do { AT91C_BASE_PIO##port##->PIO_CODR = (1 << bit); } while(0)
#define _setH(port,bit)                 do { AT91C_BASE_PIO##port##->PIO_SODR = (1 << bit); } while(0)
#define _clrL(port,bit)                 do { AT91C_BASE_PIO##port##->PIO_SODR = (1 << bit); } while(0)
#define _clrH(port,bit)                 do { AT91C_BASE_PIO##port##->PIO_CODR = (1 << bit); } while(0)
#define _bitL(port,bit)                 (!(AT91C_BASE_PIO##port##->PIO_ODSR & (1 << bit)))
#define _bitH(port,bit)                 ( AT91C_BASE_PIO##port##->PIO_ODSR & (1 << bit))
#define _cpl(port,bit,val)              do { AT91C_BASE_PIO##port##->PIO_ODSR ^= (1<<bit); } while(0)

#define _dir_out(port,bit,val)          do { AT91C_BASE_PIO##port##->PIO_OER = (1<<bit); } while(0)
#define _dir_in(port,bit,val)           do { AT91C_BASE_PIO##port##->PIO_ODR = (1<<bit); } while(0)
#define dir_out(x)                      _dir_out (x)
#define dir_in(x)                       _dir_in (x)

#define _set(port,bit,val)              _set##val(port,bit)
#define on(x)                           _set (x)
#define SET                             _setH

#define _clr(port,bit,val)              _clr##val(port,bit)
#define off(x)                          _clr (x)
#define CLR                             _clrH

#define _bit(port,bit,val)              _bit##val(port,bit)
#define signal(x)                       _bit (x)
#define BIT                             _bitH

#define cpl(x)                          _cpl (x)

#endif    // __IAR_SYSTEMS_ICC__
#endif    //ASCOLD_SAM7_H__

Вот его комментарий по использованию:

Макросы SET,CLR,BIT и CPL служат для работы со стандартными SFRами,

описанными в стандартных заголовках. А для своих собственных определений я

использую on,off,signal и cpl.

 

Пример использования:

 

#define Pin1 PORTD,5,H /* бит 5 порта PORTD, активный уровень высокий */

#define Pin2 PINA,3,L /* бит 3 порта PINA, активный уровень низкий */

...

if(signal(Pin2))

on(Pin1);

else

off(Pin1);

 

Ну идею ты, наверное, понял. Описание активного уровня я добавил для большей наглядности, а также потому, что изменение полярности сигнала при модификации случается не реже,чем перестановка ножек.

Ну а для AT91 это будет выглядеть так:

#define    LED    A,0,H            // PIOA, bit 0, active high
#define    KEY    A,20,L           // PIOA, bit 20, active low
if(signal(KEY))
    on(LED);
else
    off(LED);

 

 

Хотя с Самбой все работает.

 

А как прошиваете?

Из IAR C-SPY через JTAG.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может надо какие-то настройки в Linker делать или еще где в проекте?

Там все по дефолту. Оптимизацию отключал

Ага, посмотрел проект - файл .xcl по умолчанию линкует для неизвестного процессора в результате ОЗУ попадает на адреса 0x10000. Отсюда все грабли.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...