LINUX.ORG.RU

Tim1

 ,


0

1

stm32f103c8 здрасьте здрасьте люди добрые) поправьте пожалуйста код, чтобы работало. Смысл такой, что надо сделать для понимание мигание светодиода с итревалом 3 сек с помощью таймера TIM1. пожалуйста обратите внимание на теги. в них нет СИ. не пишите пожалуйста примеры, которые не будут работать без библиотек, или которые вобще не будут работать.

.cpu cortex-m3
.thumb
.section .text
TIM1_PSC_zero_bit:  .word 0x42258500
TIM_CR1_CEN:        .word 0x42258000
TIM_CR1:            .word 0x40012c00
TIM_BDTR_MOE:       .word 0x422588BC
TIM1_PSC:           .word 0x40012c28

RCC_APB2ENR_TIM1EN: .word 0x4242032C//адрес рассчитан по формуле(смещение*32)+(4*Numbit)+0x42000000
//так как таймер будет работать у меня от частоты шины, то подключаю его.

.global _start
_start:
mov r5, #1
ldr r0, =RCC_APB2ENR_TIM1EN
str r5, [r0]

//TIM1_CNT оставлю по умолчанию.
mov r1, #1
ldr r0, =TIM_CR1_CEN
str r1, [x0]// разрешает счет.

//настраиваю счетчик на дикремент. 
ldr r0, =TIM_CR1_CEN
mov r1, #1
str r1, [r0, #16]// поместил единицу в бит DIR
mov r1, #0
str r1, [r0, #20]  поместил ноль в бит CMS
str r1, [r0, #24] поместил ноль в бит СМS
//помещаю 7999 в TIM_PSC
mov r1, #1
mov r2, #0
ldr r0, =TIM1_PSC_zero_bit
str r1, [r0]
str r1, [r0, #4]
str r1, [r0, #8]
str r1, [r0, #12]
str r1, [r0, #16]
str r1, [r0, #20]
str r2, [r0, #24]
str r2, [r0, #28]
str r1, [r0, #32]
str r1, [r0, #36]
str r1, [r0, #40]
str r1, [r0, #44]
str r1, [r0, #48]
// в TIM_PSC лежит #1111100111111
up:


bl up
чтобы светодиод мигал что нужно сделать? как связать ногу PC13 c TIM1?

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

Ты путаешься уже на элементарных вещах. А что будет, когда тебе понадобится пару тысяч страниц кода написать на асме? А я подозреваю, что реализовать что-то хоть немного сложней blinky будет на асме очень сложно. Ведь на инициализацию МК уходит сравнительно немного, но очень много - на общую логику работы. Как с теми же строками работать в асме (например, парсить команды, которые вводит юзер)?

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

Ты путаешься уже на элементарных вещах.

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

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

анон, кодом которого ты пользуешься

бред. он написал премер. про bit banding у нас расхождение еще с прошлых тем. мне говорят пользуйся правильными инструментами. ну ок!!! ОКРЫВАЮ REGISTR MAP TIM. ВИЖУ ЧТО СМЕЩЕНИЕ 0X00. ВИЖУ АДРЕС TIM1==0x40012c00. поэтому

.cpu cortex-m3
.thump
TIM1_CR1 = 0x40012c00
TIM1_CR1_SHIFT = (1 << 2) // так как bin URS == второму номеру 
.global _start
_start:
ldr x0, =TIM1_CR1
ldr x1, =TIM1_CR1_SHIFT
//так будет работать. это просто пример.
// но
ldr x0, =0x40012c00
ldr x1, =(1<<2)
//так не будет работать.
я не знаю почему. хотя на мой взгляд это эквивалент. если это простые вещи, то что ж.

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

Просто забудь про битбандинг! Если вдруг у тебя будет ситуация, когда он понадобится — воспользуешься им. Но я уверен почти на 100%, что у тебя такой ситуации никогда не возникнет. По крайней мере, я уже толпу всякой фигни на STM32 наворотил, но ни разу мне битбандинг не понадобился!

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

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

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

ну ок. bit banding позволял изменить один бит регистра не трогая остальные. если пользоваться правильным способом, не bit banding то чтобы изменить один бит придется перетрясти и все биты регистра. тогда объясните как сделать трушно на assembler ? вот адрес NVIC_ISERO

NVIC_ISERO== 0xe000e100
tim1_up==25 номер в таблице векторов.

tim_up_shift=(1<<25)

можно как-то без orr или and записать трушно в 25 бит регистра по этому адресу ==0xe000e100 единицу? без bit bandijn?

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

эти два варианта идентичны.

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

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

можно как-то без orr или and записать трушно в 25 бит регистра по этому адресу ==0xe000e100 единицу? без bit bandijn?

Чтение - наложение масок - запись. Это стандартный способ.

в том то и дело. разве бы я стал тут спрашивать

Так в какие коды собирается тот и другой варианты?

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

А вы всегда верите на слово рандомным чувакам из интернета?

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

Тут время от времени анонимусы появляются с фразочками вроде «забанься». Их тоже никто не спешит опровергать. Видимо, тоже согласны…

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

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

можно как-то без or или and записать трушно в 25 бит регистра по этому адресу ==0xe000e100 единицу?

Нет, естественно! Читаешь содержимое регистра, затем меняешь нужный бит, затем записываешь обратно.

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

ну это уже мне больше нравится. спасибо

ldr r0, =0xe000e100
ldr r5, [r0]; прочитал содержимое регистра
теперь мне нужно поменять значение 25 бита. как это сделать просто по вашему по-правильнуму?

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

Их тоже никто не спешит опровергать. Видимо, тоже согласны…

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

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

Это стандартный способ.

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

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

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

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

вы как всегда ищите в чем меня уличить

Я привел конкретный пример когда ваша логика не сработала

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

Я привел конкретный пример

нет, вы написали конкретную чушь.

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

Такого способа нет.

ура! есть! и bit banding не нужен! спасибо Эдуард, надоумили)))))))))))))))))))))))))))))))))))))))))))))))))))))))

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

Нет, естественно!

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

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

вот адрес NVIC_ISERO

можно как-то без orr или and записать трушно в 25 бит регистра

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

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

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

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

Читайте пожалуйста документацию! Гуглите! Не побирайтесь на форумах! Так вроде вы ему отвечали? Эдуард ему нормально написал как можно к битам регистра обращаться без масок и битовой полосы.

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

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

не выспался?

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

Вы непротив если я дам ссылку на ту статью другому форуму?

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

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

Такого способа нет.

ура! есть! и bit banding не нужен! спасибо Эдуард

И как же вы интерпретировали фразу Эдди если не как наложение битовых масок?

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

Эдя ему ментальный посыл запулил)

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

Главное что он понял) а что подтолкнуло к этому уже неважно. У него просто случилось озарение

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

Присоединяюсь к вопросу. Я именно битовые маски и имел в виду.

С него станется скопировать регистр в оперативку, потоптаться по нему bitband’ом и записать обратно.

…зачем я ему подсказываю подобное…

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

есть, но когда ты делаешь ldr r0, =что-то, то ассемблер сам решает какую инструкцию использовать и стоит ли размещать константу во флеше. то есть тебе не надо думать поддерживается ли размер константы инструкцией или нет. ну, вот, например, можешь сказать, какой инструкцией будет выгоднее грузить значение #2868947712, при том, что макс. размер thumb-инструкции — 32 бита? правильный ответ: 32-битным mov-ом.

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

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

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

В отдельных случаях могут, конечно. Тот же bitband или всякие sbi/cbi в AVR. Но это все платформо-специфично и почти всегда имеет ограничения.

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

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

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

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

«традиционно» все же битовые маски.

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

Хотя если те же настройки регистров грамотно в них завернуть, в некоторых местах получится красивее, чем с масками. А в других - хуже. Та же настройка CRH:CRL, ее можно сделать через битовые поля, но настройка произвольного порта будет менее красивой, чем сдвиг на (x*4).

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

А в итоге конструкция X.bita = 1 все равно породит аналогичный код, что и конструкция X |= 1<<n. А вот был бы компилятор "умным", он бы то, что возможно, превратил в битбандинг. Но лучше молчать о битбандинге, пока ТС не освоил азы.

Еще у некоторых STM32 есть регистр BSRR (не у всех, некоторые ограничены лишь раздельными BSR и BRR), что позволяет атомарно дрыгать ногами без read-modify-write (благодаря тому, что BS имеет приоритет, все младшие биты по маске можно установить в 1, а в старших устанавливать в 1 лишь те, которые надо откинуть в 0). Скажем, чтобы установить ногу PA0 и сбросить PA1, нужно написать GPIOA->BSRR = ((1<<1)<<16) | (3). Без это регистра пришлось бы писать: GPIOA->ODR = (GPIOA->ODR & 3) | 1.

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

Конечно, я забыл отрицание:

 GPIOA->ODR = (GPIOA->ODR & ~3) | 1
Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

А в итоге конструкция X.bita = 1 все равно породит аналогичный код, что и конструкция X |= 1<<n. А вот был бы компилятор «умным», он бы то, что возможно, превратил в битбандинг.

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

Еще у некоторых STM32 есть регистр BSRR

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

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

Тут бы пригодились битовые массивы.

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

А в Си такого нет.

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

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

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

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

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

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

Инвертировать бит нельзя, к сожалению. Только через read-modify-write.

Eddy_Em ☆☆☆☆☆
()

@Assembler признавайтесь, что разработать хотите?

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

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

Травить собак …

О собаках он говорил или о форумчанах?

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