STM32 новичку в ARM что к чему
Re: STM32 новичку в ARM что к чему
[uquote="VladislavS",url="/forum/viewtopic.php?p=3626914#p3626914"]Ну вот объясни, зачем было марать нам мониторы вот этой какашкой[/uquote]
Отдыхайте, товарищ, праздники все-таки. Предлагаю лучше подождать, когда кто-нибудь разглядит в чем фишка.
Отдыхайте, товарищ, праздники все-таки. Предлагаю лучше подождать, когда кто-нибудь разглядит в чем фишка.
- Реклама
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
Ok, давай сделаем многозначительную паузу. Глядишь от этого цикл из трёх ассемблерных команд заиграет новыми красками 
Re: STM32 новичку в ARM что к чему
То-то смеху будет, когда заиграет. Не ухудшайте своего бедственного положения, мой вам совет.
Re: STM32 новичку в ARM что к чему
Подскажите пожалуйста, есть прошивка для STM32F042C4T6, тактируется от внешнего кварца на 16мГц. Будет ли она работать в чипе STM32F072C8T6?
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
- Реклама
Re: STM32 новичку в ARM что к чему
Спасибо!
Re: STM32 новичку в ARM что к чему
Компактный код для организации микросекундных задержек по таймеру на STM32F0:
Можно даже без оформления в процедуру или макрос вставлять в текст программы по мере надобности. Подразумевается, что рабочая частота мк равна 8мгц и тактирование TIM14 включено. Из любопытного, советую обратить внимание на то, каким образом запускается и останавливается таймер. Чем то это напоминает "трюк" из предыдущей загадки. Специалистам по предупреждениям компилятора уже можно начинать голосить. Тут тоже будет предупреждение внутри while().
Код: Выделить всё
__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) { ; }
}Re: STM32 новичку в ARM что к чему
[uquote="a5021",url="/forum/viewtopic.php?p=3628186#p3628186"]Компактный код для организации микросекундных задержек по таймеру на STM32F0[/uquote]
Так не проще?
Так не проще?
Код: Выделить всё
__STATIC_INLINE void udelay(uint32_t us)
{
TIM14->CNT = 0;
TIM14->CR1 = TIM_CR1_CEN;
while (TIM14->CNT < us * 8 - 6) {}
TIM14->CR1 = 0;
}
Re: STM32 новичку в ARM что к чему
А чем проще-то ? Четыре строки против трех. Какие-то шестерки неизвестного свойства. Да и не по канону как-то -- таймер в железе умеет считать до нужной позиции, чтобы не заниматься этим в софтах.
Re: STM32 новичку в ARM что к чему
[uquote="a5021",url="/forum/viewtopic.php?p=3628253#p3628253"]А чем проще-то ? Четыре строки против трех. Какие-то шестерки неизвестного свойства.[/uquote]
Мой пример предельно простой, генерируемый код будет чуть меньше и никаких предупреждений компилятора(у меня еще и подчеркивание добавляется). Шестерка там нашару взята, чтобы примерно компенсировать время прошедшее после чтения CNT, но она точно лучше единички.
Мой пример предельно простой, генерируемый код будет чуть меньше и никаких предупреждений компилятора(у меня еще и подчеркивание добавляется). Шестерка там нашару взята, чтобы примерно компенсировать время прошедшее после чтения CNT, но она точно лучше единички.
Re: STM32 новичку в ARM что к чему
Тогда так:
или даже так:

Код: Выделить всё
__STATIC_INLINE void u_delay(uint32_t us) {
TIM14->CNT = 0;
while (TIM14->CR1 = (TIM14->CNT < us * 8 - 6)) { ; }
}Код: Выделить всё
#define U_DELAY(US) for(TIM14->CNT = 0; TIM14->CR1 = TIM14->CNT < (US) * 8 - 6;) { ; }Re: STM32 новичку в ARM что к чему
[uquote="a5021",url="/forum/viewtopic.php?p=3628274#p3628274"]Тогда так:[/uquote]
Вообще ты прав, правильнее проверять флаг, потому что если задана большая задержка и какое-то тяжелое прерывание будет длиться до переполнения таймера, то он начнет ждать по-новой... Но тогда уже так, в байтах все равно размер одинаковый:
Больше на 2 строки, но понятно и никто волнистой линией ничего не подчеркивает 
Вообще ты прав, правильнее проверять флаг, потому что если задана большая задержка и какое-то тяжелое прерывание будет длиться до переполнения таймера, то он начнет ждать по-новой... Но тогда уже так, в байтах все равно размер одинаковый:
Код: Выделить всё
__STATIC_INLINE void udelay(uint32_t micros)
{
TIM14->SR = TIM14->CNT = 0;
TIM14->ARR = micros * 8 - 1;
TIM14->CR1 = TIM_CR1_CEN;
while (!TIM14->SR) {}
TIM14->CR1 = 0;
}Re: STM32 новичку в ARM что к чему
Не. В этом варианте ошибка в
С первым тиком таймера в TIM14_SR встанет флаг CC1IF и цикл закончится.
Код: Выделить всё
while (!TIM14->SR) {}Re: STM32 новичку в ARM что к чему
[uquote="a5021",url="/forum/viewtopic.php?p=3628288#p3628288"]
С первым тиком таймера в TIM14_SR встанет флаг CC1IF и цикл закончится.[/uquote]
Нет, если в CCR1 ноль, но флаг выставится вместе с апдейтом, потому что там проверка на равенство, то что после первого цикла в счетчике станет 1 и она больше 0 значения не имеет.
Код: Выделить всё
while (!TIM14->SR) {}Нет, если в CCR1 ноль, но флаг выставится вместе с апдейтом, потому что там проверка на равенство, то что после первого цикла в счетчике станет 1 и она больше 0 значения не имеет.
Re: STM32 новичку в ARM что к чему
Хотя, да. Согласен.
Вопрос по таймеру в захвате
В данный момент проверить никак, а вопрос чешется. Суть же вот в чем: на F0 два канала таймера в режиме захвата можно скоммутировать к одному входному пину. Так делают, например, для того, чтобы измерять период следования и длительность импульсов на этом входе. Метода простая, понятная и есть масса информации по данному вопросу. Мне же тут подумалось о другом: что получится, если с первого канала к данному пину подключить не вход, а выход, предварительно переведя канал на формирование шим-сигнала ? Будет второй канал иметь возможность делать захват фронтов этого шим-сигнала? А такой же захват, если первый канал отключить и дрыгать пином "вручную" ? Чет нифига в интернетах не могу найти подробностей на эту тему.
Re: STM32 новичку в ARM что к чему
[uquote="a5021",url="/forum/viewtopic.php?p=3628253#p3628253"]А чем проще-то ? Четыре строки против трех[/uquote]например отсутствием неочевидных конструкций а-ля "я у мамы кулхацкер" 
Re: STM32 новичку в ARM что к чему
Что такое "неочевидные конструкции" ? Для кого они "неочевидные"?
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
Да для тебе же самого. Мы то поржём и дальше пойдём, а тебе в этом вариться. За примером далеко ходить не надо. Ты так и не объяснил, зачем вместо простого
пишешь подобную дичь?
Думаешь страница перевернулась и все забыли?
Так вот, простой и понятный код:
- содержит меньше ошибок;
- проще отлаживать и в последствии сопровождать;
- лучше переносим;
- более эффективно оптимизируется компилятором;
- и т.д. и т.п.
Код: Выделить всё
for(;;) GPIOC->ODR = TIM2->CNT & GPIO_ODR_ODR13;Код: Выделить всё
for(__O int *i = &GPIOC->ODR;; *i = TIM2->CNT & GPIO_ODR_ODR13);Так вот, простой и понятный код:
- содержит меньше ошибок;
- проще отлаживать и в последствии сопровождать;
- лучше переносим;
- более эффективно оптимизируется компилятором;
- и т.д. и т.п.
Re: STM32 новичку в ARM что к чему
[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);Я думаю, что вы не смогли разобраться, вам обидно и от этого гоните волну. Забыли/незабыли -- воопрос вообще не стоит. Вопрос здесь больше в том, зачем вы смешиваете два разных случая и делаете вид, будто это один? Набросить, хоть чего нибудь? Ваше право.
Похоже на "заговор на удачу".Так вот, простой и понятный код:
- содержит меньше ошибок;
...


