LINUX.ORG.RU

включить тактирование

 


0

1

здрасьте здрасьте люди добрые. скажите пожалуйста как правильно включить тактирование? МК stm32f103c8. нарыл что порты ввода|вывода расположены на шине APB2. причем все порты. нельзя включить отдельно порт допустим

GPIO A
GPIO B
можно только подать тактирование на шину
APB2
нахожу
RCC_APB2ENR
в этом регистре нахожу бит
IOPC// так как светодиод висит у меня  на PC13
и теперь видимо мне нужно его выставить в едниницу. нахожу в memory map вижу адрес не APB2 а RCC
RCC 0x40021000
и правильно ли я понимаю что теперь чтобы мне включить бит нужно вычислить адрес по формуле
40021000-40000000=offset
(offset*32)+(4*4)
потому что (4*4) IOPC=4 битом
поправте пожалуйста уважаемые форумчане меня. я не совесем понимаю как правильно считать



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

я с вами не спорю. я у вас учусь. с удовольствием читаю то что вы пишите в темах. мне намного интересней учиться общаясь с МК напрямую без IDE. поэтому с большим вниманием отношусь к тому что вы говорите. хотя без того примера, который(куска кода), что написал Anonymous ничего бы не получилось. даже если он и пернул в лужу,как вы выразились, то сделал это настолько грамотно, что вряд ли кто повторит! его кусок кода = 1000комментов что были в той теме. хотя они и были посути ниочем. кроме ваших.

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

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

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

BB_RCC_APB2ENR_3

Лучше так:

BB_RCC_APB2ENR->PORTB
Хотя, конечно, это нетривиально. Проще действительно BB_RCC_APB2ENR->BIT3. Определяем структуру
typedef struct{
  uint32_t BIT31;
  uint32_t BIT30;
...
  uint32_t BIT0;
} bits;
и задаем адрес
#define BB_REG_BASE    (0x42000000)
#define BB_RCC_APB2ENR_BASE  (&RCC->APB2ENR - PERIPH_BASE)
#define BB_RCC_APB2ENR    ((bits *) BB_RCC_APB2ENR_BASE)
И все, можно использовать BB_RCC_APB2ENR->BIT3 = 0/1

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

BB_RCC_APB2ENR_3

Лучше так:

Вы, наверное, отвечать стали, когда я еще не все части выложил. Там в конце версия BB_PERIPH( RCC->APB2ENR, RCC_APB2ENR_IOPBEN_Pos ) = 1;

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

//костыли

Проверяю - работает

Не работает:

sokr.c:1:10: fatal error: stm32f1xx.h: No such file or directory
    1 | #include <stm32f1xx.h>
      |          ^~~~~~~~~~~~~
compilation terminated.

Как это скомпилировать-то хотя бы?

RCC_APB2ENR_IOPBEN_Pos

А нельзя было вместо этого log2(RCC_APB2ENR_IOPBEN)?

Ну это, вот, конечно, вообще уродство какое-то нечитабельное, хуже асма:

(*((uint32_t*)( 0x42000000 + ((uint32_t)&(addr)-0x40000000)*32 + (bit)*4 )))
...
(GPIOB->CRL &~(0b1111 << (4*5))) | (GPIO_PP50 << (4*5));

Магия сплошная, а не код. Спасибо, поблевал.

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

Не, такой макрос не очень, красивше именно BB_RCC_APB2ENR->BIT3 = 0/1.

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

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

когда я написал шаблон, сможете реализовать битбанд на оперативке?

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

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

Не работает:

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

Ну это, вот, конечно, вообще уродство какое-то нечитабельное, хуже асма:

(*((uint32_t*)( 0x42000000 + ((uint32_t)&(addr)-0x40000000)*32 + (bit)*4 )))
...
(GPIOB->CRL &~(0b1111 << (4*5))) | (GPIO_PP50 << (4*5));

Не спорю. В нормальном коде оно заворачивается в макросы и наружу не торчит:

#define YLED  B,5,1,GPIO_PP50
...
GPIO_config( YLED );
GPO_ON( YLED );
GPO_OFF( YLED );

Спасибо, поблевал.

Хоть бы до туалета добежал, зачем форум-то пачкать!

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

Не, такой макрос не очень, красивше именно BB_RCC_APB2ENR->BIT3 = 0/1.

Запоминать какой бит чему соответствует? Или прописывать каждому регистру соответствующую структуру? Еще чего!

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

вы только сейчас сами научились Bit Band и слава богу и спасибо за это Anonymous

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

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

У тебя тоже не очень: нужно определять все эти RCC_APB2ENR_IOPBEN_Pos и т.п. Тогда уж логичней будет из структуры смещение вычислить, вычитая (&RCC->APB2ENR - RCC).

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

Если руки из жопы

Как грубо. А ты представь, что я новичок. Вот ты дал мне какой-то сниппет. И что мне с этим делать? Оно не запускается.

Где документация к этому:

void __attribute__((weak)) _init(void){} //костыли для стандартного стартапа
void __attribute__((weak)) SystemInit(void){}

Как мне прочитать статусный регистр? Как настроить маску прерываний? Как отправить проц в сон? Где про всё это можно почитать, в контексте программирования на Си и с использованием «stm32f1xx.h»?

И ты хочешь сказать, что для новичка это просто всё?

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

У тебя тоже не очень: нужно определять все эти RCC_APB2ENR_IOPBEN_Pos

Зачем? Их ST в заголовочнике прописали. Я ведь в начале отдельно завел клоны стандартных регистров, чтобы продемонстрировать как вычисляются адреса, а потом заменил на стандартные.

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

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

Вот поэтому сначала новичку нужно дать сишный стартап, линкер-скрипт и Makefile. Ну и объяснить, откуда скачать заголовочные файлы CMSIS и периферии конкретной серии МК.

А дальше все у него будет компиляться. Скажем, с моим линкер-скриптом и стартапом код COKPOWEHEU тоже не будет собираться.

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

Вот поэтому сначала новичку нужно дать сишный стартап, линкер-скрипт и Makefile.

Ну так о том и речь, что без вот этой всей кучи условностей ничего у новичка и не работает в итоге.

Ну и объяснить, откуда скачать заголовочные файлы CMSIS и периферии конкретной серии МК.

Ну так и откуда?

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

Как грубо.

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

Вот ты дал мне какой-то сниппет.

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

Как мне прочитать статусный регистр? Как настроить маску прерываний? Как отправить проц в сон? Где про всё это можно почитать, в контексте программирования на Си и с использованием «stm32f1xx.h»?

Какое это имеет отношение к моему примеру? В моих проектах и сон, и прерывания, и все остальное работает. Собственно, шаблон кода я выдернул из своей реализации USB, только поубирал все лишнее.

И ты хочешь сказать, что для новичка это просто всё?

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

Для того же USB ну вот нет готовой вменяемой библиотеки, сколько ни спрашивай по форумам. Либо HAL’овое убожество, либо не все реализовано и с неочевидным использованием. Не то чтобы мою было так просто использовать…

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

В каком? У меня нет таких макросов.

Ахаха. Ещё у одного руки из жопы!

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

В каком? У меня нет таких макросов.

Да вот например: https://github.com/COKPOWEHEU/usb/blob/main/1.Core_F1/lib/include/stm32f103xb.h

Насколько я понимаю, это заголовочник от самих ST. Я его правда еще откуда-то выдрал, когда только начинал с stm’ками разбираться.

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

Ну и объяснить, откуда скачать заголовочные файлы CMSIS и периферии конкретной серии МК.

Ну так и откуда?

А вот это важный вопрос! Потому что готовых примеров кода, не тянущих за собой хвост из HAL’а или всяких IDE и собирающихся обычным make’ом довольно трудно. Но все же можно. Как минимум, мои шаблоны в открытом доступе уже лежат. Но в данном случае это, думаю, больше академический вопрос: Ассемблер доволен говнокодом Анонимуса и бегает с ним - ему мой код вроде без надобности. У Эдди свои наработки. А местному анонимусу нужен не код, а повод.

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

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

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

Какое это имеет отношение к моему примеру? В моих проектах и сон, и прерывания, и все остальное работает.

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

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

Опять послал нахер новичка, получается.

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

Так…

Вы собрали минимальный работоспособный код, на котором можно экспериментировать? А то берете адреса фиг знает откуда и фиг знает зачем, а потом крики «что я делаю не так». Вот именно это - попытка угадать ответ вместо последовательного изучения и понимания что и зачем делается. Алгоритм отладки я вам тоже уже расписал - строим минимально рабочий код и тестируем новые фичи по одной, чтобы сразу видеть какую именно не понимаем. Если не лень будет вечером откопаю платку с f103 и по шагам покажу как это делается. Не на асме, а на Си, разумеется.

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

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

Это на калокуб похоже. У меня из SPL:

Может и оттуда. К сожалению, скачать в недрах интернета Куб проще, чем примеры кода с сайта ST.

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

Как минимум, мои шаблоны в открытом доступе уже лежат.

Ясно, без васянских ссылок ничего и не запустить, оказывается. Понятно.

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

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

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

Опять послал нахер новичка, получается.

Не новичка, а тролля, не путай. Ты тут ко мне чуть ли не с начала темы цеплялся.

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

Еще раз: это не готовый код, это алгоритм решения простой задачи на примере задачи Ассемблера. У него ведь проблема не с кодом была, а с непониманием что с кодом делать дальше.

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

я заглянул в makefile и понял, что для новичка это не прояснения, а затмение. там опять все скрыто, и все из области : тыкни там, нажми здесь, запусти это. все СИ с их кучей макросов, которые похожи на шифр Энигмы, не помогут. Только код Anonymuous на assemblere пролил свет, только его пример. все остальное филькина грамота.

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

по манам ты бы до сих пор не разобрался если бы тебе Anonymous не разложили все по полочкам

Ты читать вообще не умеешь? Я раз десять сказал, что и не начал бы разбираться с bitband’ом, потому что не нужен он. А с тем, что нужно - сном, таймерами, UART’ом, USB - разбирался по манам, чужим исходникам и статьям. Что считаю полезным - описываю статьями хотя бы на Хабре.

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

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

tm32f1xx.h: No such file or directory
1 | #include <stm32f1xx.h>

Если не тролишь то рекомендую отлижить мк и прочитать книжку по сям.

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

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


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
$ stat -c %s blinky.bin 

если ты пишешь на CИ сначала

 arm-none-eabi-gcc blinky.c -c -o blinky.o 
ну я не видел сам код. да и ниселен чтобы давать советы. это фрагмент кода из темы, который написал Anonymous

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

Ты дал код. Неполный. Нерасширяемый. Без документации. Без инструкции сборки и настройки окружения. Он не компилируется. Ну и кто после этого тролль?

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

Твои советы бесполезные.

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

попробуй на assembler.

.cpu cortex-m3
.thumb
.global _start

    PORT_C_ENABLE_BIT           = 0x42420310
    PORT_C_PIN13_MODE0_BIT      = 0x422200d0
    PORT_C_PIN13_OUTPUT_BIT     = 0x422201b4

.text
      .word   0x20005000
      .word   _start + 1
    
    _start:
        movs    r1, #1

        ldr     r0, =PORT_C_ENABLE_BIT
        str     r1, [r0]
        ldr     r0, =PORT_C_PIN13_MODE0_BIT
        str     r1, [r0]

        
        loop:



        bl loop

немного для тебя изменил код написаный Anonymous. так ты зажгешь светодиод.

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

Если не тролишь то рекомендую отлижить мк и прочитать книжку по сям.

У нас тут ролевые игры. Не мешайте, проходите :)

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

так ты зажгешь светодиод

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

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

если ты пишешь на CИ сначала

arm-none-eabi-gcc blinky.c -c -o blinky.o

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

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

Последовательность вызовов будет скорее такой (вырвано на глазок из makefile’а):

arm-none-eabi-gcc -fno-builtin -Wall -MD -MP -MT build/main.o -MF build/dep/main.o.mk -mthumb -mcpu=cortex-m3 -gdwarf-2 -Os -DSTM32F103xB $(incdir) -c src/main.c -o build/main.o

arm-none-eabi-gcc -Tstm32f10xC8.ld -nostartfiles -Wl,-Map -Wl,build/firmware.map -mthumb -mcpu=cortex-m3 -o res/firmware.elf build/crt.o $(libdir) build/main.o

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

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

так будет проще

.cpu cortex-m3
.thumb
.global _start

  

.text
      .word   0x20005000
      .word   _start + 1
    
    _start:
        movs    r1, #1

        ldr     r0, = 0x42420310
        str     r1, [r0]
        ldr     r0, =0x422200d0
        str     r1, [r0]
        ldr     r0, =0x422201b4
        
        loop:



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

А теперь усложни задачу и поменяй программно яркость

А не слишком резкий скачок? Это ведь надо либо программный, либо аппаратный ШИМ городить. Ассемблер небось и слов-то таких не знает.

Вот кнопка - хорошо. Два светодиода с разной частотой тоже. Семисегментник совсем наглядно продемонстрирует убожество bitband подхода. А вот BSRR с ним справляется неплохо.

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

вот он ты голубчик! о том то и речь!

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

какие же вы есть! намного проще написать код и скомпилировать на Assembler, но вы меня одговоривали и убеждали что надо делать на CИ. короче вопрос исчерпан.

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

Если не тролишь то рекомендую отлижить мк и прочитать книжку по сям.

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

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

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

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

Ну и наконец-то разобрались, кто тут на самом деле ардуинщик-говнокодер.

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

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

Да, так и есть. Пока что никаких противоречий не видно.

Вон вы в ассемблере как запутались. На Си было бы гораздо проще. Хотя шаблон с «магией» поискать бы пришлось, это да.

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

Ведь без помощи анонима ты ничего не сделаешь

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

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

Ладно, бывайте, мне пора. Завтра ещё загляну на огонёк :)

нафиг ты тут нужен! своих дебилов хватает.

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

нафиг ты тут нужен! своих дебилов хватает.

Самокритично. Возможно ты не безнадежен.

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

А не слишком резкий скачок? Это ведь надо либо программный, либо аппаратный ШИМ городить. Ассемблер небось и слов-то таких не знает.

Ну можно взять пример с ШИМ для куба или hal’а из chibios и поразбираться, какие параметры на что влияют. Вполне доступно для новичка. ТС уже микроменеджментом пытается заниматься, хотя даже общую картинку не представляет.

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

Ну можно взять пример с ШИМ для куба или hal’а

Да в этом даже я не разберусь! При том, что человеческими способами ШИМ делается просто. А параметры - да какие у ШИМ параметры. Скважность да частота.

Хотя если удастся ТСу объяснить что такое ШИМ, может программную реализацию и осилит. Правда, ограничений битбанда на ней видно не будет - единственный диод же. На таймерах с текущими знаниями не осилит.

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

А параметры - да какие у ШИМ параметры. Скважность да частота.

Для столь однобитного ТСа это может быть даже за гранью возможностей.

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