30.10.2017, 11:50
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Нужна функция delay на таймере для stm32f303
Всё гораздо проще. Никому эти "задержки на микросекунды" на СТМ32 и на не вперлись!
Если это нужно только для начального инита, то пофигу на чём и как делать, хоть на НОПах, это всё равно один раз. Если это протокол чего-либо, то тогда эти задержки - лютый моветон, ардуиновздроч, не предвещающий ничего хорошего. Правильнее будет юзать таймера. Слава богу их там хватает и они развитые.
Последний раз редактировалось STM32F0; 30.10.2017 в 11:53.
|
|
|
|
30.10.2017, 20:53
|
|
Прописка
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
|
Re: Нужна функция delay на таймере для stm32f303
Сообщение от MikhailSh
|
Правильно я понимаю, что DWT является частью ядра ARM, но в Сortex_M0 (STM32F0) ее нет
|
Верно. В -M0 нет отладочного таймера.
А про SysTick - вполне себе подходящий вариант. Работает этот таймер на частоте ядра (если не настраивался иначе), так что для получения микросекундных задержек нужно будет модифицировать процедуры ожидания для DWT.
Примерно так:
Код:
|
// Функцию оставляем
static __inline uint32_t delta(uint32_t t0, uint32_t t1) {
return (t1 - t0);
};
void delay_us(uint32_t us) {
uint32_t t0 = SysTick-›VAL;
uint32_t us_count_tic = us * (SystemCoreClock/1000000);
while (delta(t0, SysTick-›VAL) ‹ us_count_tic) ;
}; |
Разве что придётся учитывать, что systick 24 битный. Работать будет, но только в определённых условиях и нужно отполировать.
|
|
|
|
30.10.2017, 22:42
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Нужна функция delay на таймере для stm32f303
Господи, это ярчайший пример как делать не нужно, ни в коем случае. Не, ну если устроит точность +- растоптанный лапоть, то тогда точно можно.
Особенно умиляет
Код:
|
while (delta(t0, SysTick-›VAL) ‹ us_count_tic) ; |
Это просто рукалицо!
|
|
|
|
30.10.2017, 22:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,581
Сказал спасибо: 115
Сказали Спасибо 806 раз(а) в 583 сообщении(ях)
|
Re: Нужна функция delay на таймере для stm32f303
STM32F0, да ладно. Я вот тоже нарукожопил когда-то:
Код:
|
void shutter_wait_block(uint32_t us, void(*fn_ready)()){
if(!fn_ready) return;
us *= 72;
// wait for us*72 cycles
SCB_DEMCR |= 0x01000000;
DWT_CYCCNT = 0;
DWT_CONTROL|= 1;
while(DWT_CYCCNT ‹ us);
fn_ready();
} |
__________________
Смерть бандеровской мразоте!
|
|
|
|
30.10.2017, 23:01
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Нужна функция delay на таймере для stm32f303
Сообщение от eddy
|
да ладно
|
Да мне тем более "да ладно". Хоть в гамаке дро....те и стоя, в водолазном костюме.
|
|
|
|
30.10.2017, 23:13
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,839
Сказал спасибо: 2,530
Сказали Спасибо 11,764 раз(а) в 5,895 сообщении(ях)
|
Re: Нужна функция delay на таймере для stm32f303
Сообщение от STM32F0
|
Хоть в гамаке дро....те и стоя, в водолазном костюме.
|
Гы! Богатый опыт... Трудно соревноваться...
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
03.01.2018, 21:36
|
|
Частый гость
Регистрация: 14.05.2014
Адрес: Новосибирск
Сообщений: 11
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Нужна функция delay на таймере для stm32f303
У меня так сделано!
void SysTick_Handler()
{
if (TimingDelay != 0) { TimingDelay--; }
}
void delay_ms(uint32_t mSecs)
{
SysTick_Config(SystemCoreClock / DELAY_TICK_FREQUENCY_MS); // DELAY_TICK_FREQUENCY_MS
TimingDelay = mSecs+1;
while (TimingDelay != 0);
}
void delay_us(uint32_t uSecs)
{
SysTick_Config(SystemCoreClock / DELAY_TICK_FREQUENCY_US); // DELAY_TICK_FREQUENCY_US
TimingDelay = uSecs;
while (TimingDelay != 0);
}
#include "stm32f30x.h"
#define __DELAY_H__
#ifdef __DELAY_H__
#define DELAY_TICK_FREQUENCY_US 1000000 /* = 1MHZ -› microseconds delay #define DELAY_TICK_FREQUENCY_US 1000000*/
#define DELAY_TICK_FREQUENCY_MS 1000 /* = 1kHZ -› milliseconds delay #define DELAY_TICK_FREQUENCY_MS 1000*/
static __IO uint32_t TimingDelay;
extern void delay_ms(uint32_t nTime);
extern void delay_us(uint32_t nTime);
#endif
|
|
|
|
04.01.2018, 12:15
|
|
Прописка
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
|
Re: Нужна функция delay на таймере для stm32f303
Довольно странное решение.
Как понимаю, время Вы не отсчитываете в этом случае.
Кстати, можете добавить в функциях ожидание прерывания - до кучи слегка снизите потребление энергии в ожидании.
Вот так:
PHP код:
|
void delay_us(uint32_t uSecs) {
SysTick_Config(SystemCoreClock / DELAY_TICK_FREQUENCY_US); // DELAY_TICK_FREQUENCY_US
TimingDelay = uSecs;
while (TimingDelay != 0) {
__WFI();
};
}
|
|
|
|
|
04.01.2018, 12:55
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Нужна функция delay на таймере для stm32f303
Сообщение от -Alan-
|
можете добавить в функциях ожидание прерывания - до кучи слегка снизите потребление энергии в ожидании.
|
Это просто круто!
Сообщение от -Alan-
|
Довольно странное решение.
|
Конкурс "Тупой и ещё тупее"(с) удался.
Кто ещё предложит дырочку в кристалле просверлить?
|
|
|
|
06.02.2018, 23:31
|
|
Прохожий
Регистрация: 06.02.2018
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Нужна функция delay на таймере для stm32f303
Порекомендуй что то дельное читабельное,
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 04:03.
|
|