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?

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

если вам несложно, скажите пожалуйста по поводу

.word   0x20002000
нашу группу интересует почему здесь конец стека находится не по адресу
0x20005000
? мы уже перебрали все версии от НЛО до мистики.

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

нашу группу интересует почему здесь конец стека находится не по адрес

Их там целая группа …
Все ЛОРу

КАПЕЦ
anonymous
()
Ответ на: комментарий от Assembler

почему здесь конец стека находится не по адресу 0x20005000

Потому что добрый anonymous поместил его по другому адресу.

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

подождите.

.word 0x20002000 это адрес конца стека.

на stmf103c8 0x20005000 это тоже мог бы быть адрес конца стека. 
 стек с адресом 0x20002000 меньше чем стек с концом адреса 0x20005000

и вот вопрос на stm32f103c8 : почему программка с большим размером стека не работает? то есть 0x20002000-работает, 0x20005000 -не работает.

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

и вот вопрос на stm32f103c8 : почему программка с большим размером стека не работает? то есть 0x20002000-работает, 0x20005000 -не работает.

А кто вам сказал что не работает? У меня работает

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

ну вот мы сидим с моим вероломным одногруппником и пытаемся разобртаться. чуть подрались при обсуждении данного вопроса. он утверждает, что адрес 0x20005000 -true и 0x20002000 -тоже true, я же показываю ему на примере поднося к его глазам МК на котором с адресом 0x20002000 программка даже не шьется в MK. поэтому решили спросить у тех кто точно знает почему так. то есть у уважаемых форумчан.

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

стал ложить программку во sram стала работать с адреса 0x20005000. то есть фишки переставил. пойду разбираться дальше

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

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

Угу. Он на Киберфоруме с такими же дурацкими вопросами тусуется.

Ему я там уже продемонстрировал, что и адрес SP можно заменить, и директивы .text и .global убрать - все продолжает компилироваться и работать.

Видимо, у вас что-то с компилятором или IDE.

с адресом 0x20002000 программка даже не шьется в MK

Прошивальщику вообще без разницы какие именно байты писать в контроллер.

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

пойду разбираться дальше

Ждем новую тему через 3… 2… 1…

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

Угу. Он на Киберфоруме с такими же дурацкими вопросами тусуется.

Оно размножается?

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

Прошивальщику вообще без разницы какие именно байты писать в контроллер.

программатор начинает попеременно мигать то красным и зеленым светодидами и не заливает прогрммку в MK. видимо не без разницы.

что-то с компилятором или IDE.

st-flash я собирал из source. IDE-нет. но думаю дело в том, что я просто еще не разобрался во всем хорошо. но уверен, что благодаря помощи таких замечательных людей как вы, я сделаю это быстро)

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

.word 0x20002000

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

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

я там спрашивал про инструкцию dsb. так ли она нужна?

раз уж вернулся к этой теме, нашёл такой документ

ARM Cortex™-M Programming Guide to Memory Barrier Instructions

https://developer.arm.com/documentation/dai0321/latest/

желательно вставить барьер перед wfi

Sleep

It is not a requirement for the processor hardware to drain any pending memory activity before suspending execution to enter a sleep mode. Therefore, software has to handle this by adding barrier instructions if the sleep mode used could affect data transfer. A DSB should be used to ensure that there are no outstanding memory transactions prior to executing the WFI or WFE instruction.

при программировании регистров MMIO барьеры не нужны

Device (Peripheral) access

There is no need to use a memory barrier instruction between each step during peripheral programming or peripheral access:

•Architecturally: Access to the same device must be in the programmed order.

•Implementation: Cortex-M processors do not reorder data transfers.
....
	ldr    r0, =TIM1_EGR
	ldr    r1, =TIM_EGR_UG
	str    r1, [r0]

	ldr    r0, =TIM1_CR1
	ldr    r1, =TIM_CR1_CEN
	str    r1, [r0]

	ldr    r0, =NVIC_ISER0
	ldr    r1, =TIM1_UP
	str    r1, [r0]

	dsb

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

A DSB should be used to ensure that there are no outstanding memory transactions prior to executing the WFI or WFE instruction.

а, да, что-то припоминаю, где-то читал про это, но уже, конечно, не вспомню где. спасибо за справку!

anonymous
()

Лучше бы ты С++ изучал и сделал уже вменяемый аналог opencm3 на шаблонах! Потратишь года три свободных вечеров под пивко, зато как выложишь это под GPL, так все забьют на эту дурную opencm3!!! И даже я перейду с С на С++ (точней, на С «в духе С++») на STM32!!!

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

Лучше бы ты С++ изучал и сделал уже вменяемый аналог opencm3 на шаблонах!

Вот да!

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

для страховки сделал стек поменьше

спасибо

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

Так ты программистом не станешь.

Даже студент говеный получится. Видно, что ТС скрытный и не компанейский.

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

скажите, а как рассчитать адрес бита для

NVIC_ISER0
?
The base address==0xE000E100
TIM1_up //имеет номер 25 в таблице векторов прерываний
как расчитать номер 25 бита, чтобы записать туда 1?

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

Ну и отлично. Без освоения битовой арифметики автор зачет не получит.

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

как рассчитать адрес бита для NVIC_ISER0

В примере упрощенный вариант так как заранее известно что 25 меньше 32 (количество бит в регистре) поэтому нужный бит находитсся в регистре NVIC_ISER0, в общем случае таких регистров может быть до 16 со следующими друг за другом адресами, а адрес регистра и позиция считаются так

https://www.mikrocontroller.net/articles/ARM-ASM-Tutorial#Peripheral_interrupts

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

Не надо ничего рассчитывать! Надо взять стандартные хидеры и пользоваться ими!!111

И вместо NVIC->ISER[x] |= NVIC_ISER_SETENA_25 писать NVIC_EnableIRQ(NVIC_TIM1_UP_IRQ)! Тогда код будет читаемым.

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

А что, в асме нельзя заголовочные файлы подключать?

Ну и вообще, писать под STM32 на асме — тот еще мазохизм! Если ТСу понадобится хотя бы простой конечный автомат реализовать + USB-CDC с разбором несложного текстового протокола, он же просто зафлудит весь ЛОР своими темами!

алсо

я прекрасно знаю, что «head» произносится как [hed] ☺

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

так он про асм спрашивает

это какой-то мудак рассказал ему про bit band, как это круто, но забыл сказать что это не всегда работает. Это как пользователи винды - им показали что есть кнопка ОК и теперь они везде ищут эту кнопку, ведь так намного проще и раньше уже получилось на неё нажать с нужным результатом.

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

А что, в асме нельзя заголовочные файлы подключать?

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

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

Это как пользователи винды - им показали что есть кнопка ОК и теперь они везде ищут эту кнопку

а мудак тогда кто в этом случае?

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

Я такие хедеры делал для STM8 (т.к. sdcc настолько тупой, что не умеет оптимизировать структуры, ну и еще кое-какие косяки наблюдались). Благо, у 8-биток регистров мало.

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

хедеры

во, сразу нормальным человеком выглядеть стал! моё увожение.

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

sdcc настолько тупой, что не умеет оптимизировать структуры

он же, вроде бы, неоптимизирующий

anonymous
()

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

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

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

Он в спортале скилл мышц прокачивает, чтобы «поставить на место» друг своего, который смеет ему перечить …

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

огромное вам спасибо что находите время и объясняете. bit banding понятет. я вижу биты и вижу что помещаю в них. логика

& | 
мне понятна от части. но не нравится. уважаемые форумчане заявляют что нельзя расчитать bit banding для NVIC_ISER0. что ж, конечно это странно. ладно, если вам несложно, то скажите почему
ldr r0, =TIM1
ldr r1, =(1 << TIMx_CR1_URS)
str r1, [r0, #TIMx_CR1]
если заменить на адреса

ldr r0, =0x40012C00
ldr r1, =(1 << 2)
str r1, [r0, #TIMx_CR1]
работать не будет

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

логика AND/OR мне понятна от части. но не нравится.

А напрасно. В отличие от bitband’а она работает вообще везде.

уважаемые форумчане заявляют что нельзя расчитать bit banding для NVIC_ISER0. что ж, конечно это странно.

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

то скажите почему

если заменить на адреса

работать не будет

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

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

Тогда код будет читаемым

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

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

но многие тут заигрались. они думают, что могут и должны решать …

Это да.
Но вы их простите …

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

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

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

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

ldr r1, =(1 << 4)

ну а зачем так?

URS
это второй бит в регистре TIMx_CR1 значит
ldr r1, =(1<<2)
но это не работает, если поместить адреса. но разницы быть недолжно.

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

ну а зачем так?

анон, кодом которого ты пользуешься, определил TIMx_CR1_URS как (1 << 2). вот и получется 4.

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