Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос начинающего по АРМ
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
evgforum
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[i] = (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++);
}
beer_warrior
1. Нет
2.На первый взгяд все правильно, тоько вот задержка вызывает сомнение. Не слишком ли велика? Я бы предолжил убрать ее и посмотреть ногу осциллом. Ну и еще раз проверить инициализацию.
Сергей Борщ
Цитата(evgforum @ Jun 4 2006, 12:50) *
Код
__ramfunc void wait(void)
{
int time;

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

Я думаю ошибка в строке int time; Должно быть
Код
volatile int time;
Компилятор считает что раз в цикле ничего не происходит этот цикл просто не нужен и спокойно его выкидывает. Т.е. нога скорее всего дергается, но очень быстро.
evgforum
Совсем убирал Wait, пробовал volatile. Ничего не меняется. На ножке 0 В. Осциллографом пока не смотрел. Видимо дело в инициализации, хотя сразу после нее состояние выхода устанавливается правильно
GetSmart
Может возврат из процедуры происходит уже на туда куда надо. Что-то с памятью моей стало... Попробуёте ещё закомментить саму процедуру Wait.
evgforum
Проверил инициализацию. Вроде бы все правильно
wait комментил - не помогло
Светодиод загорается только в момент включения и сразу же гаснет - как и раньше было.
Подключен через буфер.

Может надо какие-то настройки в Linker делать или еще где в проекте?
Там все по дефолту. Оптимизацию отключал

Подозрение такое, что генератор не запускается. Буду проверять...
Хотя с Самбой все работает.
Непонятные сообщения выдает SAMBA - Unlocked involved region - два раза
Это нормально?
Сергей Борщ
Цитата(evgforum @ Jun 6 2006, 00:25) *
Проверил инициализацию. Вроде бы все правильно
wait комментил - не помогло
Светодиод загорается только в момент включения и сразу же гаснет - как и раньше было.
Подключен через буфер.

Может надо какие-то настройки в Linker делать или еще где в проекте?
Там все по дефолту. Оптимизацию отключал

Киньте мне проект на serzh(ухо)rrt.lv. Погоняю через JTAG, посмотрю куда падает. Правда у меня только SAM7S64, но думаю это непринципиально. Я не пользовался библиотеками с at91.com, прописывал все необходимые регистры вручную по даташиту. И ногами дергал через макросы on() off() имени Аскольда Волкова.
Цитата(evgforum @ Jun 6 2006, 00:25) *
Хотя с Самбой все работает.
Непонятные сообщения выдает SAMBA - Unlocked involved region - два раза
Это нормально?
С самбой пока не работал.
evgforum
Цитата
И ногами дергал через макросы on() off() имени Аскольда Волкова.


Что это?

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


А как прошиваете?
Сергей Борщ
Цитата(evgforum @ Jun 6 2006, 13:04) *
Цитата

И ногами дергал через макросы 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.
Сергей Борщ
Цитата(evgforum @ Jun 6 2006, 00:25) *
Может надо какие-то настройки в Linker делать или еще где в проекте?
Там все по дефолту. Оптимизацию отключал

Ага, посмотрел проект - файл .xcl по умолчанию линкует для неизвестного процессора в результате ОЗУ попадает на адреса 0x10000. Отсюда все грабли.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.