Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проба ARM
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
arttab
Начал создавать новый проект (иар4.40А) и не понял как в примерах стартап получался.
может кто-нибудь объяснить или ссылку кинуть (если не на русском, то плиз картинок по больше или ролик).
Спасибо.

или я туплю (путаю с кейлом) и все надо ручками?
а к проекту только подключить #include"iolpc2134.h" ?
Сергей Борщ
Цитата(arttab @ Feb 20 2007, 11:58) *
Начал создавать новый проект (иар4.40А) и не понял как в примерах стартап получался.
По-хорошему он автоматически подлинковывается из библиотеки. И только если он вас чем-то не устраивает (что случается очень редко) надо подключать свой.

Вот тут про создание проекта для SAM7, для LPC точно так же.
arttab
Спасибо за ответ. Рою дальше.
Для ознакомления открыл демо 213х.
В demo.c есть #include "includes.h". уже в нем
#ifndef __INCLUDES_H
#define __INCLUDES_H

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdbool.h>

#include <intrinsics.h>
#include <iolpc2148.h>

#include <LPC_data_type.h>
#include <arm_comm.h>
#include <LPC2138_sys_cnfg.h>

#include <menu_cnfg.h>
#include <menu.h>
#include <drv_hd44780.h>
#include <LPC_SysControl.h>
#include <LPC_Vic.h>
#include <LPC_Uart.h>
#include <LPC_Timer.h>
#include <LPC_Rtc.h>

#endif // __INCLUDES_H

Если я правильно понял то это самодельный файл. для краткости в него запихали все подключаемое.
Вопрос по организыции проекта: куча папок app, board.... Это стиль написания проекта?

Вот я пока и не могу разобраться что должен я написать сам, что подключить готовое (если мне не нужно делать что то особенное - xcl редактировать под свое размещение сегментов).

Покопаюсь еще в хелпе - может допрет.
DASM
не с того начали.. перходите на Keil - чтобы потом не было мучительно больно за бесцельно прожитую жизнь
arttab
Цитата
не с того начали.. перходите на Keil - чтобы потом не было мучительно больно за бесцельно прожитую жизнь

Зачем плодить сущие без надобности? Я в иаре под AVR работаю. А кейл менее конфигурируемый (помниться до 4 сегментов пользователя). IDE дело вкуса и привычки

Цитата
Вот тут про создание проекта для SAM7, для LPC точно так же.

По хелпу создание проекта прошел, но не дошло как иару указать начальную конфигурацию кристала.
DASM
Цитата(arttab @ Feb 21 2007, 07:15) *
Цитата
не с того начали.. перходите на Keil - чтобы потом не было мучительно больно за бесцельно прожитую жизнь

Зачем плодить сущие без надобности? Я в иаре под AVR работаю. А кейл менее конфигурируемый (помниться до 4 сегментов пользователя). IDE дело вкуса и привычки

Цитата
Вот тут про создание проекта для SAM7, для LPC точно так же.

По хелпу создание проекта прошел, но не дошло как иару указать начальную конфигурацию кристала.

Какие 4-ре сегмента ??? Я про компилятор RVDS и скаттер файлы - куда уж гибче. Впрочем дело ваше - когда отладка будет отваливаться на каждом шагу в большом проекте - вспомните
arttab
из примера на SAM7X256 получается, что конфигурация задается в начале main.
Т.е. подключаю файл описания .h (вот только какой для lpc2134?) и в Main начинаю настраивать переферию и прочее?
Сергей Борщ
Цитата(arttab @ Feb 21 2007, 07:28) *
из примера на SAM7X256 получается, что конфигурация задается в начале main.

Можно там, можно в __low_level_init(). А AVR вы как конфигурите? Делайте и тут также.
Цитата(arttab @ Feb 21 2007, 07:28) *
Т.е. подключаю файл описания .h (вот только какой для lpc2134?)
А поищите в IAR\EWARM\ARM\INC
arttab
Цитата
А поищите в IAR\EWARM\ARM\INC

нашел iolpc2134.h. это аналог под avr ioM8.inc - дефаин регистров и прочего. подключил.
Цитата
Можно там, можно в __low_level_init(). А AVR вы как конфигурите? Делайте и тут также.

под avr делаю в начале mian, но в avr нет таких тонкостей (включить MAM или нет, определить стеки для разных режимов,....)
нашел файл cstartup.s79. Получается в нем на асме надо написать инициализацию железа. Достаточно ли этот файл просто добавить в прект или надо в xcl поправить размещение? И как?

Цитата
__low_level_init()

по встроеному шелпу ее можно использовать для задания начальной конфигурации. так:
__low_level_init()
{MAMCR=0;
MAMTIM=0x03;}
?
Спасибо за помощь! уже не в первый раз выручаете.

если можно дайте простой пример: trumb, UART (на какуе-нибудь скорость), и вектор на USART.
буду дальше разбираться
Сергей Борщ
Цитата(arttab @ Feb 21 2007, 12:38) *
нашел файл cstartup.s79. Получается в нем на асме надо написать инициализацию железа. Достаточно ли этот файл просто добавить в прект или надо в xcl поправить размещение? И как?
Не,этот файл вам не нужен. Точнее он подлинкуется из библиотеки и сам настроит стеки. Вам остается только периферию настроить. Как и в AVR smile.gif МАМ является периферией, как и контроллер прерываний.
Цитата(arttab @ Feb 21 2007, 12:38) *
Цитата
__low_level_init()

по встроеному шелпу ее можно использовать для задания начальной конфигурации. так:
__low_level_init()
{MAMCR=0;
MAMTIM=0x03;}
?
Угу, только return 1; Иначе память не проинициализует.
Цитата(arttab @ Feb 21 2007, 12:38) *
если можно дайте простой пример: trumb, UART (на какуе-нибудь скорость), и вектор на USART.
буду дальше разбираться
Вот, надергал из проекта. Компилится, но проверить сейчас не на чем. Правда С++, но думаю идея будет понятна.
arttab
Спасибо! Посмотрю. MAM я для примера привел (неудачно) имел ввиду стеки. Если cstartup.s79 сам подлинкуется, то и размер стеков будет автоматом определен для данного проекта?
Сергей Борщ
Цитата(arttab @ Feb 22 2007, 04:44) *
имел ввиду стеки. Если cstartup.s79 сам подлинкуется, то и размер стеков будет автоматом определен для данного проекта?
Да, сколько указано в .xcl, столько и пропишет.
arttab
Цитата
Да, сколько указано в .xcl, столько и пропишет.

Блин, опять не понял.
Для каждого проекта размер стеков индивидуален. А тут получается прошишит значения для "среднего" проекта. И если мне будет мало или много "средних" размеров стеков, то нужно лезь в .xcl?
gladov
Цитата(arttab @ Feb 22 2007, 12:17) *
Цитата
Да, сколько указано в .xcl, столько и пропишет.

Блин, опять не понял.
Для каждого проекта размер стеков индивидуален. А тут получается прошишит значения для "среднего" проекта. И если мне будет мало или много "средних" размеров стеков, то нужно лезь в .xcl?

Файл .xcl принято для КАЖДОГО проекта писать отдельно. И класть его, например, в settings проекта.
Если присмотреться к файлу более внимательно, станет видно, что там вообще нет общих настроек для гипотетического проекта. Только конкретные указания линкеру, которые индивидуальны для каждого проекта.
Сергей Борщ
Цитата(arttab @ Feb 22 2007, 11:17) *
И если мне будет мало или много "средних" размеров стеков, то нужно лезь в .xcl?
Когда вы писали для AVR, вы могли размеры стеков задать в оболочке или в xcl - там стеков было всего два и куча. Тут стеков несколько больше, поэтому, видимо, проще оказалось не мучаться с оболочкой а оставить только вариант с xcl.
arttab
Со стеками стало понятней. Теперь вопросы по векторам прерываний. Как задать основные (их штук 6 кажеться) и "расширенные" (где по флагам идет разбор что конкретно случилось)?
И по документации фигня на lpc - скачал pdf, а в нем регистры не расписаны и порядок зпдания ни на PLL, ни на прочее.
Сергей Борщ как то Вы хитро PLL иницилизировали. Будем искать.

Разобраться в Вашем проекте сложно - 5 файлов Вы сами делали для scmRTOS (не считая 2 главных в проекте). Поищу инфу как это по шагам делать.
Сергей Борщ
Цитата(arttab @ Feb 25 2007, 14:01) *
Теперь вопросы по векторам прерываний. Как задать основные (их штук 6 кажеться) и "расширенные" (где по флагам идет разбор что конкретно случилось)?
Почитайте эту ветку. При чтении заменяйте AT91C_BASE_AIC->AT91C_AIC_IVR и AT91C_BASE_AIC->AIC_EOICR на VICVectAddr и получите то же самое для LPC.
Цитата(arttab @ Feb 25 2007, 14:01) *
И по документации фигня на lpc - скачал pdf, а в нем регистры не расписаны и порядок зпдания ни на PLL, ни на прочее.
Это похоже вы даташит скачали, а регистры и устройство периферии расписано в User Manual.
Цитата(arttab @ Feb 25 2007, 14:01) *
Сергей Борщ как то Вы хитро PLL иницилизировали. Будем искать.
Казалось, что прямо по мануалу. Записал коэффициенты, запустил, дождался захвата, переключил тактирование на PLL.

Цитата(arttab @ Feb 25 2007, 14:01) *
Разобраться в Вашем проекте сложно - 5 файлов Вы сами делали для scmRTOS (не считая 2 главных в проекте). Поищу инфу как это по шагам делать.
Не понял что вы тут хотели сказать. Да, порт scmRTOS делал я. Да, в этот пример я взял файлы .xcl, .mac и файлы проекта оттуда. С тем же успехом мог бы создать их заново, но смысл? Что касается файлов - мне удобнее много мелких логически законченных файлов чем один большой. В проекте:
LPC_bits.h - опиcание битов регистров периферии. Описание их в ioLPC2xxx.h через битовые поля часто неудобно.
LPC_UART.h - описание регистров UART в виде структуры. Позволяет по указателю одинаково обращаться к любому uart: к UART0 и к UART1. Тоже отстутствует в ioLPC2xxx.h. Подобное есть в ioAT91xxx.h
circ_buff.h - шаблон кольцевого буфера. Поскольку может использоваться не только с UART - вынесен в отдельный файл.
UART.h - собственно класс UART.
main.cpp - инициализация процессора, пример использования UART.
Vectors.s79 - ветвление по адресу из контроллера прерываний. Реализация таким образом мне кажется наиболее оптимальной по скорости. Почему - описывал в приведенной выше ветке.
arttab
Спасибо!
Т.е. на асме можно так объявить прерывания (файл тапв .s79):
EXTERN CODE32 (Undef_Handler?A)
EXTERN CODE32 (SWI_Handler?A)
EXTERN CODE32 (Pabt_Handler?A)
EXTERN CODE32 (Dabt_Handler?A)
EXTERN CODE32 (IRQ_Handler?A)
EXTERN CODE32 (FIQ_Handler?A)

Vectors: LDR PC, Reset_Addr
LDR PC, Andef_Addr
LDR PC, SWI_Addr
LDR PC, Pabt_Addr
LDR PC, Dabt_Addr
NOP
LDR PC, IRQ_Addr
LDR PC, FIQ_Addr

Reset_Addr: DD Reset_Handler
и т.д.
правильно?
arttab
Или предыдущее только в кейле пройдет?
А под IAR надо как Вы писали:

CODE32
COMMON INTVEC:CODE:ROOT
org 0x00000018
LDR PC, VICVectAddr
END
а в Си:

__irq __arm void IRQ_Handler1() {

.............

VICVectAddr->VIC_EOICR = 0;
}

__irq __arm __nested void IRQ_Handler2() {

.............

VICVectAddr->VIC_EOICR = 0;

но тогда как быть с другими ситуациями (от SWI, FIQ и прочии)?
и где узнать названия прерываний (IRQ_Handler1(), IRQ_Handler2())? в хелпе на IAR не нашел. А VICVectAddr это тыпа метка с произвольным именем. Не ошибаюсь?
arttab
Немного распутался. Имена векторов объявлены в iolpc2134.ddf
Значит имена возьму оттуда.
Хотя не понял как связаны VICIRQStatus с AIC_IVR. И что будет ля FIQ, SWI....
Сергей Борщ
Цитата(arttab @ Feb 26 2007, 12:25) *
Немного распутался. Имена векторов объявлены в iolpc2134.ddf
Значит имена возьму оттуда.
Хотя не понял как связаны VICIRQStatus с AIC_IVR.
Никак. Аналог AIC_IVR (AIC Interrupt Vector Register) у AT91SAM7 это VICVectAddr (VIC vector address) у LPC2xxx.
Отступление: любое прервание можно назначить генернить IRQ или FIQ запрос.
В VICIRQStatus биты указывают какие из разрешенных и назначенных как IRQ прерываний сработали (флаги). При срабатывании прерывания IRQ контроллер (VIC) помещает адрес его обработчика в VICVectAddr. Откуда он читается и по нему осуществляется переход: LDR PC, VICVectAddr.

Вы документацию вообще не читаете?

Цитата(arttab @ Feb 26 2007, 12:25) *
И что будет ля FIQ, SWI....
для FIQ и SWI будут функции с квалификаторами __fiq и __swi. FIQ ветвлений не предусматривает, поэтому и обработчик только один:
Код
#pragma vector = 0x1C
__fiq void FIQ_Handler()
{
  .....
}
Про swi прочитайте в описании компилятора - там может быть много обработчиков и им можно передавать параметры.
Переходы по векторам DataAbort, PrefetchAbort и Undef могут быть описаны только на асме (об этом писалось в ветке, ссылку на которую я приводил).
Переход по ResetVector осуществляется в библиотечной cstartup, вам про нее думать не нужно.
arttab
Цитата
Вы документацию вообще не читаете?

Извените, отвлекают. Иногда основательно и забыл, то что уже разбирал.
Перечитываю первоисточники , в частности Мартина.
настройка PLL у Вас действительно как в рекомендации. Только я не понял почему при M=5 и P=2 в книге получилось 0x00000024 (стр.74)

По аналогии для AVR искал в каком файле обозначены имена векторов, регистров. Надеюсь уже не ошибусь ioLPC2134.h.
в секции ** VIC Interrupt channels вектора и перечислены, а в секции
** VIC привязка к адресам.
Продолжу перечитывать и далее углубляться.
Сергей Борщ
Цитата(Сергей Борщ @ Feb 21 2007, 13:21) *
Вот, надергал из проекта. Компилится, но проверить сейчас не на чем. Правда С++, но думаю идея будет понятна.
Нашел время проверить. Отловил пару ошибок. Исправленная версия прилагается.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.