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)
Ответ на: комментарий от aiqu6Ait

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

ок. для меня MK-темный лес. ну раз уж залез, то пытаюсь понять, как же можно с помощью прерываний сделать чтобы светодиод мигал через 2 сек?

на ассемблере по религиозным причинам пишите или по идеологическим?

а какие альтернативы? CИ? очень сложный. я не осилю его макросы длиной в 20 символов. все эти библиотеки для настоящих спецов. я же простой клоун.

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

а какие альтернативы? CИ? очень сложный. я не осилю его макросы длиной в 20 символов

D попроще, как раз зарелизились увидев твои темы форуме

Мини-версия рантайма для программирования микроконтроллеров на D

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

а какие альтернативы? CИ? очень сложный. я не осилю его макросы длиной в 20 символов. все эти библиотеки для настоящих спецов. я же простой клоун.

Побаиваться сишечку, но при этом быть уверенным что с ассемблером все хорошо сложится - это надо быть очень большим оптимистом. Обычно от недостатка информации.

Вариант 1.

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

Вариант 2.

Возьмите Arduino. С точки зрения «нормального» программиста это лютый шлак, но для примитивных задач типа мигания светодиодиком - самое то. Порог вхождения очень низкий. Учиться программированию на нем не советую, а вот по-быстрому наговнякать, не вникая - сойдет.

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

Побаиваться сишечку, но при этом быть уверенным что с ассемблером все хорошо сложится - это надо быть очень большим оптимистом. Обычно от недостатка информации.

Автор просто не умеет работать с чужими наработками, он надеется как макака перебором попасть в нужный бит и что оно заработает (спойлер для автора: ничего не получится).

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

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

Ты еще веришь в автора после десятой темы с тупняком? Ты их вообще читал? Похоже, что нет.

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

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

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

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

Это не бегинер. Это или тролль, или тормоз с отклонениями, который никого не слушает и ничему не учится. Метапрогов с лизами мало? Да и те хоть как-то прогрессируют по сравнению…

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

Мне без разницы какие ты для себя отмазки придумываешь. Это конечно твое дело, как развлекаться, но поскольку ты написал почему-то мне, то мое мнение тут.

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

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

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

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

Для меня в свое время были абсолютно не очевидны. Наоборот, очевидным было (да и остается) начало с нуля, с регистров. Да, шаблон без HAL’а пришлось поискать.

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

или тормоз с отклонениями

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

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

Будет ли кто-то помогать ученику в автошколе, который спустя год путает педали и говорит, что дорожные знаки не нужны и можно обойтись в городе без них? Особенно, если он подтрунивает на нормальными советчиками и восхваляет гонщика, который зажигает светодиод в 30 байт кода. Хоть бы книжку почитал, что ли. Их для STM32 небось чуть более, чем одна.

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

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

разве это повод, чтобы не помогать ему(мне) в изучении stm32?

Так вы же не пытаетесь изучать контроллер. Сколько раз вам говорили не гоняться за bitband? Это уход в сторону, который никак не продвинет вас в обучении. Сколько раз вам говорили использовать именованные константы вместо магических чисел.

Когда все советы игнорируются, желание помогать как-то пропадает.

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

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

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

что-то совсем не в тему.

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

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

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

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

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

Когда все советы игнорируются

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

аргументировать почему он им не воспользуется

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

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

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

Может тебе еще денег на карту перевести? Зуммеры привыкли, что им все вокруг что-то должны.

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

читай чужой код

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

 вав, вав! рррр! вав, вав!
[/cod]
собственно иногда так и происходит. но я прошу: господа! давайте говорить правильно! напишите лучше пример.

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

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

Здесь никому не интересно моргать светодиодами на асме, прости. Время потратится, а толку никакого.

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

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

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

И сравните с тем, что получили вы: вместо рандомных ссылок нормальные материалы по теме. Вместо помощи на заведомо сложном или неверном пути указание нескольких более простых и перспективных.

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

Разумеется, нет!

Это было бы верно если код содержит какие-то неочевидные грабли и написать его из головы сложно, а готовые решения найти сложно. Это относится к изначальному шаблону кода с makefile’ом, startup’ом и т.д. Но вы же не это запрашиваете, а ШИМ, который является отличным антипримером: его несложно написать по даташиту, и готовых примеров кода завались.

аргументируют, чтобы убедить, переубедить.

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

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

Зуммеры привыкли, что им все вокруг что-то должны.

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

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

Разве я хоть раз интересовался твоим мнением? Ты мне не интересен и не полезен.

Взаимно.

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

Время потратится

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

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

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

Это ты своими ужимками с «умными», «пару строк кода», «вы не с этого форума» пытаешься выклянчать готовое решение?

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

Это ты своими ужимками с «умными»

cчитал бы иначе, меня бы уже давно тут небыло. в жизни хватает дураков, как я сам. зачем бы мне еще на форуме с ними общаться?

«пару строк кода»

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

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

Посмотри другие темы в разделе Development. Там кодом общаются. Видимо, дело в тебе. Подумай, почему именно тебе (больше) не хотят помогать.

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

Ты за все это время уже 10 раз бы разобрался с ШИМ вместо постинга.

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

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

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

Так правильнее будет.

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

Подумай, почему именно тебе (больше) не хотят помогать.

покажи пожалуйста тему , где мне реально помогали? кроме той, где Anonymous и пара человек написали и кинули бинарник, чтобы проверить контроллер. восновном ЗАБАНЬСЯ ДЕБИЛ. и так все время. Может дело не во мне? может я просто выдаю назад то что в меня насрали? так что идите мимо, если вам сложно писать на ассемблере.

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

собаки общаются лаем, кошки мяуканием, а программисты общаются кодами

тебе сто раз сказали - не связывайся с bit band, только усложнит понимание а ты всё равно на нём делаешь - кому охота считать эти дурацие адреса за тебя ? В асме можно сишные именованные константы использовать, libopencm3 навскидку ближе всего что подойдёт. Скачай её и распакуй

wget https://github.com/libopencm3/libopencm3/archive/refs/heads/master.zip`
unzip master.zip

убери всё ненужное в хидерах для твоего камня

cd libopencm3-master/include/libopencm3/stm32/f1/
for f in *.h; do grep "#define" $f | sed 's/MMIO8\|MMIO16\|MMIO32//' > $(basename $f .h).inc; done

это создаст копии хидеров .h но без сишного кода и с расширением .inc

Пример использования - включение тактирования port C

blinky.S

.syntax unified
.cpu cortex-m3
.thumb
.global _start

#include <libopencm3/stm32/f1/memorymap.inc>
#include <libopencm3/stm32/f1/rcc.inc>

.text
    stack_pointer_value:    .word   0x20005000
    reset_vector:           .word   _start + 1

    _start:
        ldr    r1, =RCC_APB2ENR
        ldr    r0, [r1]
        orr    r0, r0, #RCC_APB2ENR_IOPCEN
        str    r0, [r1]

blink:
        b blink

сборка как раньше, только через препроцессор пропустить перед сборкой

$ cpp -I ./libopencm3-master/include -x assembler-with-cpp blinky.S -o blinky.s

$ arm-none-eabi-as blinky.s -o blinky.o
$ arm-none-eabi-ld blinky.o -Ttext=0x08000000 -o blinky.elf
$ arm-none-eabi-objcopy -O binary blinky.elf blinky.bin
anonymous
()
Ответ на: комментарий от COKPOWEHEU

а могут только списывать

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

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

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

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

спасибо. но щас уже не нужно наверное

Ты напряг людей и перегорел всего за 6 часов? Школьник?

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

перегорел всего за 6 часов?

нет. просто я решил изучать для себя без библиотек, IDE и прочего.

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

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

я по определению не могу списывать, потому что ничего не пишу

То есть вы сейчас официально признали, что вся помощь, которую вам оказывали и могут оказать в дальнейшем, пропадет впустую. Раз писать код вы и не думаете.

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

нет. просто я решил изучать для себя без библиотек, IDE и прочего.

Библиотеки с готовым кодом это одно - для понимания алгоритмов полезно переписать это руками.

Но переписывать адреса?! Чему на этом можно научиться? Скорости печати?

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

нет. просто я решил изучать для себя без библиотек, IDE и прочего.

Ну изучай. Форумчанам не интересно, что ты там для себя делаешь. Потому что отдачи для них никакой.

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

уважаемый Эдуард выше посоветовал ШИМ

ты просто ещё не понял что чем дальше в лес тем толще палки - ты помрёшь всё вручную считать. Делаешь хидеры для таймера

cd libopencm3-master/include/libopencm3/stm32/common
for f in *.h; do grep "#define" $f | sed 's/MMIO8\|MMIO16\|MMIO32//' > $(basename $f .h).inc; done

берёшь код эдека и переписываешь на асме

.syntax unified
.cpu cortex-m3
.thumb
.global _start

#include <libopencm3/stm32/f1/memorymap.inc>
#include <libopencm3/stm32/f1/rcc.inc>
#include <libopencm3/stm32/common/timer_common_all.inc>

.text
    stack_pointer_value:    .word   0x20005000
    reset_vector:           .word   _start + 1
    
    _start:
@ RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; // enable TIM1 clocking
	ldr    r1, =RCC_APB2ENR
	ldr    r0, [r1]
	orr    r0, r0, #RCC_APB2ENR_TIM1EN
	str    r0, [r1]

@ TIM1->PSC = 8;  // 8MHz
	ldr    r1, =TIM1_PSC
	ldr    r0, =8
	str    r0, [r1]

@ TIM1->ARR = 99; // 100 ticks for 80kHz
	ldr    r1, =TIM1_ARR
	ldr    r0, =99
	str    r0, [r1]

@ TIM1->CCR1 = 49; // 50%
	ldr    r1, =TIM1_CCR1
	ldr    r0, =49
	str    r0, [r1]

@ TIM1->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE;
	ldr    r1, =TIM1_CCMR1
	ldr    r0, =(TIM_CCMR1_OC1M_PWM1 | TIM_CCMR1_OC1PE)
	str    r0, [r1]

@ TIM1->BDTR = TIM_BDTR_MOE;
	ldr    r1, =TIM1_BDTR
	ldr    r0, =TIM_BDTR_MOE
	str    r0, [r1]

@ TIM1->CCER = TIM_CCER_CC1E;
	ldr    r1, =TIM1_CCER
	ldr    r0, =TIM_CCER_CC1E
	str    r0, [r1]

@ TIM1->CR1 = TIM_CR1_CEN;
	ldr    r1, =TIM1_CR1
	ldr    r0, =TIM_CR1_CEN
	str    r0, [r1]

@ TIM1->EGR |= TIM_EGR_UG;  // generate update event to refresh all
	ldr    r1, =TIM1_EGR
	ldr    r0, [r1]
	orr    r0, r0, #TIM_EGR_UG
	str    r0, [r1]

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

могут оказать в дальнейшем, пропадет впустую.

о чем вы говорите? может слова этого человека будут более доходчивыми до вас

Подумай, почему именно тебе (больше) не хотят помогать.

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

вы сейчас официально признали

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

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

>ты помрёшь никто не вечен) за код на ассемблере спасибо. иногда думаю, что это произведение искусства. хотя некоторое считают это ремеслом.

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

вы сейчас официально признали

что именно? что я не программист?

Я же цитировал - что вы ничего не пишете и не собираетесь писать код.

я не программист. и не буду вам конкурентом в области программирования МК

Разумеется, хотя бы потому что для меня это всего лишь хобби.

вам как моему коллеге-клоуну,

Не волнуйтесь, в этом я вам не конкурент. Хотя клоун из вас не лучше, чем программист. Старайтесь лучше.

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

Хотя клоун из вас не лучше, чем программист.

я вот не понимаю, о чем вы думаете, в таком случае, когда говорите

писать код вы и не думаете.

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

Assembler
() автор топика
Ответ на: комментарий от 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)
Ответ на: комментарий от 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
()
Ответ на: комментарий от COKPOWEHEU

Как это нет

у вас очень много общего с TC - вы даже не пытаетесь что-то читать, это кстати характерно для людей старшего возраста. Ещё раз - это код на asm скоампилированный и дизассемблированный, зачем вы мне приводите пример на С. Вот так собирается

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

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

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

А с этим я не согласен. Проект должен быть сделан слоями, слои отдельно тестироваться. Тогда HAL можно переносить от одного изделия на следующее, занимаясь только логикой.

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

Как у вас адрес помещается в адрес?

это не у меня, а у автора ссылку на которого вы дали!

Почитайте уже про таблицу векторов прерываний и ее структуру.

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

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

А с этим я не согласен. Проект должен быть сделан слоями, слои отдельно тестироваться. Тогда HAL можно переносить от одного изделия на следующее, занимаясь только логикой.

Что вы понимаете под HAL? Если Hardware abstraction level вообще - то безусловно да. Хотя слоев там может быть больше двух.

А если конкретный HAL от ST, то нет, очень уж он ужасен.

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

это не у меня, а у автора ссылку на которого вы дали!

Что за ссылка-то? Я в этой теме ни на что вроде не ссылался.

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

Вот это писали с нуля на асме?

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

cd libopencm3-master/include/libopencm3/stm32/f1/
for f in *.h; do grep "#define" $f | sed 's/MMIO8\|MMIO16\|MMIO32//' > $(basename $f .h).inc; done

cd libopencm3-master/include/libopencm3/stm32/common
for f in *.h; do grep "#define" $f | sed 's/MMIO8\|MMIO16\|MMIO32//' > $(basename $f .h).inc; done

вот написано на asm вручную

.syntax unified
.cpu cortex-m3
.thumb
.global _start

#include <libopencm3/stm32/f1/memorymap.inc>
#include <libopencm3/stm32/f1/rcc.inc>
#include <libopencm3/stm32/common/timer_common_all.inc>

.text
    stack_pointer_value:    .word   0x20005000
    reset_vector:           .word   _start + 1
    
    _start:
@ RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; // enable TIM1 clocking
	ldr    r1, =RCC_APB2ENR
	ldr    r0, [r1]
	orr    r0, r0, #RCC_APB2ENR_TIM1EN
	str    r0, [r1]

@ TIM1->PSC = 8;  // 8MHz
	ldr    r1, =TIM1_PSC
	ldr    r0, =8
	str    r0, [r1]

@ TIM1->ARR = 99; // 100 ticks for 80kHz
	ldr    r1, =TIM1_ARR
	ldr    r0, =99
	str    r0, [r1]

@ TIM1->CCR1 = 49; // 50%
	ldr    r1, =TIM1_CCR1
	ldr    r0, =49
	str    r0, [r1]

@ TIM1->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE;
	ldr    r1, =TIM1_CCMR1
	ldr    r0, =(TIM_CCMR1_OC1M_PWM1 | TIM_CCMR1_OC1PE)
	str    r0, [r1]

@ TIM1->BDTR = TIM_BDTR_MOE;
	ldr    r1, =TIM1_BDTR
	ldr    r0, =TIM_BDTR_MOE
	str    r0, [r1]

@ TIM1->CCER = TIM_CCER_CC1E;
	ldr    r1, =TIM1_CCER
	ldr    r0, =TIM_CCER_CC1E
	str    r0, [r1]

@ TIM1->CR1 = TIM_CR1_CEN;
	ldr    r1, =TIM1_CR1
	ldr    r0, =TIM_CR1_CEN
	str    r0, [r1]

@ TIM1->EGR |= TIM_EGR_UG;  // generate update event to refresh all
	ldr    r1, =TIM1_EGR
	ldr    r0, [r1]
	orr    r0, r0, #TIM_EGR_UG
	str    r0, [r1]

blink:
        b blink

вот так собирается

cpp -I ./libopencm3-master/include -x assembler-with-cpp blinky.S -o blinky.s
arm-none-eabi-as blinky.s -o blinky.o
arm-none-eabi-ld blinky.o -Ttext=0x08000000 -o blinky.elf
arm-none-eabi-objcopy -O binary blinky.elf blinky.bin

вот так дизассемблировано

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

вот пример на С, который переписан на asm вручную

static inline void tim1_setup(){
    RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; // enable TIM1 clocking
    TIM1->PSC = 8;  // 8MHz
    TIM1->ARR = 99; // 100 ticks for 80kHz
    TIM1->CCR1 = 49; // 50%
    // PWM mode 1 (active->inactive)
    TIM1->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE;
    // main output
    TIM1->BDTR = TIM_BDTR_MOE;
    // main PWM output
    TIM1->CCER = TIM_CCER_CC1E;
    // turn it on
    TIM1->CR1 = TIM_CR1_CEN;
    TIM1->EGR |= TIM_EGR_UG; // generate update event to refresh all
}
anonymous
()
Ответ на: комментарий от COKPOWEHEU

Ну после доработки HAL от ST там мало осталось, так что полусамописный HAL, унифицированный сверху между несколькими используемыми контроллерами.

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

вот написано на asm вручную

Да, так гораздо лучше. Воспроизводить это я, конечно, не буду. Это вон Ассемблер делает вид, что пишет на ассемблере, мне пока Си хватает.

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

В интернате.

По любым форумам учиться - бред. Учиться можно по статьям, книгам. Некоторым вещам (не программированию, конечно) можно даже по видеороликам. Отличие от форумов в том, что материал структурирован, это не три предложения без контекста. А на форуме можно либо уточнить непонятный момент, либо задать конкретный вопрос.

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

Ну после доработки HAL от ST там мало осталось, так что полусамописный HAL, унифицированный сверху между несколькими используемыми контроллерами.

Тут согласен. В темах по ST под HAL’ом чаще подразумевается собственно ST’шная версия, где все настраивается ужасными структурами.

А вот нормальная абстракция поверх периферии это чуть ли не необходимость при мало-мальски большом коде.

Хотя если говорить про обучение, сначала придется без абстракции. Просто потому что сначала надо разобраться какой функционал универсальный, а какой платформо-зависимый.

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