LINUX.ORG.RU

stm32f103c8/TIM3

 


0

1

Здрасьте здрасьте люди добрые. пререйду скразу к делу. денег немного осталось всего 100р. если есть у кого-то свободное время то подкорректируйте пожалуйста. хочу использовать TIM3 на ноге PB1 для понимания принципа работы этого таймера. но почему-то все происходит не так как ожидалось.

ldr r0, =0x4002101C //RCC_APB1ENR Enable TIM3
ldr r1, =0b00000000000000000000000000000010
str r1, [r0]

ldr r0, =0x40021018 //RCC_APB2ENR Enalble GPIO_B
ldr r1, =0b00000000000000000000000000001000
str r1, [r0]

ldr r0, =0x40010C00 //GPIO_CRL_PORT_B1
ldr r1, =0b00000000000000000000000000010000 //Enable PUSH_PULL_output mode 10MHz
str r1, [r0]

ldr r0, =0x4000040C //TIM3_DIER_UIE
ldr r1, =0b00000000000000000000000000000001
str r1, [r0]

ldr r0, =0x40000414 //TIM3_EGR_UG
ldr r1, =0b00000000000000000000000000000001
str r1, [r0]

ldr r0, =0x40000444 //TIM3_BDTR_AOE
ldr r1, =0b00000000000000000100000000000000
str r1, [r0]
ну и также настроил 
TIM3_PSC
TIM3_ARR
////////////////////////////////////////////////
ldr r0, =0xE000E100 //TIM3 global interrupt_NVIC
ldr r1, =0b00100000000000000000000000000000
str r1, [r0

ldr r0, =0x40000400 //TIM3_CR1_CEN_URS
ldr r1, =0b00000000000000000000000000000101
str r1, [r0]

скажите пожалуйста, что еще надо включить или что изменить чтобы TIM3 мог использоваться в коде на ноге PB1? я пытаюсь сделать blink led без ШИМа.



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

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

А у тебя есть какая-нибудь хорошая ссылка на годный instruction set с примерами?

В моей статье в комментариях кинули список инструкций https://habr.com/ru/post/533272/

Это который по USART шьёт через встроенный загрузчик?

Нет, это JTAG через bitband. Через bootloader-то нормально работает.

Создай тему, спроси, точно что-нибудь подскажут.

Пока не горит, а там посмотрим.

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

Он решил, что раз набил 5 звёзд, то форум теперь его и теперь он тут устанавливает правила. Ахаха. То есть, я за бан. Репорт кинул ещё вчера, кста.

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

А, да, bitbanG у этих ft232 крайне тормозной, подтверждаю и сочувствую.

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

Может, конечно, я с командой не угадал или еще что-то. Но вариант с bootloader’ом кажется более перспективным, чем гадание на openocd.

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

А какой для них официальный способ прошивки рекомендуется? У них есть внутрисхемная отладка?

А если вместо костыльного ft232 подключить нормальный JTAG отладчик?

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

Нормальный через JTAG и предполагается. Правда, для этого надо патчить openocd.

Нормального JTAG-отладчика у меня нет, потому и извращался с ft-шкой. Есть самодельный st-link, который того камня видеть не желает, и шилд для ft, который нещадно тормозит. Впрочем, надеюсь все же достать где-нибудь нормальный программатор и проверить еще и на нем.

COKPOWEHEU
()

Но лучше скажите, как по-вашему, будет ли сама моя идея интересной - когда подключаешься к удаленной машине и видишь через веб-камеру чужую отладочную плату, обмотанную МГТФом и соединенную с не менее кустарной периферией?

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

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

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

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

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

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

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

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

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

Мало-мальски серьезных - нет. Максимум поиграться с необычным контроллером, попрограммировать RISC-V на реальной железке.

Примерно для этого я реальную железку и покупал - поиграться и посмотреть ассемблер.

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

Когда покупаешь - тут вопросов нет. Но удаленно - лично мне не понятно зачем оно надо.

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

В моей статье в комментариях кинули список инструкций https://habr.com/ru/post/533272/

такое новичкам лучше не читать

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

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

В нашем GD32VF103 оперативная память начинается с адреса 0x2000’0000 и насчитывает 32 килобайта, то есть максимально доступный адрес 0x2000’8000, от него и будет расти наш стек

чуваки недоумевают после таких статей

где могут «дать» хорошую базу? (комментарий)

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

Выше стека (адреса больше начального значения SP) располагается свободная память - куча, глобальные переменные, инициализированные данные.

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

такое новичкам лучше не читать

Так дайте же ссылку что новичкам читать стоит!

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

Вообще-то они обычно располагаются с начала памяти.

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

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

Но выше начального адреса нет ничего - там физически конец оперативки.

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

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

байт в секунду

Ну это, конечно, совсем не серьёзно.

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

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

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

На выполнение лучше сделать очередь и отводить какое-то время на каждую программу обратно пропорционально объёму очереди.

Донаты пополам :)

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

Но выше начального адреса нет ничего - там физически конец оперативки

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

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

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

Если абстрагироваться от регистров и тем более выдумывать свой язык, какой смысл именно от RISC-V контроллера?

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

нет, ты сам устанавливаешь начальный адрес стека

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

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

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

SP указывает не на свободную память

Что значит он растет не на свободную память? Там нет совсем ОС. Ты используешь стек как хочешь.

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

А от чего там твои чуваки хохотали? Что было смешного в вопросе ТС в той теме? Ты не ответил ему сразу потому что сам узнал только сейчас о том как там устроен стек? Над чем вы ржали то?

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

Вы как-то очень издалека подходите
что именно вы пытаетесь донести

да уж. Видимо ты обрел друга. Теперь воды нальете тут своей философией об кубах и стм.

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

SP указывает не на свободную память Что значит он растет не на свободную память?

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

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

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

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

Над чем ржали то? Я так и не понял. Тоже хочу

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

Да sp ни на что не указывает. Это всего лишь регистр.

читай документацию и не городи херни, sp специальный регистр - указатель стека

The processor uses a full descending stack. This means the stack pointer holds the address of the last stacked item in memory. When the processor pushes a new item onto the stack, it decrements the stack pointer and then writes the item to the new memory location.
the stack pointer holds the address of the last stacked item in memory

https://developer.arm.com/documentation/dui0552/a/the-cortex-m3-processor/programmers-model/stacks

anonymous
()
Ответ на: комментарий от anonymous
sub sp, sp, 16;

что сделает эта команда?она из значения в sp вычтет 16 и поместит в sp. А еще бы я мог сделать

sub sp, sp, 64 
видишь, я изменяю значения в регистре sp даже тогда когда установлена OС. Ты путаешь договореность которой придерживаются программисты и используют к примеру определенные регистры для определенных целей как ннапример rax для возврата значения их функции. Но сам посебе регистр rax это всего лишь память которую программист может использовать не только для получения возвращаемого значения из функции. Так что регистр sp, его специальное назначение, как и его название существуют лишь в рамках договоренности.

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

От чего там недоумевали ваши чуваки?

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

видишь, я изменяю значения в регистре sp даже тогда когда установлена OС

то что ты отсосал сам у себя ничего не меняет - член тебе дан в туалет ходить и детей рожать а рот для приёма пищи. В архитектуре процессора так же - есть регистры специального назнчения и самоудовлетворение с ними ничего не поменяет - можно и PC изменить как угодно но он останется progam counter.

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

та успакойтесь, изначально речь вообще про риск-в шла, там даже инструкций пуш и поп нету.

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

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

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

чуть выше написана кроссплатформенная херня

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

sp указывает не на начало а на конец свободной памяти, даже если у тебя нет аппаратного сохранения контекста и всё делается програмно

.macro push val
  addi sp, sp, -4
  sw \val, 0(sp)
.endm

.macro pop val
  lw \val, 0(sp)
  addi sp, sp, 4
.endm

На stm32 (о котором речь шла изначально) стек используется при вызове обработчика прерываний, даже если ты не видишь в коде push/pop

Stacking

When the processor invokes an exception, it automatically pushes the following eight registers to the SP in the following order:

    Program Counter (PC)

    Processor Status Register (xPSR)

    r0-r3

    r12

    Link Register (LR). 

The SP is decremented by eight words by the completion of the stack push. Figure 5.1 shows the contents of the stack after an exception pre-empts the current program flow.

зачем вы в этой теме про risc-v в уши ссыте не понятно.

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

чуть выше написана кроссплатформенная херня

Как платформо-зависимая реализация может быть кроссплатформенной?

зачем вы в этой теме про risc-v в уши ссыте не понятно.

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

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

Обязательно в теме, вопрос которой автор пометил «решённым» и пошёл изучать таймеры

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

Как платформо-зависимая реализация может быть кроссплатформенной?

т.е. сути ты опять в упор не видишь - SP на arm и на risc-v указывает на конец а не на начало свободной памяти

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

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

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

т.е. сути ты опять в упор не видишь - SP на arm и на risc-v указывает

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

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

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

Невозможно выучить язык по словарю. А справочник на процессор это именно справочник - не учебник.

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

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

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

Почему же? Вы вот яростно советовали в прошлых темах изучать контроллеры по технической документации.

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

А справочник на процессор это именно справочник - не учебник.

обобщение «документация» это целый набор документов и апнотов, на stm32 их более чем один на сайте производителя + документация на ядро arm + печатные издания технических писателей. Никакой форум и никакие форумные ноунеймы это не заменят.

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

Кстати я бы посоветовал ТС-у установить калькулятор

https://wiki.gnome.org/Apps/Calculator

там можно мышкой битики в нужных позициях включать и выключать в Progamming Mode - всё лучще чем колбаски из 0 и 1 писать вручную.

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

https://wiki.gnome.org/Apps/Calculator

Не-не-не, не надо конфигурялок! Этот код ведь потом читать, а магическое число 16384 еще хуже, чем 0b00000000000000000100000000000000

А пользоваться надо сдвигами, сложениями и именованными константами.

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

Как ты их называешь? Полтора беса? Брешься значит с такими как ТС и его дружок? Здесь и на другом форуме?

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

пользоваться надо сдвигами, сложениями и именованными константами

это не всегда понятней чем 16-й код, например у stm32 конфиг gpio у каждого io терада, для меня намного читабельней

	ldr    r0, =GPIOC_CRH
	ldr    r1, [r0]
	and    r1, #0xFF0FFFFF
	orr    r1, #0x00100000
	str    r1, [r0]

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

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

Это - magick numbers. Нечитабельная фигня

а это что по твоему

GPIO_MODER_MODER0_AI

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

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

надо лезть в хедер чтобы расшифровать эту хероту

Никуда не надо лезть, т.к. понятно, что это - Analog Input! И ошибиться с этим значительно сложней (сразу видно, что нога 0 настроена в режиме аналогового выхода), чем в случае с magick numbers.

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

И ты будешь каждый раз, как захочешь свой старый код в новой железке использовать, лезть в даташит, чтобы свериться с тетрадами? Да еще и будешь 100500 раз перепроверять, правильно ли каждую тетраду указал?

Сразу видно, что ты под МК ни хрена не писал!

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

И ты будешь каждый раз, как захочешь свой старый код в новой железке использовать, лезть в даташит,

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

anonymous
()

ТС сори) ты пострадаешь за нас)

anonymous
()

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

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

Попробуй свой «совет» выполнить самостоятельно. И испугайся от того оверхеда, который тебе калокуб в код нафигачит! Там одних только ассертов ненужных полным-полно. Я уж молчу о том, что вместо вменяемых TRUE_INLINE псевдофункций они используют обычные функции!!! И вообще молчу, что это надо было делать на шаблонах в С++!!!11

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

это не всегда понятней чем 16-й код

Можно и так. А можно все еще сдвигами:

ldr r0, =GPIOC_CRH
ldr r1, [r0]
and r1, ~(GPIO_MASK<<(4*6))
orr r1, (GPIO_PP_50MHz<<(4*6))
str r1, [r0]

(не уверен, что не накосячил с синтаксисом, но суть понятна). Совсем хорошо если в виде мракоса оформить.

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

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

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

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

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