Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите стартануть с LPC
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
valeroon
Здравствуйте!Приобрел плату с LPC2378 и как нормальный начинающий сразу сел в лужу.То ли неправильно сконфигурированы GPIO то ли еще чего,но включить/выключить светодиод(классика)
не удается(P0.13).Эмулятор через J-LINK плату видит нормально.Вот мой первый исходник для ARM-
(сам я электронщик а не программист поэтому написан извините как понимаю).Прошу помощи !


#include <iolpc2378.h>



//******************************************************************************
int main()
{
//***********************Инициализация акселератора FLASH памяти****************
MAMCR_bit.MODECTRL = 0;//MAM blocked
MAMTIM_bit.CYCLES = 1;// FCLK<20 MHz
MAMCR_bit.MODECTRL = 2;// MAM functions fully enabled

MEMMAP=0x00000002;
//***************************Инициализация системы******************************
SCS_bit.OSCRANGE = 0;// Fosc=1-20MHz
SCS_bit.OSCEN = 1;//Main oscillator enabled
while(SCS_bit.OSCSTAT==0);//waiting OSC ready

//Disconnect PLL
PLLCON_bit.PLLC = 0;
PLLFEED = 0xAA;
PLLFEED = 0x55;
//Disable PLL
PLLCON_bit.PLLE = 0;
PLLFEED = 0xAA;
PLLFEED = 0x55;
//***********************Конфигурирование выводов портов************************
IO0DIR=0x00002000;//
//IO1DIR=0x00080000;//

PINSEL0=0;
PINSEL1=0;
//******************************************************************************
IO0CLR=0x00002000;
IO0SET=0x00002000;
IO0CLR=0x00002000;
IO0SET=0x00002000;
IO0CLR=0x00002000;
IO0SET=0x00002000;
for( ; ; ) {}

}
Golikov A.
Вам надо добавить кодик который проведет инициализацию всего и вся и передаст управление в функцию маин. При старте кристал сам не передаст управление в маин. Вам нужен еще кусок кода, который отработает начальную загрузку.

Кеил вроде как сам умеет такой код делать. Для иара его можно выдрать из примера.
richie
Некогда прямо сейчас погружаться в конфигурирование. сори...
В приложении к моему посту примеры для 2378 применительно к кейлу.

Но тестовое моргание лучше сделать так:

int main()
{ int i; // объявить переменную

//***********************Инициализация акселератора FLASH памяти****************
...

//******************************************************************************

for( ; ; ) {
IO0CLR=0x00002000; // зажигание светодиода низким уровнем (как было в исходном посте)
for ( i = 0; i < 1000; i++ ); // пауза, для изменения паузы заменить 1000 на другое число.
IO0SET=0x00002000; // гашение светодиода высоким уровнем (как было в исходном посте)
}

}

Примеры: Нажмите для просмотра прикрепленного файла
zltigo
Цитата(Golikov A. @ Aug 12 2008, 14:28) *
Вам надо добавить...

Не морочте человеку голову - на начальном этапе ему ничего не надо (он и так уже,похоже,по чьим-то советам бездумно напихал яко-бы мнициализации MAM и PLL) ибо базовый cstartup штатная принадлежность наряду с библиотеками.
Golikov A.
Цитата(zltigo @ Aug 12 2008, 18:18) *
Не морочте человеку голову - на начальном этапе ему ничего не надо (он и так уже,похоже,по чьим-то советам бездумно напихал яко-бы мнициализации MAM и PLL) ибо базовый cstartup штатная принадлежность наряду с библиотеками.


А в памяти все там разместить стеки, и прочая фигня? И переход организовать с вектора ресета на маин. Это же надо все равно сделать, или я чего-то не понимаю? Одного же С файла текст которого привели не хватит, если только его залить ничего же не заработает или я не в курсе?
Можете поподробнее рассказать?
Student Pupkin
Цитата(Golikov A. @ Aug 12 2008, 21:22) *
А в памяти все там разместить стеки, и прочая фигня? И переход организовать с вектора ресета на маин. Это же надо все равно сделать, или я чего-то не понимаю? Одного же С файла текст которого привели не хватит, если только его залить ничего же не заработает или я не в курсе?
Можете поподробнее рассказать?

Я тоже начинающий армовод, учусь в иаре 5.11. smile.gif
Одного файла С достаточно, в опциях линкера надо указать файл (*.icf в 5-ом иаре, *.xcl - в 4-ом). В этом файле указывается диапазон флэш-памяти (адреса), ОЗУ, размеры стеков под все режимы ядра. Я такой файл взял из примеров. Причем там обычно в двух вариантах - для отладки в ОЗУ (прога заливавется в ОЗУ) и flash (прога прошивается во флэш). Для отладки в ОЗУ еще надо из примера взять mac-файл (указать его в опциях "Debbuger") - там прописано, чтобы иар перед стартом проги сделал через MEMMAP переотображение адресов исключений (0x00, 0x04..) на начало ОЗУ. Хотя можно и в проге MEMMAM прописать. Кому как нравиться... smile.gif
По поводу мигания светодиодом - я тоже только на второй день запустил.
Попробуйте еще в регистре SCS бит GPIOM в 0 сбросить (это значит, что доступ к порту P0 через регистры IOSET, IODIR и т.д., в LPC23xx и LPC24xx есть еще режим FAST GPIO со своими регистрами).
Это я к чему... Ваша прога из ОЗУ выполняется, скорее всего и во флэши что-нибудь записано (какая-нибудь тестова программа). До того, как отладчик проц схватит, выполняется прога из флэши, она вполне может успеть P0 в режим FAST GPIO переставить (у меня было так smile.gif ).
Или методом тыка - тормозите проц, открывайте окно GPIO и вручную ставьте биты, где считаете нужным, пока светодиод не загорится
Вот мой вариант мигания (файлы icf и mac я взял из примеров) - тока для LPC2478, но для вашего тоже подойдет smile.gifНажмите для просмотра прикрепленного файла
Sat360
Я в свое время делал (имхо) проще. Из иара взял готовый проект (arm\examples\NXP\LPC23xx\IAR-LPC-2378-SK\simple\GPIO\) - как раз ножкой дрыгает. Запустил его, начал копаться... Ну и далее по накатанному.
valeroon
Спасибо всем отозвавшимся.Сообщаю что этот исходник заработал за одним изменением-регистры типа
IOxSET,CLR,PIN,DIR были заменены на FIOxSET и тп.В чем разница думаю разберусь самостоятельно.

Насчет бездумного копирования кода-за пример был взят исходник из книги(П.П. Редькин Микроконтроллеры ARM семейства LPC2000).Не имел оснований не доверять написанному.

Данный пример компилировался в IAR EW-и программа выполняется из ОЗУ.Вопрос-как осуществить запись и выполнение программы из FLASH.
aaarrr
Цитата(valeroon @ Aug 13 2008, 09:21) *
Насчет бездумного копирования кода-за пример был взят исходник из книги(П.П. Редькин Микроконтроллеры ARM семейства LPC2000).Не имел оснований не доверять написанному.

И снова Редькин! Попробуйте поискать фамилию этого "автора" на форуме. Думаю, сразу станет все ясно.
Sat360
Цитата(valeroon @ Aug 13 2008, 08:21) *
Вопрос-как осуществить запись и выполнение программы из FLASH.

xcl-файл заменить с LPC2378_Ram.xcl на LPC2378_Flash.xcl, если пользовались исходниками ИАРа
Если нет - то мыслить в том же направлении wink.gif
zltigo
Цитата(valeroon @ Aug 13 2008, 07:21) *
Насчет бездумного копирования кода-за пример был взят исходник из книги(П.П. Редькин Микроконтроллеры ARM семейства LPC2000).Не имел оснований не доверять написанному.

Нет словsad.gif Настоятельно рекомендую ознакомитмся с оценкой "творчества" Редькина на этом форуме.
http://electronix.ru/forum/index.php?showt...E8%ED&st=50
Student Pupkin
Цитата(valeroon @ Aug 13 2008, 09:21) *
Спасибо всем отозвавшимся.Сообщаю что этот исходник заработал за одним изменением-регистры типа
IOxSET,CLR,PIN,DIR были заменены на FIOxSET и тп.В чем разница думаю разберусь самостоятельно.

Так я же говорил - есть регистр System Controls and Status Register (SCS - стр.33 User Manual LPC23xx).
В этом регистре есть бит GPIOM. Если он в '0' - управление портами P0 и P1 через регистры IOxDIR, IOxSET, IOxCLR. Это сделано для совместимости с ПО для прошлых серий микроконтроллеров. Если же этот бит в '1' - управление P0 и P1 осуществляется через регистры FIOxSET и т.п. smile.gif
Или вы пробовали и не помогает?
mtronic
Здравствуйте!
У меня похожая ситуация, только наоборот немного.. Я пока начинающий в армах.
Использую МК LPC2368.
Среда: IAR Embedded Workbench 5.0 Evaluation.

Конструкционно обусловлено использование выводов 68 (P2.5), 69 (P2.4), 70 (P2.3), 73 (P2.2), 74 (P2.1), 75 (P2.0).

Не получается изменять уровень на выводах.

Пример программы:

Код
//*********************************
#include <iolpc2368.h>
int main(void)
{
  PINSEL4_bit.P2_0=0;
  FIO2MASK_bit.P2_0=0;
  FIO2DIR_bit.P2_0=1;

  ...
  FIO2SET_bit.P2_0=1;
  FIO2CLR_bit.P2_0=1;
  ...

}
//*********************************



В datasheet видел следующее: GPIO порты PORT0 и PORT1 могут работать как в обычном режиме, так и в улучшенном (fast mode).
А порты PORT2, PORT3... могут работать только в fast.

Пробовал писать подобную программу для PORT0, только использовал регистры IO0DIR, IO0SET, IO0CLR - программа работала (и в нормальном выполнении, и в режиме debug пошагово результат был виден и в watch, и на осциллографе на 76 выводе для P0.9).
Потом решил использовать режим fast.
Установка бита GPIOM в регисте SCS не помогла, т.к. регистры FIO0PIN, FIOSET... не работали (в FIO0PIN значение не изменялось ни в watch, ни на осциллографе, значение бита GPIOM изменялось).

В общем получается только "дергать" ногой порта 0 и только в legacy режиме.
Enhanced fast режим не работает ни для PORT0 ни для PORT2.

Подскажите, пожалуйста, в чём может быть дело?
*SERG
Цитата(aaarrr @ Aug 13 2008, 10:32) *
И снова Редькин! Попробуйте поискать фамилию этого "автора" на форуме. Думаю, сразу станет все ясно.

Да что вы всё на Редькина, вполне приличная книга для начинающих. Не написано же что учебник по Си.
Примеры на Си корявые, а остальное очень даже ничего. Нашли минус в 10% книги и понесли....
Напишите лучше, в чём проблема то rolleyes.gif
aaarrr
Цитата(*SERG @ Aug 12 2009, 22:42) *
Примеры на Си корявые, а остальное очень даже ничего.

Для начинающего достаточно информации, изложенной в user manual'ах и datasheet'ах (ну, если их читать, конечно).
А эта книжка специально для ленивых - с опечатками и устаревшими на пару-тройку лет данными.
haker_fox
Цитата(*SERG @ Aug 13 2009, 03:42) *
Не написано же что учебник по Си.

А причем тут учебник по Си? Чтобы лапкой помахать, ненужно инициализировать MAM, PLL и другую периферию. Инициализация оных в таких простых примерах, может вызвать у новичка неверное представление и понимание сути программы. Я лично при обучении студентов AVR в исходниках ничего лишнего не размещаю.
А так, конечно, можно для мигания светодиода параллельно и USART сконфигурировать)
Цитата(*SERG @ Aug 13 2009, 03:42) *
Напишите лучше, в чём проблема то rolleyes.gif

Я уверен, что местные спецы по ARM'ам могут помочь во многих вопросах, но написать грамотно книгу не каждому дано! Просто перевести даташит и разбавить примерами - одно, написать же книгу с нуля, свой личный труд - совершенно другое! Однако, не имея возможности создавать, критиковать тоже никто не запрещает, давая ссылки на более удачный труд. Именно так здесь и критикуют. Взамен книги Редькина, рекомендуют читать фирменную документацию. App Notes тоже ни зря пишутся.
mtronic
У меня ситуация немного поменялась в лучшую сторону!:)
Хотя не полностью..

Теперь получилось работать с портом 0 в fast режиме.
Т.е. получается махать 76 лапкой с помощью программы:

Код
//********************************
#include <iolpc2368.h>
int main(void)

  SCS_bit.GPIOM=1;  
  FIO0DIR_bit.P0_9=1;

while (1)  
{
  for (int i=0;i<1000;i++) i=i;
  FIO0SET_bit.P0_9 = 1;
  for (int i=0;i<1000;i++) i=i;
  FIO0CLR_bit.P0_9 = 1;
}  
//********************************


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

Но во втором порту не все выводы слушаются.. Использовал точно такую же программу с заменой FIO0... на FIO2... ну и соответствующих выводов.
Проверил все имеющиеся выводы PORT2. Работают только P2.10 - P2.13, а P2.0-P2.9 не работают..

Подскажите, пожалуйста, как заставить их работать?
esaulenka
не далее как сегодня в очередной раз прошёлся по этим граблям.

в LPC23xx необходимо сделать PINSEL10 = 0 (странно... резистор нужный стоит... джитаг этот резистор "пересиливает", что-ли?..)

на LPC24xx даташита под рукой нет, предлагаю внимательно посмотреть раздел Pin Connect Block, особенно в части port2
mtronic
esaulenka, огроменное спасибо!!!
Действительно с PINSEL10=0 выводы P2.0-P2.9 в режиме GPIO заработали!

Но в режиме PWM не хотят..

esaulenka, Вы случайно не знаете, как их заставить работать?

я писал об этой проблеме здесь:
http://electronix.ru/forum/index.php?showtopic=66215
esaulenka
Цитата(mtronic @ Aug 14 2009, 10:17) *
Но в режиме PWM не хотят..
esaulenka, Вы случайно не знаете, как их заставить работать?

Увы, крайний раз ковырялся с ШИМом в институте (на PIC18), ничего толком подсказать не могу...

Разве что не понял вот этот кусочек:
Код
  PINSEL4_bit.P2_0=1;
  PINSEL4_bit.P2_1=1;

  PINSEL4_bit.P2_0=0;
  PINSEL4_bit.P2_1=0;

  PINSEL4_bit.P2_0=1;
  PINSEL4_bit.P2_1=1;
mtronic
Цитата(esaulenka @ Aug 14 2009, 11:09) *
Увы, крайний раз ковырялся с ШИМом в институте (на PIC18), ничего толком подсказать не могу...


Эх, жаль.. Ну ладно, будем грызть гранит.. smile.gif

Цитата(esaulenka @ Aug 14 2009, 11:09) *
Разве что не понял вот этот кусочек:


А, это ерундаsmile.gif Забыл выкинуть из примера..
Проверял с помощью watch в пошаговом режиме, меняются ли значения регистров.. хотя уже понял, что в IAR'e watch криво работает при отладке на железке.. В симуляторе вроде нормально, хотя кто его знает..
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.