14.09.2010, 10:11
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Re: Здравствуй, ARM. Запуск "на коленке"
У меня такой вот вопросик про ногодрыганье.
Для AVR-рок я писал так:
PORTC.5=1;
или так
PORTC.5=выражение;
Причем пин принимает логическое значение выражения(ноль=выключен, не ноль=включен). Для ARM мне пришлось написать так:
if(выражение)//if bit set
GPIO_IOSET=0x00000040;//P0.6
else
GPIO_IOCLR=0x00000040;
Конечно все работает, но что-то мне подсказывает что есть более простой и изящный метод переключения состояния пина.
|
|
|
|
15.09.2010, 09:21
|
|
Временная регистрация
Регистрация: 16.05.2007
Сообщений: 59
Сказал спасибо: 1
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
|
Re: Здравствуй, ARM. Запуск "на коленке"
uk8amk, не понял вашей хитрости... Вы выставляете бит в единицу, если он итак в единице и в ноль, если он в нуле? Или что вы проверяете и зачем?
Я думаю, что
аналогично
|
|
|
|
15.09.2010, 09:26
|
|
Временная регистрация
Регистрация: 16.05.2007
Сообщений: 59
Сказал спасибо: 1
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
|
Re: Здравствуй, ARM. Запуск "на коленке"
Сообщение от innovator_king
|
Скажите пожалуйста! Есть ли у кого примеры кодов для контроллеров TI LM3S9B96 и ему подобные. Желательно под IAR.
|
Зайдите на сайт тексаса и слейте оттуда, наверняка там все есть. К тому же есть CMSIS, который для всех кортексов M0, M3, M4.
|
|
|
|
16.09.2010, 08:52
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Re: Здравствуй, ARM. Запуск "на коленке"
Сообщение от Snacker
|
не понял вашей хитрости... Вы выставляете бит в единицу, если он итак в единице и в ноль, если он в нуле? Или что вы проверяете и зачем?
|
Да, наверно я не совсем понятно выразился. Попробую на примере.
Чтобы не было скучно ковырять ARM, я взял конкретную задачу - бегущую строку. На AVR я делал процедуру вывода на табло так:
PHP код:
|
for(j=1;j‹65;j‹‹=1)
{
for(i=0;i‹MATRIX_LEN;i++)
{
PORTC.2=0;
PORTC.0=VideoRAM[i] & j;//transmit bit
PORTC.2=1;//shift bit
};
PORTC.1=1;//capture data into register
PORTB=j;//set output string
PORTC.1=0;
delay_us(100);//wait
};
};
|
Этот кусок кода выводил в сдвиговые регистры со светодиодами по очереди строки длиной MATRIX_LEN из массива VideoRam[MATRIX_LEN](т.е. динамическая индикация).
На элемент массива VideoRAM[i] накладывается битовая маска j для выделения текущей строки, а затем результат операции "И" выводится на пин PORTC.0. Причем, если VideoRAM[i]&j==0 то PORTC.0=0, а если VideoRAM[i]&j!=0(например, 1, 20, 128 и т.д.), то PORTC.0=1.
Для ARM такой аналогии переключения бита порта подобрать не смог и пришлось сделать так:
PHP код:
|
for(i=0;i‹64;i++)//issue current string
{
GPIO_IOCLR=0x00000090;//clear SH_CP & ST_CP bits
if(video_ram[i] & str_cnt)//if bit set
GPIO_IOSET=0x00000040;//P0.6
else
GPIO_IOCLR=0x00000040;
asm("nop\n nop\n nop\n nop");
GPIO_IOSET=0x00000010;//set SH_CP/clock signal
asm("nop\n nop\n nop\n nop");
};
|
Так вот, мне показалось что менять состояние пина порта через if() не совсем разумно и хочу узнать как такую задачу решили бы более опытные ARM-щики.
|
|
|
|
16.09.2010, 10:44
|
|
Временная регистрация
Регистрация: 16.05.2007
Сообщений: 59
Сказал спасибо: 1
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
|
Re: Здравствуй, ARM. Запуск "на коленке"
uk8amk, вообще-то вы в PORTC.0 выводили не 0 или 1, а 0 или 1/2/4/8/16/32/64. Не знаю, правда, что по этому поводу думал ваш компилятор, но логически это не совсем верно.
На сколько я помню, в IAR была реализована возможность обращения к отдельным битам в АРМах. Вообще, разработчики архитектуры ARM такой возможности не предусматривали, и самым правильным считается именно такие операции, когда для обнуления бита используется IOCLR, а для выставления IOSET. Была лазейка работать через IOPIN, правда я не в курсе может ее уже пофиксили.
Хотя тут по-любому получается структура с if-else, даже в вашем примере с AVR по идее должна быть. Или хотя бы что-то типа:
Код:
|
PORTC.0=(VideoRAM[i] & j)||0; |
Последний раз редактировалось Snacker; 16.09.2010 в 10:49.
|
|
|
|
17.09.2010, 10:13
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Re: Здравствуй, ARM. Запуск "на коленке"
Snacker
Я работал в CodeVision и он этот код нормально проглатывал. Ну да ладно, видать чуда все равно не будет ![Улыбка](images/smilies/icon_smile.gif) IOPIN и FIOPIN работают(по крайней мере в младших камнях LPC2000).
Тут я почитал аппнот Philips AN10404 Initialization code/hints for the LPC2000 family
Там сказано следующее:
Цитата:
|
5.1.2 Setting up Stack Pointers and Enabling Interrupts
While setting the stack pointer please note that the Flash programming routines use a
section of the on-chip SRAM. In-System Programming (ISP) uses the top 256 bytes and
In-Application Programming (IAP) uses the top 128 bytes of the on-chip SRAM. The
application stack should not overlap this area.
|
Про IAP я полностью согласен, ему нужен кусок RAM для накопления данных. А вот по поводу ISP мне не ясно. Написано что для ISP нужно освободить сверху 256 байт. Но какая ему разница если я например включаю ISP через bootloader, то до моей программы дело не доходит, мои стеки не инициализируются т.к. по ресету управление перехватывает загрузчик. Где я ошибаюсь и что недопонимаю?
Последний раз редактировалось uk8amk; 18.09.2010 в 09:51.
|
|
|
|
19.09.2010, 10:40
|
|
Вид на жительство
Регистрация: 05.07.2006
Адрес: Tashkent
Сообщений: 454
Сказал спасибо: 24
Сказали Спасибо 67 раз(а) в 44 сообщении(ях)
|
Re: Здравствуй, ARM. Запуск "на коленке"
Добрался я наконец до UART-а LPC2000. С передачиком модуля все ясно, а с приемником не понятно. Максимум что смог найти - это примеры кода, посылающие строку. Для приемника примеров нет, да и описание в UserManual LPC2101 немного запутанное. Мои вопросы:
1)При приеме байтов по заполению RXFIFO срабатывает прерывание RDA/данные, чтобы его очистить надо читать U0RBR, пока не снимется флаг RDA в U0LSR?
2)Написано что есть прерывание LSR/статус. Статус появляется немного позже чем RDA? Вот тут опять непонятно, для очистки прерывания надо читать идентификационный регистр U0IIR и/или статусный U0LSR?
3)Как правильно обрабатывать события приемника(например алгоритм приема символа)?
Будет отлично если есть образцовые куски кода на эту тему.
|
|
|
|
20.09.2010, 11:02
|
|
Временная регистрация
Регистрация: 16.05.2007
Сообщений: 59
Сказал спасибо: 1
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
|
Re: Здравствуй, ARM. Запуск "на коленке"
uk8amk, вот тут code.bundle.lpc23xx.lpc24xx.uvision.zip есть примеры работы с LPC23xx/24xx. Попробуйте применить то, что там есть.
|
|
|
Сказали "Спасибо" Snacker
|
|
|
20.09.2010, 11:33
|
|
Прописка
Регистрация: 11.07.2007
Сообщений: 127
Сказал спасибо: 8
Сказали Спасибо 24 раз(а) в 18 сообщении(ях)
|
Re: Здравствуй, ARM. Запуск "на коленке"
Поделитесь примером работы периферийным драйвером LCD в lpc2478.
|
|
|
|
20.09.2010, 14:28
|
|
Временная регистрация
Регистрация: 16.05.2007
Сообщений: 59
Сказал спасибо: 1
Сказали Спасибо 10 раз(а) в 9 сообщении(ях)
|
Re: Здравствуй, ARM. Запуск "на коленке"
Сообщение от yarunt
|
Поделитесь примером работы периферийным драйвером LCD в lpc2478.
|
Вот пример.
А тут и тут можно посмотреть какую-нибудь еще информацию.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо Snacker за это сообщение:
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:19.
|
|