Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.84/73: Рейтинг темы: голосов - 73, средняя оценка - 4.84
dork_riodir
0 / 0 / 0
Регистрация: 30.05.2010
Сообщений: 115
1

Как помигать светодиодом на STM32 на ассемблере?

07.05.2016, 19:11. Просмотров 13202. Ответов 26
Метки нет (Все метки)

Здравствуйте!
Наткнулся на статью habrahabr.ru/post/274579/
Сделал всё тоже самое для своего контроллера. У меня STM32F100C4T6B
Переправил согласно RM на 100 серию, но ничего не заработало (не мигает, даже не зажигается).
Помогите найти ошибку, пожалуйста.
код
Код
@GNU AS

@ Настройки компилятора
.syntax unified    @ тип синтаксиса
.thumb                @ тип используемых инструкций Thumb
.cpu cortex-m3   @ микроконтроллер

.include "STM32F100.INC"   @ файл определений микроконтроллера

@ макрос псевдокоманды MOV32, пока просто используем, не вникая как, что и почему
.macro   MOV32 regnum,number
MOVW \regnum,:lower16:\number
MOVT \regnum,:upper16:\number
.endm

@ таблица векторов прерываний
.section .text

.word   0x20010000   @ Вершина стека
.word   Riset+1      @ Вектор сброса

Riset:
@ включим тактирование GPIOH
MOV32   R0, RCC_APB2ENR  @ адрес
MOV32   R1, 0x04     @ значение
LDR   R2, [R0]       @ прочитали значение регистра
ORR   R1, R1, R2       @ логическое, побитовое ИЛИ: R1= R1 ИЛИ R2
STR   R1, [R0]            @ запись R1 по адресу указанному в R0

@ установим режим GPIOH PH2
MOV32   R0, GPIOA_CRL  @ адрес
MOV32   R1, 0x2000     @ значение
LDR   R2, [R0]       @ прочитали значение регистра
ORR   R1, R1, R2       @ логическое, побитовое ИЛИ: R1= R1 ИЛИ R2
STR   R1, [R0]            @ запись R1 по адресу указанному в R0

BLINK_LOOP:
@ включим светодиод
MOV32   R0, GPIOA_BSRR  @ адрес
MOV32   R1, 0x08          @ значение
STR   R1, [R0]          @ запись R1 по адресу указанному в R0

BL   DELAY             @   пауза

@ выключим светодиод
@MOV32   R0, GPIOA_BSRR  @ адрес
@MOV32   R1, 0x08 << (1*16)   @ значение 1-размер поля, 16-во второе полуслово
@STR   R1, [R0]          @ запись R1 по адресу указанному в R0

BL   DELAY             @   пауза

B   BLINK_LOOP         @ делаем цикл

DELAY:
MOV32   R2, 0x00100000     @ повтор цикла задержки 0x0010 0000 раз.
Delay_loop:
SUBS   R2, R2, 1
BNE   Delay_loop
BX   LR
.end
адреса определены следующие:
Код
@file STM32F100.INC
.equ RCC_APB2ENR, 0x40021018
.equ GPIOA_CRL, 0x40010800
.equ GPIOA_BSRR, 0x40010810
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2016, 19:11
Ответы с готовыми решениями:

STM32F103XC8 :: помигать светодиодом — проблема?
Здравствуйте. В программировании микроконтроллеров я новичок, хочу научиться....

Осваиваю пик или как помигать светодиодом...
Собрал свою волю в кулак и решил начать юзать пики. Первую программку нашел в...

Программирование Stm32 на ассемблере
Доброго всем времени суток! Заинтересовал такой вопрос: как программировать Stm...

Программирование STM32 на ассемблере в Keil: общие вопросы.
У меня есть уже некоторый опыт работы с 8-ми битными МК AVR на ассемблере, но...

Чем связать STM32 + STM32 в одном корпусе?
Есть 2 платы: (1) - STM32 (Вывод на LCD + запись SD) и (2) - STM32F4 (обработка...

26
vt340
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
07.05.2016, 21:19 2
Плохая, вредная статья )
Чтоб разбираться с кортексовым ассемблером нужны во-первых дебаггер, во-вторых - листинг, тогда все остальные проблемы решатся сами по ходу дела
0
dork_riodir
0 / 0 / 0
Регистрация: 30.05.2010
Сообщений: 115
07.05.2016, 21:32 3
Возможно:)
Но, за неимением лучшего...
Всё-таки есть желание разобраться, как работает кортекс. В документации подразобраться.
Я просто до конца не понимаю, как работает оно. Месяца полтора сидел над сгенерированным в кубе кодом и нихрена не понял даже с пошаговой отладкой.
0
vt340
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
07.05.2016, 21:45 4
Если у вас есть опыт хоть с каким-нибудь ассемблером, то gas можно освоить за неделю, в смысле чтоб не просто мигалку написать, а чтоб совершенно нормально и осмысленно делать всё что хочешь )
Что у вас за ситуация с дебаггером - какой адаптер, какая IDE?
0
dork_riodir
0 / 0 / 0
Регистрация: 30.05.2010
Сообщений: 115
07.05.2016, 21:55 5
Сейчас компилирую из коммандной строки. Потом прошиваю через ST link Utility. (к дискавери плате прицепил макетку с F100C4T6)
Есть так же IAR, но там в коде ничерта не понятно, хоть и работает.
В общем, ход мыслей был такой:
Я ориентировался на RM0041 Reference manual STM32F100xx advanced ARM-based 32-bit MCUs

Там есть табличка с адресацией вначале.
1) Включаю тактирование порта A (светодиод висит на PA3)
Для этого в RCC_APB2ENR нужно записать 0х4
Сей регистр находится (если верить руководству стр 36) тут
0x4002 1000 Riset omd clock control RCC со смещением в 0х18
соответственно:
0x4002 1018
пишем туда 0х04 (GPIOA_ENR)
2) Так же ищем GPIOA_CRL
0x4001 0800
пишем туда mode3 [10]
0x2000
3) Наконец, включаем
0x4001 0810
пишем туда BS3
0x08

И на порту должно появиться напряжение.
Но блин же...

Где я не правильно думаю?
0
vt340
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
07.05.2016, 22:43 6
В общем подходе к делу )
Не надо гадать, что происходит или не происходит, надо это всё просто смотреть глазами в процессе в дебаггере.
Вы можете смотреть память, регистры, периферийные регистры и выполнять программу по шагам в этой st-link utility?
Умеете делать листинг программы?
gas создаёт листинг по опции -ahlms=имя.lst
0
dork_riodir
0 / 0 / 0
Регистрация: 30.05.2010
Сообщений: 115
07.05.2016, 23:20 7
Не понял про листинг.
К какой команде параметр добавить?
/usr/local/gcc-arm-none-eabi-5_3-2016q1/bin/arm-none-eabi-as -o main.o main.asm
/usr/local/gcc-arm-none-eabi-5_3-2016q1/bin/arm-none-eabi-ld -T STDY.LD -o main.elf main.o
/usr/local/gcc-arm-none-eabi-5_3-2016q1/bin/arm-none-eabi-objcopy -O binary main.elf output.bin

Дебиггера нет, я только прошиваю.
St-link Util Target->MCU core?
Там вроде бы возможен пошаговый режим исполнения. Но только что смотреть?

UPD
objdump
листинг?
Код
main.o:     file format elf32-littlearm

SYMBOL TABLE:
00000000 l    d  .text   00000000 .text
00000008 l       .text   00000000 Riset
00000038 l       .text   00000000 BLINK_LOOP
00000066 l       .text   00000000 DELAY
0000006e l       .text   00000000 Delay_loop

Dysassembly of section .text:

00000000 <Riset-0x8>:
0:   20010000    .word   0x20010000
4:   00000009    .word   0x00000009

00000008 <Riset>:
8:   f241 0018    movw   r0, #4120   ; 0x1018
c:   f2c4 0002    movt   r0, #16386   ; 0x4002
10:   f240 0104    movw   r1, #4
14:   f2c0 0100    movt   r1, #0
18:   6802         ldr   r2, [r0, #0]
1a:   ea41 0102    orr.w   r1, r1, r2
1e:   6001         str   r1, [r0, #0]
20:   f640 0000    movw   r0, #2048   ; 0x800
24:   f2c4 0001    movt   r0, #16385   ; 0x4001
28:   f242 0100    movw   r1, #8192   ; 0x2000
2c:   f2c0 0100    movt   r1, #0
30:   6802         ldr   r2, [r0, #0]
32:   ea41 0102    orr.w   r1, r1, r2
36:   6001         str   r1, [r0, #0]

00000038 <BLINK_LOOP>:
38:   f640 0010    movw   r0, #2064   ; 0x810
3c:   f2c4 0001    movt   r0, #16385   ; 0x4001
40:   f240 0108    movw   r1, #8
44:   f2c0 0100    movt   r1, #0
48:   6001         str   r1, [r0, #0]
4a:   f000 f80c    bl   66 <DELAY>
4e:   f640 0010    movw   r0, #2064   ; 0x810
52:   f2c4 0001    movt   r0, #16385   ; 0x4001
56:   f240 0100    movw   r1, #0
5a:   f2c0 0108    movt   r1, #8
5e:   6001         str   r1, [r0, #0]
60:   f000 f801    bl   66 <DELAY>
64:   e7e8         b.n   38 <BLINK_LOOP>

00000066 <DELAY>:
66:   f240 0200    movw   r2, #0
6a:   f2c0 0210    movt   r2, #16

0000006e <Delay_loop>:
6e:   3a01         subs   r2, #1
70:   d1fd         bne.n   6e <Delay_loop>
72:   4770         bx   lr
6e-70-6e-70 ...
Судя по PC до delay дошёл. Значит программа играется. Что то я не так инициализировал...

0
vt340
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
07.05.2016, 23:53 8
Тэкс, примерно понятна ситуация )

Во-первых, ld не нужен, и вообще из всего тулчейна нужны только два файла - as и objcopy.
as -ahls=main.lst -o main.o main.s
objcopy -O binary main.o main.bin

Во-вторых, st-link utility, судя по скриншоту, похоже нихрена не может.
Тогда придётся её забыть и перейти на нормальный дебаггер - OpenOCD
Или на нормальный дебаггер в составе какой-то IDE, но у вас вроде не виндовс, как я вижу.
Ну или продолжать трепыхаться вслепую )
0
dork_riodir
0 / 0 / 0
Регистрация: 30.05.2010
Сообщений: 115
07.05.2016, 23:58 9
Цитата Сообщение от vt340
Во-первых, ld не нужен, и вообще из всего тулчейна нужны только два файла - as и objcopy.
as -ahls=main.lst -o main.o main.s
objcopy -O binary main.o main.bin
Там же по секциям собирать надо?
Цитата Сообщение от vt340
но у вас вроде не виндовс, как я вижу.
И то и другое. И можно без хлеба:)
Цитата Сообщение от vt340
Или на нормальный дебаггер в составе какой-то IDE, но у вас вроде не виндовс, как я вижу.
Есть IAR. Только ассемблер там ещё не делал ни разу.
0
judshym
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 382
08.05.2016, 00:09 10
в какие-то дебри ушли.
Когда сам разбирался с асмом на ARM (читай STM32, LPC2000) мне помогла серия статей от теплофизика:
http://tiptofyzyk.dyory.ru/?tag=175132 можно сразу сюда
http://www.dyory.ru/~tiptofyzyk/p179409174.htm?oam#more1
также полезная статья про то как создать проект на асме в кейле:
http://www.stm32asm.ru/new_clear.html
0
vt340
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
08.05.2016, 00:12 11
Цитата Сообщение от dork_riodir
Там же по секциям собирать надо?
Если у нас ассемблер, то что хотим, то и делаем, хотим - с секциями, хотим - без секций, хотим - вообще отдельные куски программы накомпилируем и произвольно по флэшу раскидаем )

Вот хорошая вводная статья про ассемблер - http://www.martinhubosik.cz/arm/arm-cor ... l-assembly - коротко, всё по делу, простенько, но со вкусом )
А с вашим кодом проблема скорее всего в том, что выход open-drain при такой настройке получается.
0
dork_riodir
0 / 0 / 0
Регистрация: 30.05.2010
Сообщений: 115
08.05.2016, 13:19 12
Цитата Сообщение от vt340
А с вашим кодом проблема скорее всего в том, что выход open-drain при такой настройке получается.
Только если MODE и CNF перепутал. В регистр записал 0х2222 2222. Вроде бы правильно. MODE сбросил CNF на 2 MHz

За сайтик спасибо, когда gdb изучать буду, воспользуюсь. Сейчас бы мигалку до рабочего состояния довести.
0
vt340
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
08.05.2016, 14:02 13
Посмотрел сейчас мануал на st-link utility, у неё оказывается и консольный и-фейс есть, через который она гораздо больше может чем через gui.
Ладно, за неимением лучшего, будем пользоваться тем что есть )
Подправьте свою программу чтоб она только включала выход и потом крутилась бы в пустом цикле.
По счётчику команд потом убедитесь, что она туда попала, и через консоль посмотрите значения в регистрах gpioa.
Ну или можно скопировать регистры gpioa в регистры процессора и их посмотреть через gui
0
vostomy
0 / 0 / 0
Регистрация: 11.02.2011
Сообщений: 187
08.05.2016, 17:41 14
Цитата Сообщение от dork_riodir
Здравствуйте!
Наткнулся на статью habrahabr.ru/post/274579/
рекомендую вот это "покурить", самое то парниша все это "пропахал" и упростил понимание, показал как все просто
0
dork_riodir
0 / 0 / 0
Регистрация: 30.05.2010
Сообщений: 115
08.05.2016, 18:34 15
Цитата Сообщение от vostomy
рекомендую вот это "покурить", самое то парниша все это "пропахал" и упростил понимание, показал как все просто
Да. Был на том сайте. Там всё для M4. Конфигурирование немного отличается. Да и у меня не сложно. Вроде бы всё и так должно быть понятно.
Немного изменил код.
Теперь только записываю в BSRR?регистр на включение. Потом из ODR?вытаскиваю состояние через st-link. пишет 0х8, значит правильно. На порт ушло. Меряю вольтметром - все ноги порта А показывают 0В, кроме моего. На нём болтается 0,4-0,5В.
сырец
Код
@GNU AS

@ Настройки компилятора
.syntax unified    @ тип синтаксиса
.thumb                @ тип используемых инструкций Thumb
.cpu cortex-m3   @ микроконтроллер

.include "STM32F100.INC"   @ файл определений микроконтроллера

@ макрос псевдокоманды MOV32, пока просто используем, не вникая как, что и почему
.macro   MOV32 regnum,number
MOVW \regnum,:lower16:\number
MOVT \regnum,:upper16:\number
.endm

@ таблица векторов прерываний
.section .text

.word   0x20010000   @ Вершина стека
.word   Riset+1      @ Вектор сброса

Riset:
mov r0,r0
mov r0,r0
mov r0,r0
@ включим тактирование GPIOH
MOV32   R0, RCC_APB2ENR  @ адрес
MOV32   R1, 0x04     @ значение
LDR   R2, [R0]       @ прочитали значение регистра
ORR   R1, R1, R2       @ логическое, побитовое ИЛИ: R1= R1 ИЛИ R2
STR   R1, [R0]            @ запись R1 по адресу указанному в R0

@ установим режим GPIOH PH2
MOV32   R0, GPIOA_CRL  @ адрес
MOV32   R1, 0x22222222@0x2000     @ значение
LDR   R2, [R0]       @ прочитали значение регистра
ORR   R1, R1, R2       @ логическое, побитовое ИЛИ: R1= R1 ИЛИ R2
STR   R1, [R0]            @ запись R1 по адресу указанному в R0

BLINK_LOOP:
@ включим светодиод
MOV32   R0, GPIOA_BSRR  @ адрес
MOV32   R1, 0x08          @ значение
STR   R1, [R0]          @ запись R1 по адресу указанному в R0

MOV32   R0, GPIOA_ODR
LDR      R2, [R0]

@BL   DELAY             @   пауза
@ выключим светодиод
@MOV32   R0, GPIOA_BSRR  @ адрес
@MOV32   R1, 0x08 << (1*16)   @ значение 1-размер поля, 16-во второе полуслово
@STR   R1, [R0]          @ запись R1 по адресу указанному в R0

@BL   DELAY             @   пауза

B   BLINK_LOOP         @ делаем цикл

DELAY:
MOV32   R2, 0x00100000     @ повтор цикла задержки 0x0010 0000 раз.
Delay_loop:
SUBS   R2, R2, 1
BNE   Delay_loop
BX   LR
.end
Код
Код
main.o:     file format elf32-littlearm

SYMBOL TABLE:
00000000 l    d  .text   00000000 .text
00000008 l       .text   00000000 Riset
0000003e l       .text   00000000 BLINK_LOOP
0000005c l       .text   00000000 DELAY
00000064 l       .text   00000000 Delay_loop

Dysassembly of section .text:

00000000 <Riset-0x8>:
0:   20010000    .word   0x20010000
4:   00000009    .word   0x00000009

00000008 <Riset>:
8:   4600         mov   r0, r0
a:   4600         mov   r0, r0
c:   4600         mov   r0, r0
e:   f241 0018    movw   r0, #4120   ; 0x1018
12:   f2c4 0002    movt   r0, #16386   ; 0x4002
16:   f240 0104    movw   r1, #4
1a:   f2c0 0100    movt   r1, #0
1e:   6802         ldr   r2, [r0, #0]
20:   ea41 0102    orr.w   r1, r1, r2
24:   6001         str   r1, [r0, #0]
26:   f640 0000    movw   r0, #2048   ; 0x800
2a:   f2c4 0001    movt   r0, #16385   ; 0x4001
2e:   f242 2122    movw   r1, #8738   ; 0x2222
32:   f2c2 2122    movt   r1, #8738   ; 0x2222
36:   6802         ldr   r2, [r0, #0]
38:   ea41 0102    orr.w   r1, r1, r2
3c:   6001         str   r1, [r0, #0]

0000003e <BLINK_LOOP>:
3e:   f640 0010    movw   r0, #2064   ; 0x810
42:   f2c4 0001    movt   r0, #16385   ; 0x4001
46:   f240 0108    movw   r1, #8
4a:   f2c0 0100    movt   r1, #0
4e:   6001         str   r1, [r0, #0]
50:   f640 000c    movw   r0, #2060   ; 0x80c
54:   f2c4 0001    movt   r0, #16385   ; 0x4001
58:   6802         ldr   r2, [r0, #0]
5a:   e7f0         b.n   3e <BLINK_LOOP>

0000005c <DELAY>:
5c:   f240 0200    movw   r2, #0
60:   f2c0 0210    movt   r2, #16

00000064 <Delay_loop>:
64:   3a01         subs   r2, #1
66:   d1fd         bne.n   64 <Delay_loop>
68:   4770         bx   lr
UPD
Попробовал три строчки в иаре, дабы проверить процессор. По идее то же самое что и на ASM GNU
Код ИАР
Код
    RCC->APB2ENR |= 0x04;
GPIOA->CRL = 0x22222222;
while (1)
{
GPIOA->BSRR = GPIO_BSRR_BS3;
}
Блин. Работает.
0
OVY-srok
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
08.05.2016, 18:39 16
Писать на асме очень просто, трудно писать так - чтобы эта бурда работала. Главная проблема в стыковке кода асмы и С.

Инъекция асмы с язык С происходит достаточно легко, через ассемблерные вставки we.iosyitistromyss.ru/AVR/assemblernye-vstavki-v-avr-gcc.html . Там есть явные ограничения, и стандартные правила, в случае их нарушения - GCC просто не соберёт прошивку, и точно укажет строчку с ошибкой. Это кстати опупенно полезно - видеть где ошибка.

А вот стыковка чистого ассемблера с языком С, или даже просто сборка из асмы - это всегда огромный головняк. Проблема в том что GCC может проверить только возможность выполнения самой инструкции на асме. О том что делает эта инструкция с данными - GCC насрать с высокой колокольни. В результате на чистом ассемблере можно обойти ограничения самого GCC - заметно повысив при этом производительность программы. Плата за это безобразие - ручное разгребание всех без исключения потоков данных. Это кстати очень утомительно, тут часто возникают ошибки.

В качестве примера - моя ос на асме : https://bitbucket.org/OVY-srok/rtos-cor ... ch/default
Смотрите RtoS_cortex_m3.S - код на асме, всего 42к кнопконажимательства.

И ещё, для того чтобы писать на асме, иар и кейл - тупо избыточны, у этих id очень много наворотов для С, С++, и так далее. А для асмы требуется GCC, для этого больше подходит более простой id - http://www.embtocks.org/web/downtoods-main
0
vt340
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
08.05.2016, 18:55 17
Цитата Сообщение от dork_riodir
Потом из ODR?вытаскиваю состояние через st-link. пишет 0х8, значит правильно
Надо было и из GPIOA_CRL вытащить и удивиться )
0
dork_riodir
0 / 0 / 0
Регистрация: 30.05.2010
Сообщений: 115
08.05.2016, 19:34 18
Цитата Сообщение от vt340
Цитата Сообщение от dork_riodir
Надо было и из GPIOA_CRL вытащить и удивиться )
Всё понял. Был удивлён очень сильно действительно. Я же, блин, со старым значением записываю. Блин, 3 дня просидел...
Надо как то разобраться с отладчиком... Реально ли gdb подключить к st-link? Судя по сайту martinhubosik.cz что-то там gdb отлаживает.

Всё! Поехало. Ща наоптимизирую и ,наверно, замигает. На следующих выходных буду с системой тактирования разбираться, так что не прощаюсь.

vt340, спасибо!
...могли бы и сразу сказать, где я олух был:)
0
vt340
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
08.05.2016, 19:57 19
Я не смотрел вчера ваш код, а про open-drain и ссылку на сайт сегодня просто к вчерашнему посту дописал.
Но может и к лучшему получилось - как тут кто-то недавно писал - лучше дать человеку удочку, чем рыбу )
gdb к st-link в виндовс вроде через какой-то st-link-овый сервер прикручивается или через openocd, а в линуксе и osx вроде только через openocd.
Но openocd и сам по себе продвинутый дебаггер для ассемблера, так что если через openocd, то gdb для ассемблера особо и не нужен.
А про отладку в openocd я писал уже тут как-то раз -
Кстати, вот файл для ассемблера с адресами периферийных регистров f100

[4.75 Кб]
0
otx32
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 49
10.05.2016, 11:44 20
Посмотрите мои потуги в асме для ARM, я думаю разберётесь...
Для прошивки использовалась утилитка st-flash.
[199.32 Кб]

P.S. Всё под линукс.
0
10.05.2016, 11:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2016, 11:44

Общение с барометром MS5540 на STM32 (Arduino to STM32)
Получил от китайца сей аппарат, пошел тут же гуглить что нибудь готовое, но не...

помигать светодиодом на свиче
Если замкнуть между собой любую пару в сетевом кабеле, то пакеты, которыми свич...

Помигать светодиодами
Помогите,пожалуйста ,выполнить три задания Правила форума: 5.16....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru