В DipTrace в предварительном просмотре страницы (там где печать) выбрать "сохранить" и поставить побольше dpi (500-1000). Файл bmp или jpeg отлично видно.
А это зачем? Явно AVR-овский подход. Для ARM в этом нет никакого смысла и выигрыша. Тут все ALU-команды в опкоде содержат 8 бит immediate-данных, и сдвиг для них. Так что в командах можно сразу писать #1 или #0 - на размер кода не повлияет.
Заголовок сообщения: Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Добавлено: Пт мар 14, 2014 18:38:11
Грызет канифоль
Карма: 1
Рейтинг сообщений: 21
Зарегистрирован: Пн май 16, 2011 10:54:32 Сообщений: 299 Откуда: Красноярск
Рейтинг сообщения:0
Возник вопрос насчет этого:
kisssko писал(а):
Цитата:
6 mov R10,#0 ;Константы. 7 mov R11,#1
А это зачем? Явно AVR-овский подход. Для ARM в этом нет никакого смысла и выигрыша. Тут все ALU-команды в коде содержат 8 бит immediate-данных, и сдвиг для них. Так что в командах можно сразу писать #1 или #0 - на размер кода не повлияет.
Смог заменить
Код:
cmp R1, R11
на
Код:
cmpR1, #1
Все скомпилировать. Теоретически - работает. А как поступить с bit-band-ом? Как заменить эту строку?
Код:
strR11, [R0]
В R11 константа 1. R0 - адрес побитовой адресации. Перебрал множество вариантов этой команды + суффиксы и разный синтаксис, так и не удалось удачно скомпилировать. А ради этого оставлять целый регистр - не хочется.
_________________ Все можно сделать, было бы желание!
Да, так правильно. Тем более, что для старших регистров (r8-r12) генерится 32-битная команда (кроме некоторых команд). Вообще, для ARM нет нужды хранить константы в регистрах. Если уж так хочется чем то занять регистры, то лучше часто используемыми адресами переменных. В одном на несколько рядом лежащих переменных, и использовать смещения.
Код:
ldrr1, [r0, #4]
Вот так возможности архитектуры будут использоваться более полно.
А ещё вот:
Цитата:
Instructions encoded in 16 bit when using registers R0-R7
ADR Rd, <label> (range 0 to 1020) <ADDS|SUBS|MOVS> Rd, #imm8 <ADDS|SUBS> Rd, Rn, #imm3 <ADDS|SUBS> Rd, Rn, Rm <ADCS|ANDS|EORS|BICS|MVNS|ORRS|SBCS|UXTB|UXTH|MULS> Rd, Rm (MULS may be slower than MUL on some CPUs) RSBS Rd, Rn, #0 <REV|REV16|REVSH> Rd, Rm <ASRS|LSRS|LSLS> Rn, Rm, #imm5 CMP Rn, #imm8 <CMP|CMN|TST> Rn, Rm (Rm can be any register for CMP) <LDM|STM> Rn!, <registers> <LDR|STR>{H|B} Rt, [Rn{, #imm5}] <LDR|STR>{H|B} Rt, [Rn, Rm ] LDRS<H|B> Rt, [Rn, Rm] LDR Rt, <label> (0-1020) <PUSH|POP> <registers> IT{x{y{z}}} <cond> CB{N}Z Rn, <label> (range 0 to 126) B<cond> <label> (range -256 to 254) B <label> (range -2048 to 2046)
Instructions encoded in 16 bit using registers R0-R15
Заголовок сообщения: Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Добавлено: Сб мар 15, 2014 15:51:46
Грызет канифоль
Карма: 1
Рейтинг сообщений: 21
Зарегистрирован: Пн май 16, 2011 10:54:32 Сообщений: 299 Откуда: Красноярск
Рейтинг сообщения:0
kisssko писал(а):
Цитата:
cmp R1, #1
Да, так правильно. Тем более, что для старших регистров (r8-r12) генерится 32-битная команда (кроме некоторых команд). Вообще, для ARM нет нужды хранить константы в регистрах. Если уж так хочется чем то занять регистры, то лучше часто используемыми адресами переменных. В одном на несколько рядом лежащих переменных, и использовать смещения.
Код:
ldrr1, [r0, #4]
Вот так возможности архитектуры будут использоваться более полно.
А ещё вот:
Цитата:
Instructions encoded in 16 bit when using registers R0-R7
ADR Rd, <label> (range 0 to 1020) <ADDS|SUBS|MOVS> Rd, #imm8 <ADDS|SUBS> Rd, Rn, #imm3 <ADDS|SUBS> Rd, Rn, Rm <ADCS|ANDS|EORS|BICS|MVNS|ORRS|SBCS|UXTB|UXTH|MULS> Rd, Rm (MULS may be slower than MUL on some CPUs) RSBS Rd, Rn, #0 <REV|REV16|REVSH> Rd, Rm <ASRS|LSRS|LSLS> Rn, Rm, #imm5 CMP Rn, #imm8 <CMP|CMN|TST> Rn, Rm (Rm can be any register for CMP) <LDM|STM> Rn!, <registers> <LDR|STR>{H|B} Rt, [Rn{, #imm5}] <LDR|STR>{H|B} Rt, [Rn, Rm ] LDRS<H|B> Rt, [Rn, Rm] LDR Rt, <label> (0-1020) <PUSH|POP> <registers> IT{x{y{z}}} <cond> CB{N}Z Rn, <label> (range 0 to 126) B<cond> <label> (range -256 to 254) B <label> (range -2048 to 2046)
Instructions encoded in 16 bit using registers R0-R15
Тут не изменить ничего. 8-битные константы удобны только для команд обработки данных, типа cmp, tst, add, sub. Константы типа 0 и 1 как раз и нужны чаще всего для проверки/сравнения. И вот тут удобнее использовать иммедиейт, чем держать их в регистрах.
LDR/STR могут выгружать/загружать из/в памяти только регистры. В иммедиейт для них можно задать дополнительное смещение к адресу.
Сложные 32-битные константы действительно удобнее держать в памяти. 8-битные удобнее задавать в иммедиейте и использовать с командами обработки данных.
Для записи их в память нужно сначала поместить в какой нибудь временный регистр командой mov.
Заголовок сообщения: Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Добавлено: Пн мар 17, 2014 14:15:00
Грызет канифоль
Карма: 1
Рейтинг сообщений: 21
Зарегистрирован: Пн май 16, 2011 10:54:32 Сообщений: 299 Откуда: Красноярск
Рейтинг сообщения:0
Решил переписать свою библиотеку под монохромный экран с AVR на STM с нуля. Но столкнулся с проблемой иерархии файлов. Ни в одной статье-мануале не уделяется должного внимания подключению внешних файлов. Удалось лишь подключить файл с адресами регистров и бит.
Код:
get stm32f10x.s ;Заголовочный файл.
А как например разбить программу? Не хочется скакать по огромному файлу исправляя пару строк модульного кода. И еще. Если я как-нибудь именую регистры в одном файле, то почему эти обозначения не работают в другом? Например:
Код:
;Имена регистрам.---------- Temp RN R0 ;Для мелких операций. Pointer RN R1 ;Адресс (указатель). Data RN R2 ;Важные данные. One RN R11 ;1.
_________________ Все можно сделать, было бы желание!
Решил переписать свою библиотеку под монохромный экран с AVR на STM с нуля. Но столкнулся с проблемой иерархии файлов. Ни в одной статье-мануале не уделяется должного внимания подключению внешних файлов. Удалось лишь подключить файл с адресами регистров и бит.
Код:
get stm32f10x.s ;Заголовочный файл.
Смотря какой ассембер. В GAS и Keil по разному. В Keil есть неплохой мануал.
Спойлер
Цитата:
GET or INCLUDE ARM Compiler toolchain v5.02 for µVision Assembler Reference
Home > Directives Reference > GET or INCLUDE
GET or INCLUDE The GET directive includes a file within the file being assembled. The included file is assembled at the location of the GET directive. INCLUDE is a synonym for GET.
Syntax GET filename where:
filename is the name of the file to be included in the assembly. The assembler accepts pathnames in either UNIX or MS-DOS format.
Usage GET is useful for including macro definitions, EQUs, and storage maps in an assembly. When assembly of the included file is complete, assembly continues at the line following the GET directive.
By default the assembler searches the current place for included files. The current place is the directory where the calling file is located. Use the -i assembler command line option to add directories to the search path. File names and directory names containing spaces must not be enclosed in double quotes ( " " ).
The included file can contain additional GET directives to include other files.
If the included file is in a different directory from the current place, this becomes the current place until the end of the included file. The previous current place is then restored.
GET cannot be used to include object files.
Examples AREA Example, CODE, READONLY GET file1.s ; includes file1 if it exists ; in the current place. GET c:\project\file2.s ; includes file2 GET c:\Program files\file3.s ; space is permitted See also Reference INCBIN
А как например разбить программу? Не хочется скакать по огромному файлу исправляя пару строк модульного кода. И еще. Если я как-нибудь именую регистры в одном файле, то почему эти обозначения не работают в другом? Например:
Код:
;Имена регистрам.---------- Temp RN R0 ;Для мелких операций. Pointer RN R1 ;Адресс (указатель). Data RN R2 ;Важные данные. One RN R11 ;1.
Нужно инклудить для каждого файла, как и в Си. Естественно, инклудить по нескольку раз только файлы с определениями, вроде EQU, и прочими макросами. Файлы с кодом дублировать нельзя. Ещё, если разбивать на файлы, нужно экспорт функций прописывать. И импорт, где будут использоваться.
Регистры R0-R3 используются стандартно для передачи параметров функции. Завязки тогда лучше делать начиная с R4. А R0-R3? динамически, когда не используются для параметров. При вызове библиотечной функции нужно сохранять в стёк все используемые регистры, кроме R0-R3, R13(SP), R15(PC). И всегда R14(LR).
Заголовок сообщения: Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Добавлено: Сб апр 12, 2014 15:10:54
Грызет канифоль
Карма: 1
Рейтинг сообщений: 21
Зарегистрирован: Пн май 16, 2011 10:54:32 Сообщений: 299 Откуда: Красноярск
Рейтинг сообщения:0
Вообщем так. Сделал я со 2-й попытки нормальную отладочную. Запустил, но как только включаю бит UE (включение USART), так сразу же в порт бегут левые символы. Разбираться не стал, ибо надоело уже мучиться с такими мелочами, да и M3 мне для следующей задачи не хватит, но и компьютер на одной плате много, купил себе отладочную плату STM32F429I-DISCO. Сразу на Cortex-M4. Чтоб уж наверняка. С LCD и внешне SDRAM на 64. Сам камень мне так же понравился. Начал изучать, нашел datasheet на плату, посмотрел как все подключено (Из 144 выводов лишь малую часть можно использовать просто так, остальная уже подключена, ну и ладно, самому не придется), нашел официальный datasheet на камень, но столкнулся с серьезной проблемой. В родной документации не описано ни одного регистра! Что делать - даже не знаю...
_________________ Все можно сделать, было бы желание!
нашел официальный datasheet на камень, но столкнулся с серьезной проблемой. В родной документации не описано ни одного регистра! Что делать - даже не знаю...
Да, тяжело после AVR с их писанными левой ногой аляповатыми даташитами , где все в кучу свалено . Найди Reference manual на свою линейку. Все там же на офсайте ...
Цитата:
Разбираться не стал, ибо надоело уже мучиться с такими мелочами,
Это тебе жЫрный минус. Бросить все из за такой ерунды - это не наш метод...
Заголовок сообщения: Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Добавлено: Сб апр 12, 2014 15:28:00
Грызет канифоль
Карма: 1
Рейтинг сообщений: 21
Зарегистрирован: Пн май 16, 2011 10:54:32 Сообщений: 299 Откуда: Красноярск
Рейтинг сообщения:0
dosikus писал(а):
Цитата:
Разбираться не стал, ибо надоело уже мучиться с такими мелочами,
Это тебе жЫрный минус. Бросить все из за такой ерунды - это не наш метод...
А кто сказал, что я бросил? Не дождетесь . Просто сейчас мне нужно сделать за лето довольно большой проект, но если я буду тратить время на отладку косяков уровня "плохая отладочная" - я не успею. Да и появилась надобность в M4, чего ранее не было. Обязательно займусь ей позже. Недавно был на одном конкурсе и "умные люди" мне посоветовали больше не делать "основу своими руками", не "изобретать велосипед". Трудиться на идею, а не на реализацию. + бросить все попытки сделать все с нуля, а пользоваться готовыми отладочными наборами и готовыми модулями. "Думаешь, что люди, которые их делали тупее тебя и ты сможешь их превзойти?...". Очень долго искал... Нашел http://www.st.com/st-web-ui/static/active/en/resource/technical/document/reference_manual/DM00031020.pdf.
_________________ Все можно сделать, было бы желание!
Недавно был на одном конкурсе и "умные люди" мне посоветовали больше не делать "основу своими руками", не "изобретать велосипед". Трудиться на идею, а не на реализацию. + бросить все попытки сделать все с нуля, а пользоваться готовыми отладочными наборами и готовыми модулями. "Думаешь, что люди, которые их делали тупее тебя и ты сможешь их превзойти?...".
Чушь какая-то , к чему тут мерянье членами с разработчиками ? К тому же демоборды, те же дискаверины , сделаны для быстрого старта а не практического применения в каких либо проектах. К примеру на той же F4, F3 или VL дискаверине заняты нужные пины . Да и схемотехника построения девайсов на STM32 не составляет из себя что либо сверхсложное. Возможно твои советчики мало знакомы с эмбеддом и из клана ардуино-халявщиков ?
Заголовок сообщения: Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Добавлено: Сб апр 12, 2014 16:44:14
Грызет канифоль
Карма: 1
Рейтинг сообщений: 21
Зарегистрирован: Пн май 16, 2011 10:54:32 Сообщений: 299 Откуда: Красноярск
Рейтинг сообщения:0
Судите сами, так сказала комиссия в лице разработчиков компании siemens в Москве. Читаю документацию. С настройкой портов разобрался, позже выложу сюда свой мини-мануал для настройки. Но при попытке искусственно задать значение порта - получаю отказ (на плате мигает светодиод попытки отладки в этот момент), скорее всего сначала нужно включить тактирование этого пора в APB1, как в M3. Ищу, читаю, пробую.
_________________ Все можно сделать, было бы желание!
Заголовок сообщения: Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Добавлено: Сб апр 12, 2014 17:32:17
Грызет канифоль
Карма: 1
Рейтинг сообщений: 21
Зарегистрирован: Пн май 16, 2011 10:54:32 Сообщений: 299 Откуда: Красноярск
Рейтинг сообщения:0
Вообщем все получилось. Алгоритм (Для keil5! В 4 и камня-то такого нет...): 1. Выбираем порт и пин. Я выбрал PB13, т.к. на моей плате к нему подключен зеленый светодиод. 2. Нужно написать код-пустышку. С бесконечным циклом. У меня такой был под Cortex-m3, я просто сменил камень в настройках. После чего включить отладку и оставить на паузе. Код такой:
Код:
Steck1 equ 0x20000000+0x101 ;Вершина стека. 0x2000 0000 - начало ОЗУ (СОЗУ). ;Выделяем 1-е 0x100 (256) байт + 1 (из книги). AREA RESET, DATA, READONLY ;Пишим таблицу вектаров. EXPORT __Vectors __Vectors ;Описываем вектора.
DCD Steck1 ; Значение R13 (Указателя стека). DCD Reset_Handler ; Адрес переход к основной программе (Вычесляется автоматически).
EXPORT Reset_Handler ;Далее действия при включении.
AREA |.text|, CODE, READONLY ;В памяти кода. Reset_Handler
Lal B Lal ;Бесконечный цикл.
END END
3. Нужно включить тактирование порта, для этого заходим в Periherals -> System Viever -> RCC (Это, я так понял, общие настройки включения/выключения настроек тактирования всего). В появившемся меню раскрываем список (нажать на + около) AHB1ENR, в раскрывшемся списке нажать на GPIOBEN (Здесь B - номер порта). Все, тактирование порта B включёно. 4. Нужно настроить ножку порта. Для этого заходим снова в Periherals -> System Viever -> но потом в GPIO -> GPIOB. В этом раскрывшемся списке выберем MODER, и там, напротив MODER13 впишем 0x01 (Стандартный выход). Ничего больше настраивать не будем. По умолчанию выставлена минимальная частота. 5. Теперь поморгаем ручками. Раскрываем в том же меню список ODR, и кликаем галочку напротив ODR13. Светодиод загорится.
_________________ Все можно сделать, было бы желание!
Заголовок сообщения: Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Добавлено: Сб апр 12, 2014 18:36:32
Грызет канифоль
Карма: 1
Рейтинг сообщений: 21
Зарегистрирован: Пн май 16, 2011 10:54:32 Сообщений: 299 Откуда: Красноярск
Рейтинг сообщения:0
А вот и рабочий код. Очень помог опыт полученный от Cortex-M3. Разницы между МК я пока не заметил (И хорошо...). Только настройка портов более приятная, в документе все, кроме 12 режимов настройки порта понятно.
Код:
Steck1 equ 0x20000000+0x101 ;Вершина стека. 0x2000 0000 - начало ОЗУ (СОЗУ).
ldr R2, = Off_Led ;Метка возвращения из процедуры ожидания в выключение. b Delay
Off_Led str R0, [R1] ldr R2, = Z
Delay ;Задержка. ldr R0, =0xFFFFF D sub R0, 1 cmp R0, 0 bne D bx R2
END END
Файл проекта ниже. Посмотрите, если не сложно, внесите свои замечания. И еще вопросы. 1. Почему-то у меня пропал указатель положения при отладке. Он есть в верхнем меню (чистого кода), но нет в том, который я писал. Раньше было, как вернуть? (Такая желтая стрелочка слева напротив каждой строки). А то отлаживал в слепую. 2. Есть ли под Cortex-M4 файл с названиями регистров? А то я прописывал вручную из симулятора... 3. Можно ли входить в процедуру иначе, не так, как я?
3. Можно ли входить в процедуру иначе, не так, как я?
Даже нужно! Традиционно для ARM подпрограммы вызываются либо BL метка, либо командой BLX с адресом в регистре. При этом в R14 (LR) сохраняется адрес возврата. Если требуется ещё раз вызвать подпрограмму - нужно сохранить перед этим регистр LR в стёк. Возврат из подпрограммы делается либо командой BX LR, либо восстановлением из стёка содержимое LR в регистр PC. Пример:
Код:
main push {r4, lr} @ стёк должен быть выровнен на 8. movwr0, #1000 bldelay movr0, #0 @ код выхода pop {r4, pc} @ Выход из main delay subsr0, #1 nop bnedelay @ loop bxlr @ выход из delay
По стандартному соглашению вызовов для ARM, параметры функциям передуются в регистрах R0-R3. Если используются R4-R12 - их нужно сохранять в стёк, и восстанавливать перед выходом (можно вместе с PC). Результат возвращать нужно в R0, если он 32 бита, и в R0-R1, если 64 битный.
Заголовок сообщения: Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Добавлено: Вс апр 13, 2014 07:27:48
Грызет канифоль
Карма: 1
Рейтинг сообщений: 21
Зарегистрирован: Пн май 16, 2011 10:54:32 Сообщений: 299 Откуда: Красноярск
Рейтинг сообщения:0
Весьма тяжело было понять ваш код (Т.к. многих команд наизусть не помню.). Помогло это http://forum.easyelectronics.ru/viewtopic.php?f=35&t=17374. Тут краткое содержание всех команд с их синтаксисом на русском. Правда под Cortex-M3.
_________________ Все можно сделать, было бы желание!
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения