Настройка USART в STM32 (STM32F103VBT6), Assembler.
Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
В DipTrace в предварительном просмотре страницы (там где печать) выбрать "сохранить" и поставить побольше dpi (500-1000). Файл bmp или jpeg отлично видно.
Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
6 mov R10,#0 ;Константы.
7 mov R11,#1
А это зачем? Явно AVR-овский подход. Для ARM в этом нет никакого смысла и выигрыша.
Тут все ALU-команды в опкоде содержат 8 бит immediate-данных, и сдвиг для них.
Так что в командах можно сразу писать #1 или #0 - на размер кода не повлияет.
Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Sergi, спасибо . Не искал , ибо нужды пока не было...
-
Вадиматоричик
- Грызет канифоль
- Сообщения: 299
- Зарегистрирован: Пн май 16, 2011 10:54:32
- Откуда: Красноярск
Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Возник вопрос насчет этого:
Смог заменить на Все скомпилировать. Теоретически - работает. А как поступить с bit-band-ом? Как заменить эту строку?
В R11 константа 1. R0 - адрес побитовой адресации. Перебрал множество вариантов этой команды + суффиксы и разный синтаксис, так и не удалось удачно скомпилировать. А ради этого оставлять целый регистр - не хочется.
kisssko писал(а):6 mov R10,#0 ;Константы.
7 mov R11,#1
А это зачем? Явно AVR-овский подход. Для ARM в этом нет никакого смысла и выигрыша.
Тут все ALU-команды в коде содержат 8 бит immediate-данных, и сдвиг для них.
Так что в командах можно сразу писать #1 или #0 - на размер кода не повлияет.
Смог заменить
Код: Выделить всё
cmp R1, R11Код: Выделить всё
cmp R1, #1Код: Выделить всё
str R11, [R0]Все можно сделать, было бы желание!
Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
cmp R1, #1
Да, так правильно. Тем более, что для старших регистров (r8-r12) генерится 32-битная команда (кроме некоторых команд).
Вообще, для ARM нет нужды хранить константы в регистрах. Если уж так хочется чем то занять регистры,
то лучше часто используемыми адресами переменных. В одном на несколько рядом лежащих переменных, и использовать смещения.
Код: Выделить всё
ldr r1, [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
MOV Rd, Rm
ADD Rd, Rm
BLX Rm
BX Rm
Отсюда
-
Вадиматоричик
- Грызет канифоль
- Сообщения: 299
- Зарегистрирован: Пн май 16, 2011 10:54:32
- Откуда: Красноярск
Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
kisssko писал(а):cmp R1, #1
Да, так правильно. Тем более, что для старших регистров (r8-r12) генерится 32-битная команда (кроме некоторых команд).
Вообще, для ARM нет нужды хранить константы в регистрах. Если уж так хочется чем то занять регистры,
то лучше часто используемыми адресами переменных. В одном на несколько рядом лежащих переменных, и использовать смещения.Код: Выделить всё
ldr r1, [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
MOV Rd, Rm
ADD Rd, Rm
BLX Rm
BX Rm
Отсюда
Я так и не смог здесь найти ответа на свой вопрос, как заменить строку
Код: Выделить всё
STR R11, [R0]на что-то типа STR #1, [R0] (Эта конструкция не работает). Тут http://we.easyelectronics.ru/STM32/asm-v-stm32-nachalo.html вообще пишут, что нужно держать константы в памяти.
Все можно сделать, было бы желание!
Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Вадиматоричик писал(а):Я так и не смог здесь найти ответа на свой вопрос, как заменить строкуКод: Выделить всё
STR R11, [R0]
на что-то типа STR #1, [R0] (Эта конструкция не работает). Тут http://we.easyelectronics.ru/STM32/asm-v-stm32-nachalo.html вообще пишут, что нужно держать константы в памяти.
Тут не изменить ничего.
8-битные константы удобны только для команд обработки данных, типа cmp, tst, add, sub.
Константы типа 0 и 1 как раз и нужны чаще всего для проверки/сравнения.
И вот тут удобнее использовать иммедиейт, чем держать их в регистрах.
LDR/STR могут выгружать/загружать из/в памяти только регистры.
В иммедиейт для них можно задать дополнительное смещение к адресу.
Сложные 32-битные константы действительно удобнее держать в памяти.
8-битные удобнее задавать в иммедиейте и использовать с командами обработки данных.
Для записи их в память нужно сначала поместить в какой нибудь временный регистр командой mov.
-
Вадиматоричик
- Грызет канифоль
- Сообщения: 299
- Зарегистрирован: Пн май 16, 2011 10:54:32
- Откуда: Красноярск
Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Решил переписать свою библиотеку под монохромный экран с AVR на STM с нуля. Но столкнулся с проблемой иерархии файлов. Ни в одной статье-мануале не уделяется должного внимания подключению внешних файлов. Удалось лишь подключить файл с адресами регистров и бит.
А как например разбить программу? Не хочется скакать по огромному файлу исправляя пару строк модульного кода. И еще. Если я как-нибудь именую регистры в одном файле, то почему эти обозначения не работают в другом? Например:
Код: Выделить всё
get stm32f10x.s ;Заголовочный файл. А как например разбить программу? Не хочется скакать по огромному файлу исправляя пару строк модульного кода. И еще. Если я как-нибудь именую регистры в одном файле, то почему эти обозначения не работают в другом? Например:
Код: Выделить всё
;Имена регистрам.----------
Temp RN R0 ;Для мелких операций.
Pointer RN R1 ;Адресс (указатель).
Data RN R2 ;Важные данные.
One RN R11 ;1.Все можно сделать, было бы желание!
Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Вадиматоричик писал(а):Решил переписать свою библиотеку под монохромный экран с 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
Nesting directives.
Copyright © 2011-2012 ARM. All rights reserved. ARM DUI 0588B
Non-Confidential ID062912
PDF version
Home > Directives Reference > GET or INCLUDE
Copyright © Keil, An ARM Company. All rights reserved
[/spoiler]
Вадиматоричик писал(а):А как например разбить программу? Не хочется скакать по огромному файлу исправляя пару строк модульного кода. И еще. Если я как-нибудь именую регистры в одном файле, то почему эти обозначения не работают в другом? Например:Код: Выделить всё
;Имена регистрам.----------
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).
-
Вадиматоричик
- Грызет канифоль
- Сообщения: 299
- Зарегистрирован: Пн май 16, 2011 10:54:32
- Откуда: Красноярск
Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Вообщем так. Сделал я со 2-й попытки нормальную отладочную. Запустил, но как только включаю бит UE (включение USART), так сразу же в порт бегут левые символы. Разбираться не стал, ибо надоело уже мучиться с такими мелочами, да и M3 мне для следующей задачи не хватит, но и компьютер на одной плате много, купил себе отладочную плату STM32F429I-DISCO. Сразу на Cortex-M4. Чтоб уж наверняка. С LCD и внешне SDRAM на 64. Сам камень мне так же понравился. Начал изучать, нашел datasheet на плату, посмотрел как все подключено (Из 144 выводов лишь малую часть можно использовать просто так, остальная уже подключена, ну и ладно, самому не придется), нашел официальный datasheet на камень, но столкнулся с серьезной проблемой. В родной документации не описано ни одного регистра! Что делать - даже не знаю...
Все можно сделать, было бы желание!
Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Вадиматоричик писал(а): нашел официальный datasheet на камень, но столкнулся с серьезной проблемой. В родной документации не описано ни одного регистра! Что делать - даже не знаю...
Да, тяжело после AVR с их писанными левой ногой аляповатыми даташитами , где все в кучу свалено .
Найди Reference manual на свою линейку. Все там же на офсайте ...
Разбираться не стал, ибо надоело уже мучиться с такими мелочами,
Это тебе жЫрный минус. Бросить все из за такой ерунды - это не наш метод...
-
Вадиматоричик
- Грызет канифоль
- Сообщения: 299
- Зарегистрирован: Пн май 16, 2011 10:54:32
- Откуда: Красноярск
Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
dosikus писал(а):Разбираться не стал, ибо надоело уже мучиться с такими мелочами,
Это тебе жЫрный минус. Бросить все из за такой ерунды - это не наш метод...
А кто сказал, что я бросил? Не дождетесь
Очень долго искал... Нашел http://www.st.com/st-web-ui/static/active/en/resource/technical/document/reference_manual/DM00031020.pdf.
Все можно сделать, было бы желание!
Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Вадиматоричик писал(а): Недавно был на одном конкурсе и "умные люди" мне посоветовали больше не делать "основу своими руками", не "изобретать велосипед". Трудиться на идею, а не на реализацию. + бросить все попытки сделать все с нуля, а пользоваться готовыми отладочными наборами и готовыми модулями. "Думаешь, что люди, которые их делали тупее тебя и ты сможешь их превзойти?...".
Чушь какая-то , к чему тут мерянье членами с разработчиками ? К тому же демоборды, те же дискаверины , сделаны для быстрого старта а не практического применения в каких либо проектах. К примеру на той же F4, F3 или VL дискаверине заняты нужные пины .
Да и схемотехника построения девайсов на STM32 не составляет из себя что либо сверхсложное.
Возможно твои советчики мало знакомы с эмбеддом и из клана ардуино-халявщиков ?
-
Вадиматоричик
- Грызет канифоль
- Сообщения: 299
- Зарегистрирован: Пн май 16, 2011 10:54:32
- Откуда: Красноярск
Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Судите сами, так сказала комиссия в лице разработчиков компании siemens в Москве. Читаю документацию. С настройкой портов разобрался, позже выложу сюда свой мини-мануал для настройки. Но при попытке искусственно задать значение порта - получаю отказ (на плате мигает светодиод попытки отладки в этот момент), скорее всего сначала нужно включить тактирование этого пора в APB1, как в M3. Ищу, читаю, пробую.
Все можно сделать, было бы желание!
Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Вадиматоричик писал(а):Судите сами, так сказала комиссия в лице разработчиков компании siemens в Москве.
Гы ... а свои симатики они тебе не навязывали ? Знакомые советы "прогромистов на мясорубках".
Пробуй http://kazus.ru/forums/showthread.php?t=106278 с этого поста http://kazus.ru/forums/showpost.php?p=6 ... stcount=22
-
Вадиматоричик
- Грызет канифоль
- Сообщения: 299
- Зарегистрирован: Пн май 16, 2011 10:54:32
- Откуда: Красноярск
Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Вообщем все получилось.
Алгоритм (Для keil5! В 4 и камня-то такого нет...):
1. Выбираем порт и пин. Я выбрал PB13, т.к. на моей плате к нему подключен зеленый светодиод.
2. Нужно написать код-пустышку. С бесконечным циклом. У меня такой был под Cortex-m3, я просто сменил камень в настройках. После чего включить отладку и оставить на паузе. Код такой:
3. Нужно включить тактирование порта, для этого заходим в Periherals -> System Viever -> RCC (Это, я так понял, общие настройки включения/выключения настроек тактирования всего). В появившемся меню раскрываем список (нажать на + около) AHB1ENR, в раскрывшемся списке нажать на GPIOBEN (Здесь B - номер порта). Все, тактирование порта B включёно.
4. Нужно настроить ножку порта. Для этого заходим снова в Periherals -> System Viever -> но потом в GPIO -> GPIOB. В этом раскрывшемся списке выберем MODER, и там, напротив MODER13 впишем 0x01 (Стандартный выход). Ничего больше настраивать не будем. По умолчанию выставлена минимальная частота.
5. Теперь поморгаем ручками. Раскрываем в том же меню список ODR, и кликаем галочку напротив ODR13. Светодиод загорится.
Алгоритм (Для 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. Светодиод загорится.
Все можно сделать, было бы желание!
-
Вадиматоричик
- Грызет канифоль
- Сообщения: 299
- Зарегистрирован: Пн май 16, 2011 10:54:32
- Откуда: Красноярск
Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
А вот и рабочий код. Очень помог опыт полученный от Cortex-M3. Разницы между МК я пока не заметил (И хорошо...). Только настройка портов более приятная, в документе все, кроме 12 режимов настройки порта понятно.
Файл проекта ниже. Посмотрите, если не сложно, внесите свои замечания. И еще вопросы.
1. Почему-то у меня пропал указатель положения при отладке. Он есть в верхнем меню (чистого кода), но нет в том, который я писал. Раньше было, как вернуть? (Такая желтая стрелочка слева напротив каждой строки). А то отлаживал в слепую.
2. Есть ли под Cortex-M4 файл с названиями регистров? А то я прописывал вручную из симулятора...
3. Можно ли входить в процедуру иначе, не так, как я?
Код: Выделить всё
Steck1 equ 0x20000000+0x101 ;Вершина стека. 0x2000 0000 - начало ОЗУ (СОЗУ).
AHB1ENR equ 0x40023830 ;Адреса.
GPIOBEN equ 0x00000002
GPIOB_MODER equ 0x40020400
MODER13_01 equ 0x04000000
PORTB_ODR equ 0x40020414
ODR13 equ 0x00002000
AREA RESET, DATA, READONLY ;Пишим таблицу вектаров.
EXPORT __Vectors
__Vectors ;Описываем вектора.
DCD Steck1 ; Значение R13 (Указателя стека).
DCD Reset_Handler ; Адрес переход к основной программе (Вычесляется автоматически).
EXPORT Reset_Handler ;Далее действия при включении.
AREA |.text|, CODE, READONLY ;В памяти кода.
Reset_Handler
ldr R1, = AHB1ENR ;Включаем тактирование порта B.
ldr R0, = GPIOBEN
str R0, [R1]
ldr R1, = GPIOB_MODER ;Настраиваем пин.
ldr R0, = MODER13_01
str R0, [R1]
ldr R1, = PORTB_ODR
Z ldr R0, = ODR13
str R0, [R1] ;Включаем светодиод.
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. Можно ли входить в процедуру иначе, не так, как я?
- Вложения
-
- 1.rar
- (438.93 КБ) 202 скачивания
Все можно сделать, было бы желание!
Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Вадиматоричик писал(а):3. Можно ли входить в процедуру иначе, не так, как я?
Даже нужно!
Традиционно для ARM подпрограммы вызываются либо BL метка, либо командой BLX с адресом в регистре. При этом в R14 (LR) сохраняется адрес возврата. Если требуется ещё раз вызвать подпрограмму - нужно сохранить перед этим регистр LR в стёк. Возврат из подпрограммы делается либо командой BX LR, либо восстановлением из стёка содержимое LR в регистр PC.
Пример:
Код: Выделить всё
main
push {r4, lr} @ стёк должен быть выровнен на 8.
movw r0, #1000
bl delay
mov r0, #0 @ код выхода
pop {r4, pc} @ Выход из main
delay
subs r0, #1
nop
bne delay @ loop
bx lr @ выход из delay
По стандартному соглашению вызовов для ARM, параметры функциям передуются в регистрах R0-R3. Если используются R4-R12 - их нужно сохранять в стёк, и восстанавливать перед выходом (можно вместе с PC). Результат возвращать нужно в R0, если он 32 бита, и в R0-R1, если 64 битный.
-
Вадиматоричик
- Грызет канифоль
- Сообщения: 299
- Зарегистрирован: Пн май 16, 2011 10:54:32
- Откуда: Красноярск
Re: Настройка USART в STM32 (STM32F103VBT6), Assembler.
Весьма тяжело было понять ваш код (Т.к. многих команд наизусть не помню.). Помогло это http://forum.easyelectronics.ru/viewtopic.php?f=35&t=17374. Тут краткое содержание всех команд с их синтаксисом на русском. Правда под Cortex-M3.
Все можно сделать, было бы желание!