Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/23: Рейтинг темы: голосов - 23, средняя оценка - 4.57
407 / 72 / 7
Регистрация: 29.01.2018
Сообщений: 1,086
1

Stm32f103 примитивная работа с таймерами на ассемблере

05.06.2021, 00:36. Показов 4286. Ответов 59

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


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

действительно, какое имено нужно прерывание для того чтобы светодиод зажегся или погас?
Код
•регстр счетчика (TIMx_CNT).
• Регстр прескалера (TIMx_PSC).
• Регстр автозагрузки (TIMx_ARR).
• Регстр счетчика повторений (TIMx_RCR).
положили значение в TIMx_CNT, высчитали и положили значение в пределитель Регстр прескалера (TIMx_PSC) настроили на то что когда счетчик достигнет максимального результата к примеру 5000, то что должно произойти? прерывание? какое? какое нужно прерывание, чтобы мигнул светодиод?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.06.2021, 00:36
Ответы с готовыми решениями:

Работа с таймерами
Здравствуйте. Делаю проект типа "Приложение Windows Forms". Вопрос по коду ниже. procedure...

Работа с таймерами
Есть один класс. В нем заведен тред QThread. В его функции run - объявлены четыре локальных...

Работа с таймерами
Пацаны привет!!!!!!!!!!!!!! Я хочу зделать секундомера!!!!!!!!!!!!!! Мне нужно в одной форме...

Работа с таймерами, анимация
Имеется поле, состоящее из нескольких обьектов JLabel Для каждого обьекта запускается ТАЙМЕР_1,...

59
10 / 8 / 2
Регистрация: 17.09.2019
Сообщений: 15
05.06.2021, 06:42 2
pcmax, из вашего описания совершенно не понятно зачем тут прерывание вообще. "Прерывание" служит для экстренного прерывания какого-либо процесса. У 1-го таймера четыре своих аппаратных ноги, можно посадить на любую из них светодиод, и зажигать.
1
Модератор
Эксперт по электронике
8409 / 6250 / 841
Регистрация: 14.02.2011
Сообщений: 21,679
05.06.2021, 07:52 3
Цитата Сообщение от pcmax Посмотреть сообщение
если вам несложно то скажите что имено необходимо для TIM1 чтобы взаимодействовать со светодиодом.
включить в режим PWM. и никаких прерываний, таймер сам заморгает светодиодом
2
2988 / 1795 / 358
Регистрация: 09.09.2017
Сообщений: 7,421
05.06.2021, 10:26 4
Они развлекаются с blue-pill, у нее единственный светодиод, и тот на PC13 висит, к ней ШИМы не подведены.
Отсюда я вижу три варианта:
Можно сделать чисто программный ШИМ на "тупых" задержках и ручном ногодрыге. В серьезных проектах так делать не стоит, но чтобы посмотреть на плавно зажигающийся светодиод сгодится.

Не по теме:

Буквально вчера показывал студентке что такое ассемблер на примере AVR. Их там "учат" на х86, и они ничего не понимают. А вот на контроллере гораздо нагляднее получилось. Ну и программный ШИМ показал заодно.


Можно сделать полу-программный ШИМ - настроить какой-нибудь, не обязательно TIM1, таймер на генерацию прерываний и внутри обработчика сигать диодом.
Но лучше выбрать ножку, на которую ШИМ выведен, и припаять к ней второй светодиод, и сделать полностью аппаратный ШИМ.
UPD:
blue-pill, у нее единственный светодиод, и тот на PC13 висит
Вот, кстати, причина, по которой я делал свою отладочную плату. На ней аж три светодиода, к которым ШИМ таки подведен, плюс кнопки. Правда по неопытности накосячил, так что кнопки конфликтуют со всем подряд. Вторая версия платы (уже под RISCV) этих недостатков лишена. С другой стороны, blue-pill вроде бы позиционируется скорее как "контроллер в DIP-корпусе", чем как отладочная плата.
1
10 / 8 / 2
Регистрация: 17.09.2019
Сообщений: 15
05.06.2021, 12:14 5
Если BluPill, то для мигания встроенным диодом тоже можно без прерываний обойтись. Как вариант флаг таймера прочесть, например вставить в цикл что-то подобное:
Код
if(TIM1->SR&TIM_SR_UIF) {
  TIM1->SR=~TIM_SR_UIF;
   GPIOC->ODR^= 1<<13;
   }
}
И всё, светик на PC13 мигает.
Или вообще через DMA
1
2760 / 1271 / 166
Регистрация: 28.10.2011
Сообщений: 4,698
Записей в блоге: 6
05.06.2021, 12:47 6
Цитата Сообщение от dimkra Посмотреть сообщение
Или вообще через DMA
https://www.cyberforum.ru/blog... g5169.html
1
2988 / 1795 / 358
Регистрация: 09.09.2017
Сообщений: 7,421
05.06.2021, 14:51 7
Ассемблеро-фанам предлагать ST-HAL. Гениально! Он ведь не только для чтения непригоден, но даже для дизассемблирования.
1
407 / 72 / 7
Регистрация: 29.01.2018
Сообщений: 1,086
05.06.2021, 18:16  [ТС] 8
dimkra,
Цитата Сообщение от dimkra Посмотреть сообщение
совершенно не понятно зачем тут прерывание вообще.
я тоже на знаю, но пишут, что чтобы совершилось событие(светодиод изменил свое состояние) нужно прерывание.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
.syntax unified
.cpu cortex-m3
.thumb
 
 
.section .text
.word 0x20005000
 PORT_C_ENABLEBIT              .word     0x42420310
 PORT_C_PIN13_MODE0BIT    .word     0x422200d0
 PORT_C_PIN13_OUTPUTBIT   .word     0x422201b4
 TIM1_PSC:                             .word     0x40012c28
 TIM1_CR1:                             .word     0x42258000
 
 
RCC_APB2ENR_TIM1EN: .word 0x4242032C
 
.word  _start
.global _start
_start:
 
mov r2, #1
ldrt r0, =PORT_C_ENABLEBIT
str r2, [r0]
 
 
ldr r0, =PORT_C_PIN13_MODE0BIT
str  r2, [r0]
 
mov r5, #1
ldr r0, =RCC_APB2ENR_TIM1EN
str r5, [r0]
 
ldr r0, =TIM1_PSC
ldr r1, =0b1000
str r1, [r0]
TIM1_CNT;  этот регистр как и автор я оставлю с его значение по умолчанию.
TIM_CR1_CEN==TIM1_CR1
ldr r0, =TIM1_CR1
mov r1, #1
str r1, [r0, #16];  bit DIR установлен в единицу.
mov r1, #0
str r1, [r0, #20]; bit CMS установлен в ноль. так счетчик будет считать от 65536 до 0.
 
mov r1, #1
str r1, [r0]; TIM1_CR1_CEN;  установлен в единуицу. так я включил отсчет.
 
loop:
 
b loop
что мне нужно дописать или изменить в этой программке, чтобы светодиод включался и выключался просто через какое-то заметное время? платка stm32f103c8

Добавлено через 14 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
включить в режим PWM
но кажется это нельзя сделать на PC13 пине. так говорят люди. я делаю все со встроеным светодиодом на платке stm32f103

Добавлено через 3 минуты
Цитата Сообщение от dimkra Посмотреть сообщение
И всё, светик на PC13 мигает
это гениально. но как мне это дописать в тот код на ассемблере? мне так будет понятнее. что нужно включить мне еще чтобы TIM1 работал с PC13? и светодиод мигал без ШИМ
0
2760 / 1271 / 166
Регистрация: 28.10.2011
Сообщений: 4,698
Записей в блоге: 6
05.06.2021, 18:52 9
Цитата Сообщение от pcmax Посмотреть сообщение
что мне нужно дописать или изменить в этой программке, чтобы светодиод включался и выключался просто через какое-то заметное время?
Вы знаете что такое прерывание?
Цитата Сообщение от pcmax Посмотреть сообщение
чтобы совершилось событие(светодиод изменил свое состояние) нужно прерывание.
Программу нужно переписать с нуля, по нормальному. Не знаю чему вас там учат, но явно не тому что нужно.
1
407 / 72 / 7
Регистрация: 29.01.2018
Сообщений: 1,086
05.06.2021, 19:58  [ТС] 10
Цитата Сообщение от locm Посмотреть сообщение
Программу нужно переписать с нуля, по нормальному. Не знаю чему вас там учат, но явно не тому что нужно.
скажите, что именно нужно дописать чтобы заработало. после я уже перепишу все правльно когда разберусь что к чему.
какое прерывание надо включить? можете дописать в код что выше?
0
2988 / 1795 / 358
Регистрация: 09.09.2017
Сообщений: 7,421
05.06.2021, 20:18 11
Цитата Сообщение от pcmax Посмотреть сообщение
PORT_C_ENABLEBIT .word 0x42420310
PORT_C_PIN13_MODE0BIT .word 0x422200d0
PORT_C_PIN13_OUTPUTBIT .word 0x422201b4
TIM1_PSC: .word 0x40012c28
TIM1_CR1: .word 0x42258000
Большая просьба: дайте Ассемблеру по шее и выкиньте bitband. Без него настраивать регистры гораздо проще. А что bitband'ом пользуется "элита", так вам что важнее эффектность или эффективность?
Цитата Сообщение от pcmax Посмотреть сообщение
это гениально. но как мне это дописать в тот код на ассемблере?
Какова ваша конечная цель? Научиться работать с контроллерами? Научиться писать на ассемблере? Сдать зачет и забыть?
Если просто работать с контроллерами для решения бытовых задач, то хватит какой-нибудь Ардуины или Куба.
Если понять как они устроены (ИМХО одна из важнейших целей), то ассемблер, даташиты, статьи, цифровая схемотехника. Может даже контроллер взять не stm32, а что-то попроще вроде AVR, PIC или 8051 - опыт получите тот же, но не придется продираться через монструозный даташит и не менее инопланетную логику stm32. Для тех же AVR есть прекрасный справочник Евстифеева, на русском - не говоря об учебниках или статьях.
Ну а если просто сдать зачет, так сразу и скажите. Тут, к сожалению, даже таким помогают.
1
407 / 72 / 7
Регистрация: 29.01.2018
Сообщений: 1,086
05.06.2021, 20:49  [ТС] 12
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Ассемблеру по шее и выкиньте
он переводится в другое учебное заведение.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
просто сдать зачет
у нас это не проходят. мы не изучаем МК. просто всем интересно даже девочкам. им интересней это чем Паскаль. мы просто хотим через TIM1 мигать светодиодом через 5 или 10 сек а после вмести попыаться разобрать код. нам кажется что вы очень хорошо разбираетесь в этом. можете из того нерабочего куска кода сделать рабочий?
0
2988 / 1795 / 358
Регистрация: 09.09.2017
Сообщений: 7,421
05.06.2021, 21:53 13
Цитата Сообщение от pcmax Посмотреть сообщение
мы просто хотим через TIM1 мигать светодиодом через 5 или 10 сек
А почему именно через TIM1? Если PC13 не подключен к аппаратному ШИМ (вы проверяли это, кстати?), то вообще без разницы какой таймер использовать.
Цитата Сообщение от pcmax Посмотреть сообщение
нам кажется что вы очень хорошо разбираетесь в этом. можете из того нерабочего куска кода сделать рабочий?
В ассемблере для ARM я не разбираюсь. То есть оценить дизасм куска своего кода смогу, предположить принцип работы чужого тоже, но написать свой с нуля - вряд ли.
Да и не нужно это: писать с нуля стоит для контроллеров поменьше, тех же AVR, там же можно этот ассемблер понять. А для мощных контроллеров обычно и код оказывается соответствующего размера. На ассемблере его элементарно устанешь писать. Проще на Си с его макросами и оптимизатором: если в полученный дизасм подглядывать, вполне можно донести до компилятора свою мысль.
И с другой стороны: работа с регистрами что на ассемблере, что на Си не очень-то отличается (если не лезть в bitband, конечно). А специфичные для ассемблера вещи вроде работы с многобайтными числами, стеком, уровнями доступа и т.п. вы по форуму вряд ли изучите.
Сейчас под рукой у меня есть кусок кода на Си, генерирующий прерывания с частотой около 1 кГц (использовал для теста микрофона в своей реализации USB). Могу его выложить, а вы, сверяясь с даташитом - разобраться как он работает и адаптировать под себя. Благо там пара строк кода, и те - настройки регистров.

Добавлено через 8 минут
Собственно, чего мне копипастить куски: https://github.com/COKPOWEHEU/... dio.c#L384 с 384 строки и до конца файла. На USB-шные функции внимания не обращайте, вам оно пока не надо. Еще может быть проблема с NVIC_EnableIRQ, но эта функция разворачивается всего лишь в
Код
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]
Думаю, Си-шный код все же нагляднее, если вас не пугают сдвиги и прочая битовая магия. Впрочем, если вы хотите понять контроллеры, как раз битовая магия - самое важное. Она там повсюду.

Добавлено через 1 минуту
Чуть не забыл: прерывания надо разрешить еще и глобально:
Код
__enable_irq()               { __ASM volatile ("cpsie i"); }
 8000baa:	b662      	cpsie	i
0
Модератор
1263 / 694 / 130
Регистрация: 23.07.2018
Сообщений: 2,268
Записей в блоге: 3
05.06.2021, 22:03 14
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
для мощных контроллеров обычно и код оказывается соответствующего размера. На ассемблере его элементарно устанешь писать. Проще на Си с его макросами и оптимизатором
Чтобы не устать, есть и альтернативный путь: выбростить ассемблеры, Сишные макросы и компоновщики и написать на любимом языке свой генератор подобных программок.

С симулятором такого устройства можно повозиться?
0
2760 / 1271 / 166
Регистрация: 28.10.2011
Сообщений: 4,698
Записей в блоге: 6
05.06.2021, 22:21 15
Цитата Сообщение от pcmax Посмотреть сообщение
мы не изучаем МК. просто всем интересно
Тогда почему асм? Для STM32 мало кто пишет на нем всю прогру - это не эффективно по затратам времени и сил. Пишут на ЯВУ и часто с применением библиотек потому что так намного проще и быстрее получить результат.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
И с другой стороны: работа с регистрами что на ассемблере, что на Си не очень-то отличается
Производитель предоставляет заголовочные файлы и библиотеки для Си. Для асма официальных не видел.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
прерывания надо разрешить еще и глобально
В STM32 они по умолчанию разрешены.
2
Тутошний я
2067 / 1134 / 209
Регистрация: 03.11.2009
Сообщений: 3,966
Записей в блоге: 2
05.06.2021, 22:28 16
по моему лучше начинать с простых таймеров.
в конце статьи есть ссылка и на продвинутые.
https://radiohlam.ru/stm32_15_1/
1
407 / 72 / 7
Регистрация: 29.01.2018
Сообщений: 1,086
06.06.2021, 00:32  [ТС] 17
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
В ассемблере для ARM я не разбираюсь.
нет проблем. все нормально.

Добавлено через 3 минуты
Цитата Сообщение от locm Посмотреть сообщение
Пишут на ЯВУ
спасибо что хоть не советуете бросить ассемблер и установить среду разработки. единственное что нам бы сейчас очень было кстати, это если кто-то бы сказал что именно нужно дописать в коде. Ребята, вижу, что тут таких нет, поэтому спрашивать одно и тоже я не буду у вас. просто спасибо и все.

Добавлено через 1 час 25 минут
Цитата Сообщение от pcmax Посмотреть сообщение
кто-то бы сказал что именно нужно дописать в коде.
уже не актуально. отбой.
0
2988 / 1795 / 358
Регистрация: 09.09.2017
Сообщений: 7,421
06.06.2021, 00:38 18
Цитата Сообщение от politoto Посмотреть сообщение
написать на любимом языке свой генератор подобных программок.
Это все же лишняя программа, которая повредит читаемости и переносимости. Так-то я был бы рад если бы в Си подвезли нормальный мкроязык, хотя бы с циклами и условиями.
Цитата Сообщение от politoto Посмотреть сообщение
С симулятором такого устройства можно повозиться?
Не понял. Симуляторов stm32 я не знаю. Что за устройство вы хотите симулировать тоже не понимаю.
Цитата Сообщение от locm Посмотреть сообщение
Тогда почему асм?
Боюсь, тут искать объективных причин не стоит. Как и приводить логичные и правильные доводы. Лучше не мешать людям самостоятельно найти достаточное количество граблей, после которого они дозреют попробовать новый подход.
Цитата Сообщение от locm Посмотреть сообщение
Производитель предоставляет заголовочные файлы и библиотеки для Си. Для асма официальных не видел.
Для небольших программ можно и руками написать адреса. Для побольше из opencm3 заголовочники подойти могут, хотя не уверен.
Цитата Сообщение от locm Посмотреть сообщение
В STM32 они по умолчанию разрешены.
Не знал, спасибо. Значит, при старте надо их отключать чтобы инициализацию не сбивали.
Цитата Сообщение от pcmax Посмотреть сообщение
спасибо что хоть не советуете бросить ассемблер и установить среду разработки.
Советуем. Но вы же не послушаетесь, ведь так?
Цитата Сообщение от pcmax Посмотреть сообщение
если кто-то бы сказал что именно нужно дописать в коде.
Я же привел пример кода. Переписать его на ассемблере несложно, добавить в обработчик прерывания мигалку тоже.
Цитата Сообщение от pcmax Посмотреть сообщение
вижу, что тут таких нет, поэтому спрашивать одно и тоже я не буду у вас.
Вы точно не Ассемблер? Потому что у него любимый прием обвинить всех вокруг в некомпетентности и снисходительно пообещать "помочь разобраться".
1
407 / 72 / 7
Регистрация: 29.01.2018
Сообщений: 1,086
06.06.2021, 02:44  [ТС] 19
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
обвинить всех вокруг в некомпетентности и снисходительно пообещать "помочь разобраться".
да он в vk уже писал в нашу группу. ну а так с кем поведешься....

Добавлено через 18 минут
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Я же привел пример кода.
для меня это ни о чем не говорит. это мой товарищ так умеет. ему надо пример и только пример. мне тоже пример помогает, но одного приимера для меня, как правило мало. а ему норм. ну и наверное если уж пример, то он должен быть цельным, и отвечать на вопрос. ну вот вы, допустим спрашиваете: что такое поле класса? и как они связаны с объектом?
на словах и по учебникам сложно понять. но можно на примере разъяснить
Код
class my{
public:
int a; // это поле класса
int b;// это тоже поле класса
void metod(void); //метод класса
};
class my{int a; int b; void metod(void);};  - все что внутир скобок -это есть описание объекта. то из чего он состоит. class my{} -это как окошко через которое мы можем заглянуть внутрь объекта. вот это class {}-  это описание объекта, описание его устройста.  это не класс. потому что класс-это набор объектов по определению. (object1, object2, object3)-вот это уже класс. допустим массив объектов-есть класс понастоящему.    думаю, что примеры должны быть такими.
0
Модератор
1263 / 694 / 130
Регистрация: 23.07.2018
Сообщений: 2,268
Записей в блоге: 3
06.06.2021, 06:50 20
Для начала я бы попробовал удалить или заменить глубокомысленным комментарием
Assembler
6
.section .text
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.06.2021, 06:50

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Работа с двумя таймерами
Кто-нибудь знает как работать с таймерами???!!! Если да, помогите, пожалуйста, написать код по...

Работа с таймерами в Xmega
Добрый день. Помогите пожалуйста с настройкой таймеров Xmego32A4. Что то я в этих регистрах...

Работа с таймерами (ATMega48)
Всем привет. Помогите, пожалуйста, написать код программы для Atmega48. (Для формирования...

Работа с двумя таймерами
Вопрос. Есть необходимость работы с двумя таймерами. Но с разным приоритетом. Так, чтобы один...

Работа с таймерами - процессы
Добрый вечер, форумчане! Я новичок в с++ Недавно начал осваивать linux. Мои успехи пока что...

Работа с таймерами и стилями
Доброе время суток,уважаемые программисты. Есть следующая задача. 1. Через t1 окно изменяет стиль,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.