STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Хотя, да. Согласен.
Реклама
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

В данный момент проверить никак, а вопрос чешется. Суть же вот в чем: на F0 два канала таймера в режиме захвата можно скоммутировать к одному входному пину. Так делают, например, для того, чтобы измерять период следования и длительность импульсов на этом входе. Метода простая, понятная и есть масса информации по данному вопросу. Мне же тут подумалось о другом: что получится, если с первого канала к данному пину подключить не вход, а выход, предварительно переведя канал на формирование шим-сигнала ? Будет второй канал иметь возможность делать захват фронтов этого шим-сигнала? А такой же захват, если первый канал отключить и дрыгать пином "вручную" ? Чет нифига в интернетах не могу найти подробностей на эту тему.
Реклама
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

[uquote="a5021",url="/forum/viewtopic.php?p=3628253#p3628253"]А чем проще-то ? Четыре строки против трех[/uquote]например отсутствием неочевидных конструкций а-ля "я у мамы кулхацкер" :dont_know:
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Что такое "неочевидные конструкции" ? Для кого они "неочевидные"?
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Да для тебе же самого. Мы то поржём и дальше пойдём, а тебе в этом вариться. За примером далеко ходить не надо. Ты так и не объяснил, зачем вместо простого

Код: Выделить всё

for(;;) GPIOC->ODR = TIM2->CNT & GPIO_ODR_ODR13;
пишешь подобную дичь?

Код: Выделить всё

for(__O int *i = &GPIOC->ODR;; *i = TIM2->CNT & GPIO_ODR_ODR13);
Думаешь страница перевернулась и все забыли?

Так вот, простой и понятный код:
- содержит меньше ошибок;
- проще отлаживать и в последствии сопровождать;
- лучше переносим;
- более эффективно оптимизируется компилятором;
- и т.д. и т.п.
Реклама
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3629832#p3629832"]Да для тебе же самого. Мы то поржём и дальше пойдём, а тебе в этом вариться. За примером далеко ходить не надо. Ты так и не объяснил, зачем вместо простого

Код: Выделить всё

for(;;) GPIOC->ODR = TIM2->CNT & GPIO_ODR_ODR13;
пишешь подобную дичь?

Код: Выделить всё

for(__O int *i = &GPIOC->ODR;; *i = TIM2->CNT & GPIO_ODR_ODR13);
Думаешь страница перевернулась и все забыли?[/uquote]
Я думаю, что вы не смогли разобраться, вам обидно и от этого гоните волну. Забыли/незабыли -- воопрос вообще не стоит. Вопрос здесь больше в том, зачем вы смешиваете два разных случая и делаете вид, будто это один? Набросить, хоть чего нибудь? Ваше право.
Так вот, простой и понятный код:
- содержит меньше ошибок;
...
Похоже на "заговор на удачу".
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Тревожный звоночек.

Раз[uquote="Oxford",url="/forum/viewtopic.php?p=3623298#p3623298"]Вы лучше аппаратуру, OS, драйверы изучайте и пишите хорошо. Книжки почитайте.[/uquote]

Два[uquote="VladislavS",url="/forum/viewtopic.php?p=3626725#p3626725"]Для начала, лишает автора премии.[/uquote]

Три[uquote="Reflector",url="/forum/viewtopic.php?p=3628283#p3628283"]Больше на 2 строки, но понятно и никто волнистой линией ничего не подчеркивает :)[/uquote]

Четыре[uquote="arkhnchul",url="/forum/viewtopic.php?p=3629194#p3629194"]например отсутствием неочевидных конструкций а-ля "я у мамы кулхацкер" :dont_know:[/uquote]
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

А по сути ничего, как обычно.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

[uquote="a5021",url="/forum/viewtopic.php?p=3628186#p3628186"]Компактный код для организации микросекундных задержек по таймеру на STM32F0:

Код: Выделить всё

__STATIC_INLINE void udelay(uint32_t micros) {
  TIM14->SR = TIM14->CNT = 0;
  TIM14->ARR = micros * 8 - 1;
  while (TIM14->CR1 = TIM14->SR + 1 & TIM_SR_UIF) { ; }
}
Можно даже без оформления в процедуру или макрос вставлять в текст программы по мере надобности. Подразумевается, что рабочая частота мк равна 8мгц и тактирование TIM14 включено. Из любопытного, советую обратить внимание на то, каким образом запускается и останавливается таймер. Чем то это напоминает "трюк" из предыдущей загадки. Специалистам по предупреждениям компилятора уже можно начинать голосить. Тут тоже будет предупреждение внутри while().[/uquote]

Этим занимается операционная система из коробки. Время было потрачено в пустую. Она даже в тиках умеет это делать.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

И как называется сия "операционная система" ?
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

Коллеги, а подскажите, плз, как по-быстрому перезапустить программу с самого начала, с начальной загрузкой указателя стека, очисткой всех полей и пр.?
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

afz, установить 1 в бите SYSRESETREQ регистра SCB_AIRCR, выполнить команду DSB и ждать, пока система не перезапустится.
Например, так:

Код: Выделить всё

SCB->AIRCR = 0x05FA0004;
__DSB();
while(1);
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

есть готовая функция CMSIS:
NVIC_SystemReset();

Код: Выделить всё

__STATIC_INLINE void NVIC_SystemReset(void)
{
  __DSB();                                                          /* Ensure all outstanding memory accesses included
                                                                       buffered write are completed before reset */
  SCB->AIRCR  = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
                 SCB_AIRCR_SYSRESETREQ_Msk);
  __DSB();                                                          /* Ensure completion of memory access */

  for(;;)                                                           /* wait until reset */
  {
    __NOP();
  }
}
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 354
Зарегистрирован: Чт июл 24, 2014 23:09:23
Откуда: Киев

Сообщение hosturik »

Подскажите, можно ли динамически, не прекращая работу МК менять делитель PLL при работе от RC генератора (HSI) или это не возможно?
В одном из проектов нужно менять частоту ШИМ от 1730 до 1800 килогерц с шагом не более 4 КГц
С помощью одного только делителя таймера и регистра HSITRIM этого невозможно добиться, они друг друга не перекрывают.

Что я имею ввиду.
Например у нас частота (после PLL) 48 МГц,
делитель=27, HSITRIM=0, частота ШИМ при этом 1754 КГц
делитель=28, HSITRIM=31, частота ШИМ при этом 1734 КГц
То есть получается ступенька, перекрытия не происходит.
Но если сделать частоту МК 44 МГц (уменьшив делитель PLL на единицу), то можно будет получить частоты между 1734 и 1754 КГц
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Можно. Особенно если тип МК указать.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 354
Зарегистрирован: Чт июл 24, 2014 23:09:23
Откуда: Киев

Сообщение hosturik »

МК STM32F030C8T6

Я еще раз внимательно прочитал RM и судя по всему все таки можно.
Но нужно сначала отключить PLL поменять множитель и потом обратно его включить.
Только вот непонятно, получается что МК какое то время будет работать на очень низкой частоте чего хотелось бы избежать
Из за этого нарушиться работа всех таймеров (а используются почти все таймеры кроме TIM1) и дисплей будет очень медленно обновляться, он подключен по SPI и скорость UART будет неправильная
Теоретически можно одновременно с отключением PLL пересчитать делители всех таймеров и на время использовать их, а после все вернуть обратно (с учетом более низкой частоты МК)
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="hosturik",url="/forum/viewtopic.php?p=3642305#p3642305"]Например у нас частота (после PLL) 48 МГц,
делитель=27, HSITRIM=0, частота ШИМ при этом 1754 КГц[/uquote]
Уверен, что 1754 KHz - это именно частота ШИМа?
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 354
Зарегистрирован: Чт июл 24, 2014 23:09:23
Откуда: Киев

Сообщение hosturik »

Да, по рассчетам вот так получается, реально тоже все похоже на правду
(48 000 000-(40 000*16))/27 = 1 754 074 Гц
40000 это значение на сколько изменяется частота RC генератора при изменении HSITRIM на единицу
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="hosturik",url="/forum/viewtopic.php?p=3642446#p3642446"]Да, по рассчетам вот так получается, реально тоже все похоже на правду
(48 000 000-(40 000*16))/27 = 1 754 074 Гц[/uquote]
Это мои сомнения не развеяло :) Если, допустим, нужно на этом ШИМе меандр генерить, естественно с частотой 1'754'074 Гц, что будет в CCR?
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 354
Зарегистрирован: Чт июл 24, 2014 23:09:23
Откуда: Киев

Сообщение hosturik »

Для меандра (не совсем идеального, но в моем случае не критично) я делаю вот так
TIM3->PSC = 0;
TIM3->ARR = 27;
TIM3->CCR1 = (uint32_t)(TIM3->ARR / 2);

Возможно я неправильно выразился, написав что предделитель у меня 27, я имел ввиду регистр автоперезагрузки (ARR = 27)
Ответить

Вернуться в «ARM»