|
Минимальный код для работы с портом AT91SAM7 |
|
|
|
Nov 6 2008, 09:01
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 3-03-08
Из: г.Томск
Пользователь №: 35 572

|
Всем доброго времени суток! Возникла необходимость перейти с AVR на ARM-ы. Вот тут сразу незадачка вышла. Прочитал, пересмотрел, перелопатил достаточно большое количество примеров программ, литературы (Бедного редькина и Англ даташит). Купил отладочную платку, SAM7-P64, Wiggler программаторик. "Стянул" IAR с интернета, "вылечил" его и приступил к работе. Для начала решил определиться, какой же минимум подключаемых файлов необходим, ибо все примеры пестрят ТАКИМ их количеством, что порой черт ногу сломит. Вроде подразобрался, написал первую прогу и тут же сел в лужу Как и водится, решил "поиграть" ножками для начала. Но перед тем как "зашивать", как водится запустил прогу в эмуляторе. Эмулятор работает, прога на первый взгляд выполняется. НО!!!! В регистре PMC_SCSR после сброса (Выполнение программы только начинается) ВСЕ НУЛИ!! Когда флаг PCK (состояние тактирования процессора) должен быть установлен! И многие остальные регистры, так же не выходят на свое первоначальное состояние. После выполнения записи в регистр PIO_SODR, как я полагаю, должны установиться соответствующие биты и в регистре PIO_ODSR. (а в PIO_SODR сброситься в окне эмулятора ????) Этого не происходит!!! Что за ерунда? Что я не правильно делаю? То же самое происходит и с остальными регистрами. Скажем при установки PIO_OER, не меняется PIO_OSR.... Программировать контроллер не программировал. Думал может надо разрешить тактирование PIO и процессора, дописал соответствующие команды, нифига. Пробовал записывать регистры состояния в отдельный регистр (считывал), думал может тут баг, ведь вроде они для чтения, но умом то понимал, что блин эмулятор должен показывать, как и ожидалось, ничего не произошло  считались НУЛИ Вот пример программы: (прошу не критиковать код ибо все получилось в результате безрезультатных попыток на скорую руку запустить эмулятор из имеющихся под рукой программ) // ******************************************************* // Header Files // ******************************************************* #include "AT91SAM7S256.h" unsigned int a; int main (void) { while (1) { volatile AT91PS_PIO pPIO = AT91C_BASE_PIOA; // pointer to PIO data structure volatile AT91PS_PMC pPMC = AT91C_BASE_PMC; pPMC->PMC_PCER = 1 << AT91C_ID_PIOA; pPMC->PMC_SCER = 1 << 0; pPIO->PIO_PER = 4; // PIO Enable Register - allow PIO to control pins pPIO->PIO_OER = 0xFFFF; // PIO Output Enable Register pPIO->PIO_SODR = 12; // PIO Set Output Data Register pPIO->PIO_CODR = 4; a = pPIO->PIO_ODSR; // a = pPIO->PIO_CODR; } } Прошу помощи!!!!! HELP!!! Чего не хватает, где упущение, если можно , то образец минимального набора прикрипляемых файлов и кода программы хотелось бы посмотреть для управления ножками контроллера
Сообщение отредактировал Vinterman - Nov 6 2008, 09:07
|
|
|
|
|
 |
Ответов
|
Nov 6 2008, 09:16
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Vinterman @ Nov 6 2008, 12:01)  Как и водится, решил "поиграть" ножками для начала. Но перед тем как "зашивать", как водится запустил прогу в эмуляторе. ... Программировать контроллер не программировал. Т.е. запустили в симуляторе, а не под эмуляцией. Бросьте это дело и забудьте про симуляцию периферии на ARM. Цитата(Vinterman @ Nov 6 2008, 12:01)  pPMC->PMC_SCER = 1 << 0; Это явно лишнее, остального достаточно для ногодрыганья.
|
|
|
|
|
Nov 6 2008, 09:39
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 3-03-08
Из: г.Томск
Пользователь №: 35 572

|
Цитата(aaarrr @ Nov 6 2008, 12:16)  Т.е. запустили в симуляторе, а не под эмуляцией. Бросьте это дело и забудьте про симуляцию периферии на ARM. Это явно лишнее, остального достаточно для ногодрыганья. Благодарю за ответ. Рад что опытный глаз сделал ревизию моего кода, теперь я хоть знаю что иду в правильном направлении. Спасибо. Сегодня вечером попробую "подрыгать лапкой". И если успеется, то опробую прерывание от таймера использовать, для тренировки и освоения работы с прерываниями. Ждите развития темы и новых вопросов  Один из всплывших вопросов. Почему я вынужден из-за, на мой взгляд, корявого файла описателя "AT91SAM7S256.h" писать такие строки: volatile AT91PS_PIO pPIO = AT91C_BASE_PIOA; pPIO->PIO_OER = 0xFFFF; Есть в нете, более грамотные описатели, чтобы можно было указывать сразу понравившийся регистр, в следующем формате: PIO_OER = 0xFFFF; Или в ручную придется перелопачивать все ?
|
|
|
|
|
Nov 6 2008, 09:47
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Vinterman @ Nov 6 2008, 12:39)  Один из всплывших вопросов. Почему я вынужден из-за, на мой взгляд, корявого файла описателя "AT91SAM7S256.h" писать такие строки:
volatile AT91PS_PIO pPIO = AT91C_BASE_PIOA; pPIO->PIO_OER = 0xFFFF;
Есть в нете, более грамотные описатели, чтобы можно было указывать сразу понравившийся регистр, в следующем формате:
PIO_OER = 0xFFFF;
Или в ручную придется перелопачивать все ? А зачем так сложно? Можно написать: AT91C_BASE_PIOA->PIO_OER = 0xffff; или *AT91C_PIOA_OER = 0xffff; Можно перелопатить хидер, чтобы писать просто PIOA_OER = 0xffff. Поиск->замена рулит.
|
|
|
|
|
Nov 6 2008, 10:19
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 3-03-08
Из: г.Томск
Пользователь №: 35 572

|
Цитата(aaarrr @ Nov 6 2008, 12:47)  А зачем так сложно? Можно написать: AT91C_BASE_PIOA->PIO_OER = 0xffff; или *AT91C_PIOA_OER = 0xffff;
Можно перелопатить хидер, чтобы писать просто PIOA_OER = 0xffff. Поиск->замена рулит. Ну просто с одной стороны лень каждый раз писать "приставку" AT91C_BASE_ или *AT91C_, да и код более ляпистый получается, хочется красоты в програмке хоть какой-то  Регистры же все равно не повторяются, поэтому я не понимаю зачем такую сложность ввели, вот в AVR-ках в этом отношении было просто, в прочем как и с установками флагов в регистрах. Тоже, понапридумывали по 3 регистра, 2 из которых управляют флагами, а результат и текущий статус вообще в 3-ем смотрится. По мне так не очень как то такие перемены. Вот и ищу более простые пути. С другой стороны с установкой флагов меньше мороки. Но стоит ли овчинка выделки ?
Сообщение отредактировал Vinterman - Nov 6 2008, 10:20
|
|
|
|
|
Nov 6 2008, 10:37
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 3-03-08
Из: г.Томск
Пользователь №: 35 572

|
Цитата(aaarrr @ Nov 6 2008, 13:31)  В многозадачной системе стоит без вариантов. Возможно вы правы. И пока сам не напорюсь не удостоверюсь в собственном неведении А как проще и прозрачнее со стороны "бывалого" обрабатывать прерывания. Структурку накидать можно?  ))))
|
|
|
|
|
Nov 7 2008, 15:06
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Vinterman @ Nov 6 2008, 13:37)  А как проще и прозрачнее со стороны "бывалого" обрабатывать прерывания. Структурку накидать можно?  )))) Есть два варианта - с использоавнием вложенных прерываний и без него. В любом случае ставим загрузку PC из AIC_IVR непосредственно на векторе: Код 0x18 ldr pc, [pc, #-0xf20] ; IRQ Если не использовать вложения, то дальше все просто (на примере таймера PIT): Код #define PIT_HZ 1000 #define PIT_PERIOD ((mck + PIT_HZ * 8) / (PIT_HZ * 16))
int main(void) { // Install System interrupt handler AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (u_int)sys_irq_handler; AT91C_BASE_AIC->AIC_IECR = (0x01 << AT91C_ID_SYS);
AT91C_BASE_PITC->PITC_PIMR = AT91C_PITC_PITEN | AT91C_PITC_PITIEN | (PIT_PERIOD - 1); }
__irq void sys_irq_handler(void) { AT91C_BASE_PITC->PITC_PIMR; ... // Что-то еще делаем ... AT91C_BASE_AIC->AIC_EOICR = 0; } С вложением придется добавить еще один уровень на асме: Код GET at91sam7x128.inc GET arm.inc
; *************************************************************************** ; * IMPORT sys_irq_handler
EXPORT sys_irq_wrapper
; *************************************************************************** ; * AREA code0, CODE, READONLY
; *************************************************************************** ; *
sys_irq_wrapper ;- Adjust and save LR_irq mode in IRQ stack sub r14, r14, #0x04 stmfd sp!, {r14}
;- Save SPSR and r0 in IRQ stack mrs r14, SPSR stmfd sp!, {r0, r14}
;- Enable Interrupt and Switch in SYS Mode mrs r14, CPSR bic r14, r14, #I_BIT orr r14, r14, #ARM_MODE_SVC msr CPSR_c, r14
;- Save scratch/used registers and LR in User Stack stmfd sp!, {r1-r4, r12, r14}
bl sys_irq_handler
;- Restore scratch/used registers and LR from User Stack ldmfd sp!, {r1-r4, r12, r14}
;- Disable Interrupt and switch back in IRQ mode mrs r0, CPSR bic r0, r0, #ARM_MODE_SYS orr r0, r0, #I_BIT :OR: ARM_MODE_IRQ msr CPSR_c, r0
;- Mark the End of Interrupt on the AIC ldr r0, =AT91C_BASE_AIC str r0, [r0, #AIC_EOICR]
;- Restore SPSR_irq and r0 from IRQ stack ldmfd sp!, {r0, r14} msr SPSR_cxsf, r14
;- Restore ajusted LR_irq from IRQ stack directly in the PC ldmfd sp!, {pc}^
END Код #define PIT_HZ 1000 #define PIT_PERIOD ((mck + PIT_HZ * 8) / (PIT_HZ * 16))
int main(void) { // Install System interrupt handler AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS] = PRIOR_SYSTEM; AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (u_int)sys_irq_wrapper; AT91C_BASE_AIC->AIC_IECR = (0x01 << AT91C_ID_SYS);
AT91C_BASE_PITC->PITC_PIMR = AT91C_PITC_PITEN | AT91C_PITC_PITIEN | (PIT_PERIOD - 1); }
void sys_irq_handler(void) { AT91C_BASE_PITC->PITC_PIMR; ... // Что-то еще делаем ... } Примеры для RealView, для IAR'а придется доработать.
|
|
|
|
Сообщений в этой теме
Vinterman Минимальный код для работы с портом AT91SAM7 Nov 6 2008, 09:01 Vinterman КУЛ!!! Вчера таки запустил Внутрисхемн... Nov 7 2008, 10:02 Vinterman Огромное спасибо за разъяснения! Сегодня разгр... Nov 12 2008, 08:03 Vinterman Замучали меня уже эти прерывания! ПОМОГИТЕ ... Nov 18 2008, 08:12 Vinterman Вроде разобрался с кодом на асме. Компилит сам код... Nov 19 2008, 03:57 aaarrr Цитата(Vinterman @ Nov 19 2008, 06:57) Ко... Nov 19 2008, 07:04  Vinterman Цитата(aaarrr @ Nov 19 2008, 10:04) Ну та... Nov 19 2008, 13:32 Сергей Борщ Цитата(Vinterman @ Nov 19 2008, 05:57) Вр... Nov 19 2008, 09:02
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|