Jump to content

    
Sign in to follow this  
evgforum

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

Recommended Posts

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++);

}

Share this post


Link to post
Share on other sites

1. Нет

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

Share this post


Link to post
Share on other sites
__ramfunc void wait(void)
{
int time;

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

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

 volatile int time;

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

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

 

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

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

 

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

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

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

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

Share this post


Link to post
Share on other sites
Проверил инициализацию. Вроде бы все правильно

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

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

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

 

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

И ногами дергал через макросы 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.

Share this post


Link to post
Share on other sites
Может надо какие-то настройки в Linker делать или еще где в проекте?

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this