LINUX.ORG.RU

delay stm32f103

 ,


0

1

здрасьте здрасьте люди добрые. ну вот и ожидаемая тема с просьбой помочь разобраться в задержках для stm32f103. пытался реализовать с помощью циклов, но получается что-то уж очень не настраиваемое и время задежки очень мало. нашел что правильно делать delay нужно с помощью systick, но открыв RM в упор не вижу адресов регистро, что очень странно. нагуглил какие-то адреса

0xE000E010 ;	Systick_Control_and_Status_Register
0xE000E014 ;  	Systick_Reload_Value_Register
0xE000E018 ;    Systick_Current_Value_Register
0xE000E01C ;    Systick_Calibration_Value_Register
если я хочу чтобы светодиод вспихивал и и гас через 2сек то как правильно нужно написать и расчитать? поправте пожалуйста для начала надо в SYST_CSR в нулевой бит записать '1' и в первый бит также '1'.
адрес SYST_CSR=0xE000E010

.cpu cortex-m3
.thumb
.word 0x2000000
.wort _start

.section .text
.global _start
_start:



mov r5, =0xE000E010
mov r1, #1
str r1, [r5];  пальцем в небеса! ну пусть я попаду в нулевой бит, а как высчитать первый бит?
у меня вопрос к вам, уважаемые форумчане, вот адрес SYST_CSR=0xE000E010, как высчитать его первый, второй и последующие нужные биты? только с помощью побитовых операций? если есть другой способ и описан в документации, то пожалуйста скажите в какой именно ?



Последнее исправление: Assembler (всего исправлений: 1)
Ответ на: комментарий от COKPOWEHEU

Хотя клоун из вас не лучше

что ж коллега, ваша критика тут действительно конструктивна!

Assembler
() автор топика
Последнее исправление: Assembler (всего исправлений: 1)
Ответ на: комментарий от Assembler

никто не вечен

только не надо окружающим трепать нервы. Готовые адреса теперь можешь смотреть тут

arm-none-eabi-objdump --disassemble blinky.o > blinky.asm

знакомый адрес RCC_APB2ENR

4c: 40021018 .word 0x40021018

blinky.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <stack_pointer_value>:
   0:	20005000 	.word	0x20005000

00000004 <reset_vector>:
   4:	00000001 	.word	0x00000001

00000008 <_start>:
   8:	4910      	ldr	r1, [pc, #64]	; (4c <blink+0x4>)
   a:	6808      	ldr	r0, [r1, #0]
   c:	f440 6000 	orr.w	r0, r0, #2048	; 0x800
  10:	6008      	str	r0, [r1, #0]
  12:	490f      	ldr	r1, [pc, #60]	; (50 <blink+0x8>)
  14:	2008      	movs	r0, #8
  16:	6008      	str	r0, [r1, #0]
  18:	490e      	ldr	r1, [pc, #56]	; (54 <blink+0xc>)
  1a:	2063      	movs	r0, #99	; 0x63
  1c:	6008      	str	r0, [r1, #0]
  1e:	490e      	ldr	r1, [pc, #56]	; (58 <blink+0x10>)
  20:	2031      	movs	r0, #49	; 0x31
  22:	6008      	str	r0, [r1, #0]
  24:	490d      	ldr	r1, [pc, #52]	; (5c <blink+0x14>)
  26:	2068      	movs	r0, #104	; 0x68
  28:	6008      	str	r0, [r1, #0]
  2a:	490d      	ldr	r1, [pc, #52]	; (60 <blink+0x18>)
  2c:	f44f 4000 	mov.w	r0, #32768	; 0x8000
  30:	6008      	str	r0, [r1, #0]
  32:	490c      	ldr	r1, [pc, #48]	; (64 <blink+0x1c>)
  34:	2001      	movs	r0, #1
  36:	6008      	str	r0, [r1, #0]
  38:	490b      	ldr	r1, [pc, #44]	; (68 <blink+0x20>)
  3a:	2001      	movs	r0, #1
  3c:	6008      	str	r0, [r1, #0]
  3e:	490b      	ldr	r1, [pc, #44]	; (6c <blink+0x24>)
  40:	6808      	ldr	r0, [r1, #0]
  42:	f040 0001 	orr.w	r0, r0, #1
  46:	6008      	str	r0, [r1, #0]

00000048 <blink>:
  48:	e7fe      	b.n	48 <blink>
  4a:	0000      	.short	0x0000
  4c:	40021018 	.word	0x40021018
  50:	40012c28 	.word	0x40012c28
  54:	40012c2c 	.word	0x40012c2c
  58:	40012c34 	.word	0x40012c34
  5c:	40012c18 	.word	0x40012c18
  60:	40012c44 	.word	0x40012c44
  64:	40012c20 	.word	0x40012c20
  68:	40012c00 	.word	0x40012c00
  6c:	40012c14 	.word	0x40012c14
anonymous
()
Ответ на: комментарий от anonymous

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

Assembler
() автор топика
Ответ на: комментарий от COKPOWEHEU

клоун из вас

блин! только сейчас доходит, что клоун на велосепеде круче чем клоун на осле. я вам проигрываю! это факт.

Assembler
() автор топика
Последнее исправление: Assembler (всего исправлений: 1)

Возьми libopencm3. Сначала пару дней повникаешь, потом сразу сделаешь, что надо.

CYB3R ★★★★★
()
Ответ на: комментарий от anonymous

А уж битовую арифметику можно за вечер освоить на уровне включить/выключить бит, что ее бояться…?

Кстати, удваиваю. ТС, анонимус тебе хороший, правильный совет дал, прислушайся. Даже если вдруг у тебя на это не один вечер уйдёт, а 3-4, оно себя потом оправдает.

hobbit ★★★★★
()
Ответ на: комментарий от Assembler

вы же умом понимаете, что если я не программист, то как я могу что-то написать?

Если вы не хотите писать код, зачем создаете эти темы и требуете чтобы за вас постоянно что-то делали?

но и даете всячески это понять и мне, что я не имею необходимых качеств и свойств, чтобы быть программистом.

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

я согласился с вашими словами и смирился с тем что не способен что-то написать или списать, что не пишу и не напишу. выходит что вы обвиняете не меня, а себя!

Как я могу обвинять себя в том, что вы приписываете мне неведомо что? Я никогда никого не обвинял в неспособности программировать. Наоборот, именно из предположения что писать и считать может научиться любой, я стараюсь всячески помочь. В том числе пытаюсь заставить думать, а не тупо копипастить.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

блин, малец пытается понять как это устроено, а вы ему головомойку тут затеяли.

думается сейчас современные контрошки сложноваты для совсем зеленых, начинать надо с чего попроще, раз уж смысл - понять как управлять контроллером на асме

Morin ★★★★★
()
Последнее исправление: Morin (всего исправлений: 1)
Ответ на: комментарий от Morin

блин, малец пытается понять как это устроено, а вы ему головомойку тут затеяли.

Больше похоже что пытается списать какую-то лабораторку. Если бы пытался понять, читал бы литературу и экспериментировал.

думается сейчас современные контрошки сложноваты для совсем зеленых, начинать надо с чего попроще, раз уж смысл - понять как управлять контроллером на асме

Я тоже всегда это пропагандирую. Начинать нужно с более простых контроллеров - AVR, PIC, x51, возможно еще каких-то подобных. Разумеется, на ассемблере. Понять как это работает, прочувствовать, что там нет никакой магии, что контроллер делает именно то, что ему говорят. Потом Си, потом более мощные контроллеры.

А то нас на первом курсе пытались научить ассемблеру х86, сейчас студентов тому же учат. Он же сложный и уже к ОС привязанный! Написать на нем что-то с нуля сложно. И хуже всего, что даже после этого он остается магией. Да в общем-то и является, учитывая оптимизации, ковейер и микрокод. Хотите показать учащимся как устроен вычислитель - расскажите про цифровую электронику и 8-битные контроллеры.

COKPOWEHEU
()
Ответ на: комментарий от aiqu6Ait

работать без HAL-а неправильно. Разбирайся с Си и HAL STM, хотя бы с кодгенератором CubeMX

Это вы так пытаетесь конкурентов устранять что ли? Так не выйдет. Во-первых я уже говорил, что профессионально контроллерами не занимаюсь, а значит не конкурент. А во-вторых, я прекрасно знаю к чему приводит ваш ардуино-подход.

COKPOWEHEU
()
Ответ на: комментарий от aiqu6Ait

Начинать нужно с более простых контроллеров - AVR, PIC, x51

И в чём, по-твоему, принципиальная разница? Чем это, скажем, AVR-5 проще Кортекса-М3? По-моему так наоборот — на 32-битной архитектуре всё намного проще, чем на 8-битной, на которой ещё и с фьюзами иногда надо поприседать.

Ассемблер у всех плюс-минус одинаковой простоты.

anonymous
()
Ответ на: комментарий от anonymous

В том, что сам контроллер гораздо проще устроен. Никакой возни с тактированием, с десятком регистров для простого действия. В случае AVR (про другие сказать ничего не могу - не имел с ними дела) отличная документация, в том числе на русском - Евстифеев. Естественно, куча учебников и статей - те же ДиХалт, Ревич.

Да начать хоть с работы с портами. В AVR это один бит на настройку и один на управление. Номера битов соответствуют номерам портов. В STM32 это 4 бита на настройку (причем расположенных по-разному в разных контроллерах) и 1-4 бита на управление. Вон Ассемблер через bitband управлять пытается. Понятно, что нормальные люди так делать не будут, у них только ODR и BSRR, но все же.

Минимальный код: в STM нужно, пусть и немного, но магии с указателем стека и расположением по адресу 0x0800’0000, в AVR просто пишешь с начала инструкцию за инструкцией.

Адреса периферии: 32 бита, точное значение которых еще надо найти против 6-8 бит, которые прописаны явно.

на которой ещё и с фьюзами

Фьюзы да, проблема. Но никто не мешает по началу тактироваться от встроенного генератора на 1 МГц. А для экспериментов собрать фьюз-доктор.

COKPOWEHEU
()
Ответ на: комментарий от anonymous

То, что вектор ресета указывает на инициализационное значение стека, а не на _start. Должна быть не единичка, а девяточка. Ладно если значения в таблице векторов интерпретируются как мовы или нопы. А если бранчи? Как ты можешь быть в этом уверен?

anonymous
()
Ответ на: комментарий от COKPOWEHEU

Адрес начала, наверное. Флешка не с 0 начинается, а с 0x0800’0000

Если ты загружаешься с флешки, то она мапится на 0.

anonymous
()
Ответ на: комментарий от anonymous

Если ты загружаешься с флешки, то она мапится на 0.

Но при прошивке-то нет

COKPOWEHEU
()
Ответ на: комментарий от anonymous

Должна быть не единичка, а девяточка.

Там был лог дизассемблера объектного файла до линковки, вот после линковки

arm-none-eabi-objdump -d blinky.elf

blinky.elf:     file format elf32-littlearm


Disassembly of section .text:

08000000 <stack_pointer_value>:
 8000000:	20005000 	.word	0x20005000

08000004 <reset_vector>:
 8000004:	08000009 	.word	0x08000009

08000008 <_start>:
 8000008:	4910      	ldr	r1, [pc, #64]	; (800004c <blink+0x4>)
 800000a:	6808      	ldr	r0, [r1, #0]
 800000c:	f440 6000 	orr.w	r0, r0, #2048	; 0x800
 8000010:	6008      	str	r0, [r1, #0]
 8000012:	490f      	ldr	r1, [pc, #60]	; (8000050 <blink+0x8>)
 8000014:	2008      	movs	r0, #8
 8000016:	6008      	str	r0, [r1, #0]
 8000018:	490e      	ldr	r1, [pc, #56]	; (8000054 <blink+0xc>)
 800001a:	2063      	movs	r0, #99	; 0x63
 800001c:	6008      	str	r0, [r1, #0]
 800001e:	490e      	ldr	r1, [pc, #56]	; (8000058 <blink+0x10>)
 8000020:	2031      	movs	r0, #49	; 0x31
 8000022:	6008      	str	r0, [r1, #0]
 8000024:	490d      	ldr	r1, [pc, #52]	; (800005c <blink+0x14>)
 8000026:	2068      	movs	r0, #104	; 0x68
 8000028:	6008      	str	r0, [r1, #0]
 800002a:	490d      	ldr	r1, [pc, #52]	; (8000060 <blink+0x18>)
 800002c:	f44f 4000 	mov.w	r0, #32768	; 0x8000
 8000030:	6008      	str	r0, [r1, #0]
 8000032:	490c      	ldr	r1, [pc, #48]	; (8000064 <blink+0x1c>)
 8000034:	2001      	movs	r0, #1
 8000036:	6008      	str	r0, [r1, #0]
 8000038:	490b      	ldr	r1, [pc, #44]	; (8000068 <blink+0x20>)
 800003a:	2001      	movs	r0, #1
 800003c:	6008      	str	r0, [r1, #0]
 800003e:	490b      	ldr	r1, [pc, #44]	; (800006c <blink+0x24>)
 8000040:	6808      	ldr	r0, [r1, #0]
 8000042:	f040 0001 	orr.w	r0, r0, #1
 8000046:	6008      	str	r0, [r1, #0]

08000048 <blink>:
 8000048:	e7fe      	b.n	8000048 <blink>
 800004a:	0000      	.short	0x0000
 800004c:	40021018 	.word	0x40021018
 8000050:	40012c28 	.word	0x40012c28
 8000054:	40012c2c 	.word	0x40012c2c
 8000058:	40012c34 	.word	0x40012c34
 800005c:	40012c18 	.word	0x40012c18
 8000060:	40012c44 	.word	0x40012c44
 8000064:	40012c20 	.word	0x40012c20
 8000068:	40012c00 	.word	0x40012c00
 800006c:	40012c14 	.word	0x40012c14
anonymous
()
Ответ на: комментарий от COKPOWEHEU

Никакой возни с тактированием

Так не возись. Тебя никто не заставляет. На АВР-ах, даже на тиньках тоже можно повозиться, там и PLL тоже бывает и фьюзы под разные кварцы.

отличная документация

Ну это да. Но это же не достоинство архитектуры.

Да начать хоть с работы с портами.

Ну и что там сложного? Всё описано на трёх страницах RM с картинками. Так же как и у АВР. А вот хотя бы сложить два 32-битных числа на восьмибитке — уже надо скилуху.

в AVR просто пишешь с начала инструкцию за инструкцией

Ага. И потом, когда ничего не будет работать, понимаешь, что забыл инициализировать стек. Не во всех АВР его контроллер сам инициализирует, частенько там по дефолту лежит голый ноль.

никто не мешает по началу тактироваться от встроенного генератора на 1 МГц

На СТМ-ках тебе точно так же никто не мешает тактироваться без вообще каких-либо настроек от HSI.

anonymous
()
Ответ на: комментарий от anonymous

Так не возись. Тебя никто не заставляет. На АВР-ах, даже на тиньках тоже можно повозиться, там и PLL тоже бывает и фьюзы под разные кварцы.

Вот именно что на AVR возиться с тактированием не обязательно. А на STM уж как минимум подать его на периферию придется.

Ну это да. Но это же не достоинство архитектуры.

Это достоинство существующей в настоящий момент экосистемы. А архитектура у AVR гораздо проще и примитивнее, с этим никто не спорит. Для многих задач она подходит хуже просто потому что настроек и режимов меньше. Но для первого знакомства именно это - огромный плюс.

Ну и что там сложного? Всё описано на трёх страницах RM с картинками. Так же как и у АВР. А вот хотя бы сложить два 32-битных числа на восьмибитке — уже надо скилуху.

Ну и как же записать настройку того же PC13 в голубой пилюле на «обычный выход» чтобы помигать светодиодом? Получается либо вырвиглазие как в HAL, где заполняется специальная структура, либо еще большее вырвиглазие с GPIO_CRH_MODE13_0, GPIO_CRH_MODE13_1, GPIO_CRH_CNF13_0, GPIO_CRH_CNF13_1. Даже человеко-читаемая запись вроде (GPIO_PP_50MHz << ((13-8)*4)) нуждается в комментариях.

Сравните с DDRB |= (1<<4);

Ага. И потом, когда ничего не будет работать, понимаешь, что забыл инициализировать стек. Не во всех АВР его контроллер сам инициализирует, частенько там по дефолту лежит голый ноль.

Это «когда» наступит когда человек дойдет до подпрограмм или прерываний. К тому времени он либо про стек прочитает, либо наткнется на волшебную комбинацию

ldi temp, low(RAMEND)
out SPL, temp
ldi temp, high(RAMEND)
out SPH, temp

Вот она во всех учебниках по ассемблеру встречается. И, обратите внимание, явная инициализация стека лучше способствует пониманию, чем неявная как в STM.

На СТМ-ках тебе точно так же никто не мешает тактироваться без вообще каких-либо настроек от HSI.

Подачу тактирования на периферию это не отменяет.

COKPOWEHEU
()
Ответ на: комментарий от izzholtik

Да что вы на bitband взъелись, прикольная же штука

Сама по себе да. Но для Ассемблера учить ее сейчас все равно что учить алгоритмы быстрого умножения, не умея складывать на пальцах.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

явная инициализация стека лучше способствует пониманию, чем неявная как в STM

в обоих случаях явная - по-разному инициализируется. AVR был когда-то прикольный только потому лучше другого старья с регистром-аккумулятором и страничной памятью для С подходил

anonymous
()
Ответ на: комментарий от anonymous

в обоих случаях явная

В минимальном коде для stm - не явная. Там ведь нет инструкции записи в sp. Ну есть какое-то чиселко, которое зачем-то пишут перед адресом ресета.

AVR был когда-то прикольный только потому лучше другого старья с регистром-аккумулятором и страничной памятью для С подходил

А сейчас подходит для обучения. Не пугать людей 32-битными регистрами с кучей ненужных полей.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

Там ведь нет инструкции записи в sp. Ну есть какое-то чиселко, которое зачем-то пишут перед адресом ресета

ты просто не понимаешь что такое инициализация стека - у STM его надо явно инициализировать, у AVR тоже, у PIC - нет

The PIC stack is a dedicated bank of registers (separate from programmer-accessible registers) that can only be used to store return addresses during a function call (or interrupt). 

https://en.wikibooks.org/wiki/Embedded_Systems/PIC_Microcontroller#The_PIC_Stack

anonymous
()
Ответ на: комментарий от COKPOWEHEU

вырвиглазие

Так это тоже не проблема архитектуры. Пиши на асме.

Сравните с DDRB |= (1<<4);

Сравни:

CONFIGURE_PIN (GPIOC, 13, O_OPEN_DRAIN);
anonymous
()
Ответ на: комментарий от anonymous

вырвиглазие

Так это тоже не проблема архитектуры. Пиши на асме.

CONFIGURE_PIN (GPIOC, 13, O_OPEN_DRAIN);

Отличный пример кода на асме. А если серьезно, то на асме подобное получится еще менее читаемо, чем на Си.

CONFIGURE_PIN (GPIOC, 13, O_OPEN_DRAIN);

То есть вот это вы считаете хорошим кодом для объяснения как работают порты и какие регистры за них отвечают?

Для использования - вопросов нет, отличный вариант. Но для обучения регистров в нем не видно.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

То есть вот это вы считаете хорошим кодом для объяснения как работают порты и какие регистры за них отвечают?

Конечно.

Ведь GPIOC — в CMSIS определён как ((GPIO_TypeDef *)GPIOC_BASE), а GPIOC_BASE — как (APB2PERIPH_BASE + 0x00001000UL), а APB2PERIPH_BASE — как (PERIPH_BASE + 0x00010000UL), а PERIPH_BASE — как 0x40000000UL. В то же время, структура GPIO_TypeDef определена как 7 32-битных полей, первые два из которых — CRL и CRH. Таким образом, значение GPIOC соответствует адресу регистра CRL, а (uint32_t*)GPIOC + 1 — адресу CRH. То есть вполне себе можно рассматривать GPIOC как адрес одного 64-битного регистра для настройки всех пинов порта C.

Вот. Заодно разобрались не только в регистрах, но и в том как устроена библиотека CMSIS. Разве это не прекрасно?

anonymous
()
Ответ на: комментарий от anonymous

Конечно.

Вот сами же видите сколько текста пришлось написать для такого простого действия. И это вы еще к битовым маскам не подошли, а они у новичков вызывают еще большие проблемы.

COKPOWEHEU
()
Последнее исправление: COKPOWEHEU (всего исправлений: 1)
Ответ на: комментарий от aiqu6Ait

х51 действительно проще STM32

Регистров, если я правильно помню, в с51 — четыре банка по 7 штук, при том, что часть из них используется только по косвенной адресации. Стек, там, вроде, только в основной памяти может быть, которой с гулькин нос и эта же память мапится на регистры. Плюс туда же ещё и «бит-банд» с, если опять же правильно помню, отдельными инструкциями доступа к отдельным битам. Но асм там да, не сложный. Так и в Кортекс-М3 он простой, если без флоатов и векторных расширений. И регистры общего назначения тут все с прямым доступом. Опять же не надо загружать адрес через 8-битные половинки. В Кортексах при входе в прерывание помимо адреса возврата автоматам пушатся r0-r3, lr, PSR — это же просто чудесно! А lr при входе в leaf-функции вообще позволяет обходиться без пушей. Не знаю. Мне нравится.

anonymous
()
Ответ на: комментарий от anonymous

Тут ведь все зависит от постановки задачи. Если есть задача разобраться с контроллерами и ASM, то надо брать 8051. Они просты и доступны, диодами мигают, да я на них даже логарифмы считал.

Если надо писать рабочий код - тогда нужен С, возможно со вставками, HAL и прочие ништяки, выбор платформы продиктован задачей.

aiqu6Ait ★★★★
()
Последнее исправление: aiqu6Ait (всего исправлений: 1)
Ответ на: комментарий от aiqu6Ait

Если есть задача разобраться с контроллерами и ASM, то надо брать 8051

Или AVR, или PIC, или любые другие простые контроллеры. Просто лично я работал только с AVR, а потом STM32 и RISC-V, поэтому про х51 или PIC мало что могу сказать. Хотя если, как Анонимус говорит, там память поделена на банки - это им в минус.

Если надо писать рабочий код - тогда нужен С

Конечно. Выбрать достаточно мощный контроллер (может, даже 8-битку если задача позволяет) и писать на Си. Критичные места - Асм.

Ну а всякие Ардуины, включая HAL, только если уж совсем со сроками плохо и пониманием, что ЭТО потом придется поддерживать.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

а не тупо копипастить.

ты в своем уме? где я копипастил? я объяснил почему пример лучше 1000 слов, особенно когда их говорят или пишут вот такие как ты.

я стараюсь всячески помочь

от тебя ничего не надо. ты свободен.

Assembler
() автор топика
Ответ на: комментарий от anonymous

8000000: 20005000 .word 0x20005000

в умных статьях пишут что MK начинает читать программу с адреса

0x08000000
по словам некоторых людей по адресу 0x08000000 первое что считывается, это SP. вы пытались это сделать руками? это работает? или это только предположение?

Assembler
() автор топика
Последнее исправление: Assembler (всего исправлений: 1)
Ответ на: комментарий от COKPOWEHEU

0x0800’0000

это адрес первой страницы памяти.

скажите спасибо, что я создаю эти темы. а то так бы и думали, что это адрес флешки.

Assembler
() автор топика
Ответ на: комментарий от Assembler

0x0800’0000

это адрес первой страницы памяти.

скажите спасибо, что я создаю эти темы. а то так бы и думали, что это адрес флешки.

Вы можете сформулировать свою мысль по-человечески? А то я ничего не понял.

0x0800’0000 это адрес начала флеш-памяти в контроллере, туда записывается прошивка и оттуда же обычно начинается выполнение. Хотя ногами boot0, boot1 можно это изменить: начать выполнение из оперативки с адреса 0x2000’0000 или из самозагрузчика (вот его адрес я наизусть не помню, да и не нужен он).

Что вы понимаете под «страницей памяти» неизвестно. Скорее всего, просто услышали новое слово и пытаетесь выпендриться. Но как обычно садитесь в лужу.

На самом деле флеш-память действительно разделена на страницы, но важно это только при ее перезаписи. Для чтения это просто набор байтов.

COKPOWEHEU
()
Ответ на: комментарий от anonymous

Там был лог дизассемблера объектного файла до линковки, вот после линковки

arm-none-eabi-objdump -d blinky.elf

Жаль отладочную информацию не добавили, было бы проще читать.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

Вы можете сформулировать свою мысль по-человечески?

нет. только

вав! вав! ррр
вы так сами выбрали.
0x0800’0000
это не физический адрес.

вы такой утырок! всем кричите, что я меркантильный, и пытаюсь извлечь выгоду из добрых форумчан. но сами сутками в моих темах заполняете огромные пробелы в своих знаниях. эти темы нужны даже не столько мне, сколько всем вам. не знаю даже кто из нас меркантильный. вот так и становятся людьми! и насчиту у них ни одной темы с вопросами. и потом они городо бьют себя в грудь, заявляя, что никогда ни о чем не спрашивали на форуме, что всего добились сами читая маны! а на деле сидят в темах вот таких бедолаг, которые слезно молят помочь знающих людей и научить их программировать для себя. тут есть о чем подумать.

Assembler
() автор топика
Ответ на: комментарий от COKPOWEHEU

Жаль отладочную информацию не добавили, было бы проще читать.

после препроцессора сишных именованных констант уже нет - что там в отладочной инфе хотите увидеть. Исходник - это переписаный 1:1 на асме

delay stm32f103 (комментарий)

код на с

delay stm32f103 (комментарий)

anonymous
()
Ответ на: комментарий от Assembler

это не физический адрес.

Вы хотите сказать, что начали разбираться что такое отображение чего-то на память? Похвально, конечно, только не надо это выдавать за невероятное достижение.

На адрес 0x0800’0000 отображается начало флешки, на 0x2000’0000 оперативка и т.д. Если вам будет проще, считайте это точками монтирования, как в файловой системе.

Или вы раньше думали, что все 4 ГБ памяти физически присутствуют в контроллере?!

но сами сутками в моих темах заполняете огромные пробелы в своих знаниях

Например какие?

Только пожалуйста, не надо опять врать будто я тут узнал что-то важное. Bitband разве что, но важным его никак не назовешь. Да, и чтобы соблазна врать было поменьше, напоминаю, что куча моих наработок уже выложена на всеобщее обозрение.

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

Тех, кто хочет научиться программировать, всячески поддерживают. А над такими как вы и поиздеваться не грех

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

Тех, кто хочет научиться программировать, всячески поддерживают.

банам?

Assembler
() автор топика
Ответ на: комментарий от COKPOWEHEU

куча моих наработок уже выложена на всеобщее обозрение.

как статья в которой написано, что в адрес

 0x0800’0000
помещается адрес
0x20005000
?

Assembler
() автор топика
Последнее исправление: Assembler (всего исправлений: 1)
Ответ на: комментарий от anonymous

после препроцессора сишных именованных констант уже нет

Как это нет

#include "stm32f10x.h"

#define StackTop  ((uint32_t)(0x20000000 + 20*1024))
#define LED_Y B,5,1,GPIO_PP50
#define LED_G B,6,1,GPIO_PP50
#define LED_R B,7,1,GPIO_PP50

#define GPIO_PP50 0b0011
static void reset(void);

__attribute__((used,section(".isr_vector")))
void (*const interrupt_vectors[])(void) = {
  (void*)StackTop, // Указатель на начало стека.
  reset    // Функция выполняемая при сбросе МК.
};

static void reset(void){
  RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
  //GPIO_config(LED_G);
  GPIOB->CRL = (GPIO_PP50 << ((6-0)*4));
  
  while(1){
    //GPO_T(LED_G);
    GPIOB->ODR ^= (1<<6);
    for(uint32_t i=0; i<1000000; i++){asm("");}
  }
}

$ arm-none-eabi-gcc main.c -nostartfiles -mthumb -mcpu=cortex-m3 -Os -g2 -DSTM32F10X_MD -Tstm32f103c8_flash.ld -Icmsis/include/core -Icmsis/include -o main.elf

$ arm-none-eabi-objdump -S main.elf 

main.elf:     file format elf32-littlearm


Disassembly of section .text:

08000000 <interrupt_vectors>:
 8000000:       00 50 00 20 09 00 00 08                             .P. ....

08000008 <reset>:
  (void*)StackTop, // Указатель на начало стека.
  reset    // Функция выполняемая при сбросе МК.
};

static void reset(void){
  RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
 8000008:       4a08            ldr     r2, [pc, #32]   ; (800002c <reset+0x24>)
 800000a:       6993            ldr     r3, [r2, #24]
 800000c:       f043 0308       orr.w   r3, r3, #8
 8000010:       6193            str     r3, [r2, #24]
  //GPIO_config(LED_G);
  GPIOB->CRL = (GPIO_PP50 << ((6-0)*4));
 8000012:       f04f 7240       mov.w   r2, #50331648   ; 0x3000000
 8000016:       4b06            ldr     r3, [pc, #24]   ; (8000030 <reset+0x28>)
 8000018:       601a            str     r2, [r3, #0]
  
  while(1){
    //GPO_T(LED_G);
    GPIOB->ODR ^= (1<<6);
 800001a:       68da            ldr     r2, [r3, #12]
 800001c:       f082 0240       eor.w   r2, r2, #64     ; 0x40
 8000020:       60da            str     r2, [r3, #12]
 8000022:       4a04            ldr     r2, [pc, #16]   ; (8000034 <reset+0x2c>)
    for(uint32_t i=0; i<1000000; i++){asm("");}
 8000024:       3a01            subs    r2, #1
 8000026:       d1fd            bne.n   8000024 <reset+0x1c>
 8000028:       e7f7            b.n     800001a <reset+0x12>
 800002a:       bf00            nop
 800002c:       40021000        .word   0x40021000
 8000030:       40010c00        .word   0x40010c00
 8000034:       000f4240        .word   0x000f4240

Это код blinky в 56 байт. Все комментарии на месте

COKPOWEHEU
()
Ответ на: комментарий от Assembler

как статья в которой написано, что в адрес

0x0800’0000

помещается адрес

0x20005000

?

Что за статья? Как у вас адрес помещается в адрес? Почитайте уже про таблицу векторов прерываний и ее структуру.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

А над такими как вы и поиздеваться не грех

Боже, да что ты такое пишешь-то? Тебе это удовольствие доставляет? Чтоб твоих детей так учили.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.