STM32 новичку в ARM что к чему
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
- Реклама
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
В данный момент проверить никак, а вопрос чешется. Суть же вот в чем: на F0 два канала таймера в режиме захвата можно скоммутировать к одному входному пину. Так делают, например, для того, чтобы измерять период следования и длительность импульсов на этом входе. Метода простая, понятная и есть масса информации по данному вопросу. Мне же тут подумалось о другом: что получится, если с первого канала к данному пину подключить не вход, а выход, предварительно переведя канал на формирование шим-сигнала ? Будет второй канал иметь возможность делать захват фронтов этого шим-сигнала? А такой же захват, если первый канал отключить и дрыгать пином "вручную" ? Чет нифига в интернетах не могу найти подробностей на эту тему.
[uquote="a5021",url="/forum/viewtopic.php?p=3628253#p3628253"]А чем проще-то ? Четыре строки против трех[/uquote]например отсутствием неочевидных конструкций а-ля "я у мамы кулхацкер" 
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
Что такое "неочевидные конструкции" ? Для кого они "неочевидные"?
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Да для тебе же самого. Мы то поржём и дальше пойдём, а тебе в этом вариться. За примером далеко ходить не надо. Ты так и не объяснил, зачем вместо простого
пишешь подобную дичь?
Думаешь страница перевернулась и все забыли?
Так вот, простой и понятный код:
- содержит меньше ошибок;
- проще отлаживать и в последствии сопровождать;
- лучше переносим;
- более эффективно оптимизируется компилятором;
- и т.д. и т.п.
Код: Выделить всё
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
[uquote="VladislavS",url="/forum/viewtopic.php?p=3629832#p3629832"]Да для тебе же самого. Мы то поржём и дальше пойдём, а тебе в этом вариться. За примером далеко ходить не надо. Ты так и не объяснил, зачем вместо простого
пишешь подобную дичь?
Думаешь страница перевернулась и все забыли?[/uquote]
Я думаю, что вы не смогли разобраться, вам обидно и от этого гоните волну. Забыли/незабыли -- воопрос вообще не стоит. Вопрос здесь больше в том, зачем вы смешиваете два разных случая и делаете вид, будто это один? Набросить, хоть чего нибудь? Ваше право.
Код: Выделить всё
for(;;) GPIOC->ODR = TIM2->CNT & GPIO_ODR_ODR13;Код: Выделить всё
for(__O int *i = &GPIOC->ODR;; *i = TIM2->CNT & GPIO_ODR_ODR13);Я думаю, что вы не смогли разобраться, вам обидно и от этого гоните волну. Забыли/незабыли -- воопрос вообще не стоит. Вопрос здесь больше в том, зачем вы смешиваете два разных случая и делаете вид, будто это один? Набросить, хоть чего нибудь? Ваше право.
Похоже на "заговор на удачу".Так вот, простой и понятный код:
- содержит меньше ошибок;
...
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Тревожный звоночек.
Раз[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"]например отсутствием неочевидных конструкций а-ля "я у мамы кулхацкер"
[/uquote]
Раз[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="arkhnchul",url="/forum/viewtopic.php?p=3629194#p3629194"]например отсутствием неочевидных конструкций а-ля "я у мамы кулхацкер"
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="a5021",url="/forum/viewtopic.php?p=3628186#p3628186"]Компактный код для организации микросекундных задержек по таймеру на STM32F0:
Можно даже без оформления в процедуру или макрос вставлять в текст программы по мере надобности. Подразумевается, что рабочая частота мк равна 8мгц и тактирование TIM14 включено. Из любопытного, советую обратить внимание на то, каким образом запускается и останавливается таймер. Чем то это напоминает "трюк" из предыдущей загадки. Специалистам по предупреждениям компилятора уже можно начинать голосить. Тут тоже будет предупреждение внутри while().[/uquote]
Этим занимается операционная система из коробки. Время было потрачено в пустую. Она даже в тиках умеет это делать.
Код: Выделить всё
__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) { ; }
}Этим занимается операционная система из коробки. Время было потрачено в пустую. Она даже в тиках умеет это делать.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
Коллеги, а подскажите, плз, как по-быстрому перезапустить программу с самого начала, с начальной загрузкой указателя стека, очисткой всех полей и пр.?
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
afz, установить 1 в бите SYSRESETREQ регистра SCB_AIRCR, выполнить команду DSB и ждать, пока система не перезапустится.
Например, так:
Например, так:
Код: Выделить всё
SCB->AIRCR = 0x05FA0004;
__DSB();
while(1);
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
есть готовая функция CMSIS:
NVIC_SystemReset();
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();
}
}Подскажите, можно ли динамически, не прекращая работу МК менять делитель PLL при работе от RC генератора (HSI) или это не возможно?
В одном из проектов нужно менять частоту ШИМ от 1730 до 1800 килогерц с шагом не более 4 КГц
С помощью одного только делителя таймера и регистра HSITRIM этого невозможно добиться, они друг друга не перекрывают.
Что я имею ввиду.
Например у нас частота (после PLL) 48 МГц,
делитель=27, HSITRIM=0, частота ШИМ при этом 1754 КГц
делитель=28, HSITRIM=31, частота ШИМ при этом 1734 КГц
То есть получается ступенька, перекрытия не происходит.
Но если сделать частоту МК 44 МГц (уменьшив делитель PLL на единицу), то можно будет получить частоты между 1734 и 1754 КГц
В одном из проектов нужно менять частоту ШИМ от 1730 до 1800 килогерц с шагом не более 4 КГц
С помощью одного только делителя таймера и регистра HSITRIM этого невозможно добиться, они друг друга не перекрывают.
Что я имею ввиду.
Например у нас частота (после PLL) 48 МГц,
делитель=27, HSITRIM=0, частота ШИМ при этом 1754 КГц
делитель=28, HSITRIM=31, частота ШИМ при этом 1734 КГц
То есть получается ступенька, перекрытия не происходит.
Но если сделать частоту МК 44 МГц (уменьшив делитель PLL на единицу), то можно будет получить частоты между 1734 и 1754 КГц
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
МК STM32F030C8T6
Я еще раз внимательно прочитал RM и судя по всему все таки можно.
Но нужно сначала отключить PLL поменять множитель и потом обратно его включить.
Только вот непонятно, получается что МК какое то время будет работать на очень низкой частоте чего хотелось бы избежать
Из за этого нарушиться работа всех таймеров (а используются почти все таймеры кроме TIM1) и дисплей будет очень медленно обновляться, он подключен по SPI и скорость UART будет неправильная
Теоретически можно одновременно с отключением PLL пересчитать делители всех таймеров и на время использовать их, а после все вернуть обратно (с учетом более низкой частоты МК)
Я еще раз внимательно прочитал RM и судя по всему все таки можно.
Но нужно сначала отключить PLL поменять множитель и потом обратно его включить.
Только вот непонятно, получается что МК какое то время будет работать на очень низкой частоте чего хотелось бы избежать
Из за этого нарушиться работа всех таймеров (а используются почти все таймеры кроме TIM1) и дисплей будет очень медленно обновляться, он подключен по SPI и скорость UART будет неправильная
Теоретически можно одновременно с отключением PLL пересчитать делители всех таймеров и на время использовать их, а после все вернуть обратно (с учетом более низкой частоты МК)
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="hosturik",url="/forum/viewtopic.php?p=3642305#p3642305"]Например у нас частота (после PLL) 48 МГц,
делитель=27, HSITRIM=0, частота ШИМ при этом 1754 КГц[/uquote]
Уверен, что 1754 KHz - это именно частота ШИМа?
делитель=27, HSITRIM=0, частота ШИМ при этом 1754 КГц[/uquote]
Уверен, что 1754 KHz - это именно частота ШИМа?
Да, по рассчетам вот так получается, реально тоже все похоже на правду
(48 000 000-(40 000*16))/27 = 1 754 074 Гц
40000 это значение на сколько изменяется частота RC генератора при изменении HSITRIM на единицу
(48 000 000-(40 000*16))/27 = 1 754 074 Гц
40000 это значение на сколько изменяется частота RC генератора при изменении HSITRIM на единицу
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="hosturik",url="/forum/viewtopic.php?p=3642446#p3642446"]Да, по рассчетам вот так получается, реально тоже все похоже на правду
(48 000 000-(40 000*16))/27 = 1 754 074 Гц[/uquote]
Это мои сомнения не развеяло
Если, допустим, нужно на этом ШИМе меандр генерить, естественно с частотой 1'754'074 Гц, что будет в CCR?
(48 000 000-(40 000*16))/27 = 1 754 074 Гц[/uquote]
Это мои сомнения не развеяло
Для меандра (не совсем идеального, но в моем случае не критично) я делаю вот так
TIM3->PSC = 0;
TIM3->ARR = 27;
TIM3->CCR1 = (uint32_t)(TIM3->ARR / 2);
Возможно я неправильно выразился, написав что предделитель у меня 27, я имел ввиду регистр автоперезагрузки (ARR = 27)
TIM3->PSC = 0;
TIM3->ARR = 27;
TIM3->CCR1 = (uint32_t)(TIM3->ARR / 2);
Возможно я неправильно выразился, написав что предделитель у меня 27, я имел ввиду регистр автоперезагрузки (ARR = 27)


