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?

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

пытаюсь. но я из села. у нас в школе английский был на уровне: what is your name? поэтому что смог то понял из манов. можете сказать, что неправильно в программе? как TIM1 cвязать со светодиодом? мне нужно лишь чтобы через 5 или 3 секунды он мигал. так я пойму как устроен TIM1

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

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

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

А что ему ваши доки? Он же объясняет что не понимает как подружить таймер и пин на котором висит светодиод. Он не понимает что нужно таймеру чтобы светодиод включался и выключался. Нужен ли для этого цикл или нет вот у него в чем вопрос. Разве документация ему об этом прямо скажет? А подругому он не понимает

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

Если бы в Кубе то пожалуйста. А такое не можем.

ну и на том спасибо

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

я из села. у нас в школе английский был на уровне: what is your name?

Тем не менее в селе очевидно есть тырнетик. А в ентом самом тырнетике очевидно есть куууууча онлайн-переводчиков.

Отсюда закономерный вопрос: если ты вобнимку с тырнетиком не смог перевод документа осилить, может тогда STM32 для тебя рановато?)

Oberstserj ★★
()

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

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

Какой к черту цикл и взаимодействие. Альтеришь функцию пина на выход с нужного канала ШИМ, настраиваешь ШИМ с нужными параметрами, ШИМ работает сам по себе, ?????, ПРОФИТ!!! и цикл тут только в качестве заглушки (на самом деле можно halt). И еще раз, я за забан тебя. Ты реально необучаемый и не хочешь сам учиться хотя есть и документация и тонны примеров в этом твоем интернете где все разжевывается для младенцев.

anonymous
()

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

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

Разве документация ему об этом прямо скажет?

Хорошая — непременно скажет.

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

настроить обработку прерываний от tim1

Если переключать по прерыванию, то проще взять таймер SysTick. Эдик ему предлагал настроить ШИМ, чтобы плавно менять яркость диода. С SysTick, конечно, тоже можно программный ШИМ сделать, но зачем, когда есть простой аппаратный.

anonymous
()

как связать PC13 pin и TIM1? как они должны взаимодействоать, в цикле?

Ув. Ассемблер. Посмотри вот эту картинку: https://idyl.io/wp-content/uploads/2018/07/stm32f103-pinout-diagram.png

На ней можно рассмотреть какие пины могут генерировать ШИМ и от какого таймера. Для TIM1 — это PA7PA11, PB0, PB1, PB13PB15. То есть ШИМ c TIM1 не получится вывести на PC13, только на указанные.

в TIM_PSC лежит #1111100111111

Все биты 32-битного регистра разом можно изменить обращаясь к регистру по прямому адресу, а не через bitband:

TIM1        = 0x40012c00
TIM1_PSC    = TIM1 + 0x28

ldr r0, =TIM1_PSC
ldr r1, =0b1111100111111
str r1, [r0]

с итревалом 3 сек с помощью таймера TIM1

Для такой длинной задержки либо частоту AHB/APB2 понижать придётся, либо писать число в TIM1_RCR.

Если прям надо PC13 и 3 секунды, то SysTick, как я уже сказал, будет проще.

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

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

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

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

цикл тут только в качестве заглушки

спасибо. скажите а надо ли подавать такиторование на pin к которому подключен светодиод? или TIM1 сам все сделает?

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

может тогда STM32 для тебя рановато?

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

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

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

Если взялись за ассемблер, то автоматом обозначаете серьезность своих намерений.

Чтобы обезьянничать есть Куб и Ардуина.

TIM1_PSC_zero_bit: .word 0x42258500

О, именованные константы! Это не может не радовать. Правда, ненужный bitband все еще в коде, но может и это пройдет.

//помещаю 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]

А-а-а! Ловите наркомана! И ведь не лень было это прописывать

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

не с той стороны вопрос ставите. Мне кажется вам нужно разобраться с логикой разных режимов работы таймера. В описании выше я подразумевал режим, в котором таймер при достижении счётчиком нуля генерирует прерывание. У каждого таймера есть свой вектор прерывания, управление по которому передаётся при наступлении сконфигурированного события. Таблица векторов прерываний с указанием к какому оборудованию относится каждый вектор есть в документации. Нужно посмотреть в документации адрес вектора прерываний для tim1 и записать туда адрес кода, на который будет передано выполнение при возникновении прерывания от tim1. И не забыть корректно завершить обработку прерывания

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

Думаете на данном этапе ШИМ через прерывание будет лучше аппаратного? Хотя стоп. F103 кажется вообще не умеет генерировать аппаратный ШИМ на PC13.

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

Я отталкивался от того что нужно сгенерировать сигнал именно на pc13, а там вроде как(с конкретной железкой не знаком, описание портов по диагонали пробежал) нет вариантов с аппаратным шимом, поэтому и думаю в сторону программного. По сложности что то что другое +/-, в программном случае надо с прерываниями разбираться, а в аппаратном с настройкой шима

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

колега, я учту ваши пожаления касаемо кода.

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

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

Нужно посмотреть в документации адрес вектора прерываний для tim1 и записать туда адрес кода,

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

TIM1_BRK

TIM1_UP
TIM1_TRG_COM
TIM1_BRK_TIM9
TIM1_CC
TIM1_UP
TIM1_CC

теперь я вобще не понимаю как работает TIM1. поправте пожалуйста мое рассуждение. у меня есть светодиод, на PC13. имею огромное желание включать его и выключить через любое время от 1 до10 cек. ну чтобы видить глазами. я думал, что прерывания нужно для GPIO в данном случае, чтобы произошло событие «включения» или «выключения» PC13. мне непонятно как TIM1 управляет к примеру светодиодом. вот в предделителе высчитали нужную частоту. в счетчике лежит по умолчание значение 2^16, также поместил единицу в бит DIR. при достижении счетчиком ноля произойдет прерывание и событие. но какое? светодиод выключится ? так он не включени. или его надо ключить? и он будет гореть пока тикает счетчик? а при достежинии нуля происходит прерывание и событие, когда счетчик гаснет? скажите как это происходит?

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

За пятнашку косых я найму кого-то, кто это сделает

что именно? господа, вы уже меня пугаете своими комментами.

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

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

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

Ммм, а вы пробовали более простую вещь, ну там просто включить светодиод? Как вы это делали?

А помигать светодиодом без таймера? Ну, просто циклами

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

Ну, просто циклами

да. PC13 был расположен на шине APB2 ну вот я в map memory находил смещение RCC_APB2 и высчитывал адрес бита IOPCEN и подавал тактирование. и так как за все порты GPIO отвечают два регистра GPIO_CRL и GPIO_CRH то устанавлилва определенные значения и в биты регистра GPIO_CRH. но мне надо понять как работает TIM1. если вам несложно то скажите что имено необходимо для TIM1 чтобы взаимодействовать со светодиодом. как этот таймер включает и выкллючает его? счетчик достиг нуля, какое именно прерывание и как сработает? просто мне непонятно, TIM1 заявлен как очень настраиваемый таймер, и поэтому было бы логично ему имень не свои собвстенные прерывания ,а работать с прерываниями тех устройств, для которых таймер тикает. вы можете объяснить?

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

Ну нет, так нет

господа, сами подумайте. мне говорят:бросай SysTick и разбирайся в TIM1. я начал разбираться, мне пишут: бросай TIM1 вот тебе SysTick. не, давайте пожалуйста разберемся TIM1. поможете?

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

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

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

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

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

профессионально

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

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

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

NVIC register map and reset values
ISER — Interrupt Set Enable Register. Запись бита в нужную позицию включает прерывание
там их 31. какой именно бит? как рассчитать? вы хорошо знаете английский, можете помочь? только без лишних слов. мне нужно включить(разрешить) внешнее прерывание для TIM1. как рассчитать?

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

Хотя пишут

 NVIC никогда не активирует прерывание, независимо от его приоритета.


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

Допустим

прерывание
TIM1_UP 25 позиция по таблице
есть два регистра
NVIC_ISER0 // до 37 позиции по таблице
NVIC_ISER1 //выше 37 позиции по таблице вроде
что нужно просто номер позиции в двоичной системе записать в эти биты? значит TIME_UP нужно записать в NVIC_ISER0 ?

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

Они не знают. За них делает куб. Ты чо пристал к ним? Люди устали отмазываться уже! Имей совесть.

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

Кажется пишут только в нулевой бит в первый бит и в 31 бит. Ща гляну точно. Местные аборигены тебе не скажут анус прав.

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

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

Ты в шары что ли долбишься? Какая библиотека?

Отличнейшая статья, кстати, раскрывающая все тонкости разработки на Асме под STM32. И про прерывания от периферии и про таймер там всё есть. И про линкер-скрипты. Статья — не в пример хабравысерам местных дристунов.

.include «stm32f103.inc»

Это ты называешь «библиотекой»? Ты статью читал? Во-первых:

The corresponding stm32f103.inc file with the added definitions for the timer registers is:

И дальше идёт полное содержимое файла.

Во-вторых:

Having to put the register and bit definitions (“RCC_APB2ENR”, “RCC_APB2ENR_IOPAEN”, …) in each assembly source file is redundant and error-prone. Instead, you can put them into a separate file (e.g. called “stm32f103.inc”) and use the “.include” directive to reference it

you can

Не означает «you must». Не хочешь — делай по-своему.

anonymous
()

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

ПАМАГИТЕ ПАЖАЛУЙСТА!
anonymous
()
Ответ на: комментарий от Assembler

TIM1_UP 25 позиция по таблице

А вам точно нужно прерывание по обновлению?

что нужно просто номер позиции в двоичной системе записать в эти биты? значит TIME_UP нужно записать в NVIC_ISER0 ?

Нет, это битовый массив. Регистры ISER2:ISER1:ISER0 это как бы один 96-битный регистр. Чтобы включить, скажем, 20-е прерывание, нужно выставить 20-й бит. Вот дизасм куска Си-шного кода:

  USB->CNTR   = USB_CNTR_RESETM | USB_CNTR_WKUPM;
 8000228:	f44f 52a0 	mov.w	r2, #5120	; 0x1400
 800022c:	f8a3 2040 	strh.w	r2, [r3, #64]	; 0x40
 * Enable a device specific interupt in the NVIC interrupt controller.
 * The interrupt number cannot be a negative value.
 */
static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
{
  NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */
 8000230:	f44f 1280 	mov.w	r2, #1048576	; 0x100000
 8000234:	4b06      	ldr	r3, [pc, #24]	; (8000250 <USB_setup+0x66>)
 8000236:	601a      	str	r2, [r3, #0]
  NVIC_EnableIRQ(USB_LP_IRQn);
  GPO_ON( USB_PULLUP );
 8000238:	f44f 6380 	mov.w	r3, #1024	; 0x400
 800023c:	610b      	str	r3, [r1, #16]
}
COKPOWEHEU
()
Ответ на: комментарий от anonymous

Кажется пишут только в нулевой бит в первый бит и в 31 бит. Ща гляну точно. Местные аборигены тебе не скажут

В 0, 1 и 31 биты какого регистра? Явно не таймера, у него регистры 16-битные. Вроде не ISER, у TIM1_UP номер всего 25.

А что не отвечают халявщику - что ж тут удивительного. Надоело уже

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

А что не отвечают халявщику - что ж тут удивительного. Надоело уже

Зачем вы сердитесь на младшего брата Метапрога?
Они документацию принципиально не читают.

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