Easyelectronics.ru

Электроника для всех
Текущее время: 05 июн 2020, 15:04

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 15 мар 2020, 16:17 
Заглядывает иногда

Зарегистрирован: 19 янв 2014, 16:42
Сообщения: 51
Всем привет!

Делаю задержку на таймерах STM32F103 без использования прерываний, тупой цикл ожидания флага переполнения. Такое нужно например при инициализации дисплеев, когда надо выдержать паузу несколько мс.
Данный кусок кода работает на F303, но на F103 че то не то, при включении таймера CEN=1 устанавливаются 5 флагов UIF и CC1IF - CC4IF, далее при сбросе UIF, он довольно быстро устанавливается опять.

Код:
void   delay_init(void)
{
   RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
   TIM3->CR1 |= TIM_CR1_OPM;
}

void   delay_ms(uint16_t ms)
{
   uint16_t prsc;
   
   SystemCoreClockUpdate();
   prsc = SystemCoreClock/1000 - 1; //core clock must be < 65MHz
   TIM3->PSC = prsc;
   
   TIM3->ARR = ms;
   TIM3->CR1 |= TIM_CR1_CEN;
   while( !(TIM3->SR & TIM_SR_UIF) );
   TIM3->SR &= ~TIM_SR_UIF;
}


Может кто то сталкивался с подобным?)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 15 мар 2020, 16:20 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Вообще, SystemCoreClock представляет частоту в численном значении. А PSC представляет период, или значение делителя частоты, иначе говоря. То есть, обратнопропорциональное значение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 15 мар 2020, 16:26 
Заглядывает иногда

Зарегистрирован: 19 янв 2014, 16:42
Сообщения: 51
BusMaster писал(а):
Вообще, SystemCoreClock представляет частоту в численном значении. А PSC представляет период, или значение делителя частоты, если иначе.

Всё так и по данной формуле выставляется нужное мне значение предделителя, для отсчёта миллисекунд.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 15 мар 2020, 16:27 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Значит, неверное значение SystemCoreCloc


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 15 мар 2020, 16:35 
Заглядывает иногда

Зарегистрирован: 19 янв 2014, 16:42
Сообщения: 51
BusMaster писал(а):
Значит, неверное значение SystemCoreCloc

Значение SystemCoreClock верное. Но дело не в значениях PSC, ARR, а в том, что не работает цикл ожидания установления флага UIF, так как он постоянно устанавливается сразу же после сброса, а не когда таймер отсчитает нужный, выставленный в регистрах PSC и ARR период.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 15 мар 2020, 16:36 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1182
Во-первых, какой смысл закладываться на то, что частота мк будет меньше 65 MHz, тем более для серий рассчитанных на 72 MHz... Во-вторых, PSC обновится после первого Update, т.е. первый вызов delay_ms() отработает значительно быстрее.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 15 мар 2020, 17:03 
Заглядывает иногда

Зарегистрирован: 19 янв 2014, 16:42
Сообщения: 51
Reflector писал(а):
Во-первых, какой смысл закладываться на то, что частота мк будет меньше 65 MHz, тем более для серий рассчитанных на 72 MHz... Во-вторых, PSC обновится после первого Update, т.е. первый вызов delay_ms() отработает значительно быстрее.


Если буферизация включена, то PSC обновится после Update, но она же выключена по умолчанию, значит, по идее, должен сразу обновляться.

Да 65 ограничение потому что регистры 2 байта)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 15 мар 2020, 17:11 
Заглядывает иногда

Зарегистрирован: 19 янв 2014, 16:42
Сообщения: 51
Вообще буферизацию можно отключить только у ARR регистра, а PSC всегда буферизуется, ты прав)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 15 мар 2020, 17:11 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1182
Heisenberg писал(а):
Вообще буферизацию можно отключить только у ARR регистра, а PSC всегда буферизуется, ты прав)

Именно так :) ARR и еще CCRx...

Цитата:
Да 65 ограничение потому что регистры 2 байта)

Это понятно, но через несколько дней ты забудешь про это ограничение и опять будут проблемы с тем, что пауза слишком короткая.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 15 мар 2020, 17:22 
Заглядывает иногда

Зарегистрирован: 19 янв 2014, 16:42
Сообщения: 51
Reflector писал(а):
Heisenberg писал(а):
Вообще буферизацию можно отключить только у ARR регистра, а PSC всегда буферизуется, ты прав)

Именно так :) ARR и еще CCRx...

Цитата:
Да 65 ограничение потому что регистры 2 байта)

Это понятно, но через несколько дней ты забудешь про это ограничение и опять будут проблемы с тем, что пауза слишком короткая.


Да, надо подредактировать функцию...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 16 мар 2020, 22:57 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 689
Доброго времени суток !

Я извиняюсь, а CNT у вас чему равен перед включением таймера ?

И еще не плохо бы SR сбросить перед включением таймера.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 17 мар 2020, 00:26 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 4787
Откуда: Кемеровская область, Киселевск
Я делаю однократный запуск так. на 103 работает отлично, генерирует импульсы микросекундные для ИК пульта.


Код:
TIM14->ARR = value;
TIM14->CR1 |= TIM_CR1_CEN|TIM_CR1_OPM;
while (TIM14->CR1 & TIM_CR1_CEN); //wait end count

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 18 мар 2020, 23:20 
Только пришел

Зарегистрирован: 14 мар 2018, 17:32
Сообщения: 22
При первом запуске таймера прерывание возникает не так, как ожидалось - причина этому случайное состояние теневых регистров (используются для внутренних целей). Поэтому делаем принудительное обновление с последующим сбросом флага изменения.

попробуй перед включением таймера добавить:

TIM2->EGR |= TIM_EGR_UG; // Reinitialize the counter and update of registers
TIM2->SR &= ~TIM_SR_UIF; // Clear update flag


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 19 мар 2020, 23:08 
Заглядывает иногда

Зарегистрирован: 19 янв 2014, 16:42
Сообщения: 51
Oxford писал(а):
Я делаю однократный запуск так. на 103 работает отлично, генерирует импульсы микросекундные для ИК пульта.


Код:
TIM14->ARR = value;
TIM14->CR1 |= TIM_CR1_CEN|TIM_CR1_OPM;
while (TIM14->CR1 & TIM_CR1_CEN); //wait end count

вариант


Я просто добавил в свой код, в инициализацию:
Код:
TIM2->EGR |= TIM_EGR_UG;
   TIM2->SR &= ~TIM_SR_UIF;

чтобы в PSC загрузилось нужное значение из буфера.
И всё нормально заработало на 103м.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 19 мар 2020, 23:23 
Заглядывает иногда

Зарегистрирован: 19 янв 2014, 16:42
Сообщения: 51
На 303м камне пытаюсь сделать вроде бы элементарную вещь, генерацию ШИМ, до 100Гц, с помощью таймера и обычного выхода, на такое решение есть свои причины.

Данный код работает на 103 камне без проблем:

Show


А на 303м вместо меандра 20Гц получается такая фигня:
Show


Смотрю отладчике Keil что происходит в прерывании, флаг UIF сбрасывается не каждый раз, при этом, даже когда сбрасывается, устанавливается сразу же опять, при нажатии F11 - step in to.
Не понимаю уже, куда копать...


Последний раз редактировалось Heisenberg 20 мар 2020, 15:05, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 19 мар 2020, 23:41 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1182
Попробуй строку сбрасывающую TIM_SR_UIF перенести в начало обработчика прерываний.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 20 мар 2020, 13:52 
Заглядывает иногда

Зарегистрирован: 19 янв 2014, 16:42
Сообщения: 51
Reflector писал(а):
Попробуй строку сбрасывающую TIM_SR_UIF перенести в начало обработчика прерываний.

Спасибо, дружище)
Где я туплю, флаг не успевает сбрасываться из-за выхода из прерывания?

Надо добавлять цикл ожидания сброса флага...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 20 мар 2020, 14:04 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1182
Heisenberg писал(а):
флаг не успевает сбрасываться из-за выхода из прерывания?
Надо добавлять цикл ожидания сброса флага...

Флаг не успевает сбрасываться и в прерывание сразу заходит снова(чем больше делитель на APB, тем большая задержка может потребоваться). Цикл не нужен, достаточно просто прочитать SR. Кстати, то же самое лучше сделать после установки TIM_EGR_UG, потому как последующая инструкция очистки флагов может быть выполнена до того, как они установятся, в результате UIF останется 1.
А хотя у тебя и так SR читается... Вообще достаточно в него 0 записать, тогда предварительно лучше из него прочитать:
Код:
TIM2->EGR = TIM_EGR_UG;
TIM2->SR;
TIM2->SR = 0;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 20 мар 2020, 15:15 
Заглядывает иногда

Зарегистрирован: 19 янв 2014, 16:42
Сообщения: 51
Reflector писал(а):
Цикл не нужен, достаточно просто прочитать SR. Кстати, то же самое лучше сделать после установки TIM_EGR_UG, потому как последующая инструкция очистки флагов может быть выполнена до того, как они установятся, в результате UIF останется 1.
А хотя у тебя и так SR читается...

В мануале не сказано, что чтобы сбросить UIF надо прочитать SR. Умолчали, гады?)
А где у меня читается?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 20 мар 2020, 15:20 
Заглядывает иногда

Зарегистрирован: 19 янв 2014, 16:42
Сообщения: 51
Или можно сделать так:
Код:
TIM6->EGR |= TIM_EGR_UG;
while( !(TIM6->SR & TIM_SR_UIF) )
   ;
TIM6->SR &= ~TIM_SR_UIF;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 20 мар 2020, 15:33 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1182
Heisenberg писал(а):
А где у меня читается?

Код:
TIM6->SR &= ~TIM_SR_UIF;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 20 мар 2020, 15:39 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1477
Heisenberg писал(а):
В мануале не сказано, что чтобы сбросить UIF надо прочитать SR. Умолчали, гады?)
Для того чтобы сбросить UIF не надо читать SR. Это вы сами придумали. Всё гораздо проще. Процессор работает на частоте выше чем шина, на которой таймер висит. За те несколько тактов что сбрасывается UIF процессор успевает выйти из прерывания и поймать его заново. Вполне достаточно команду сброса UIF поставить не последней в обработчике прерываний. Не надо ничего усложнять.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 20 мар 2020, 15:50 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1182
VladislavS писал(а):
Для того чтобы сбросить UIF не надо читать SR.

Это если речь о прерываниях, но у него UIF еще сбрасывается после установки TIM_EGR_UG. Для меандра не так важно сразу вызовется прерывание или нет, а если взять из начала темы код с паузой, то он уже может работать не правильно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 20 мар 2020, 15:51 
Заглядывает иногда

Зарегистрирован: 19 янв 2014, 16:42
Сообщения: 51
VladislavS писал(а):
Heisenberg писал(а):
Вполне достаточно команду сброса UIF поставить не последней в обработчике прерываний. Не надо ничего усложнять.

А если будет частота мегагерц 150, может тогда и не хватит поставить сброс флага раньше.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Проблемы с задержкой на таймере STM32F103 без прерывания.
СообщениеДобавлено: 20 мар 2020, 16:45 
Заглядывает иногда

Зарегистрирован: 19 янв 2014, 16:42
Сообщения: 51
Вот как работает отладка в Keil, хрен поймешь что происходит в регистрах.
Код:
PSC = 47999;
TIM6->DIER |= TIM_DIER_UIE;
TIM6->ARR = 1000/freq_ik/2;
TIM6->CR1 |= TIM_CR1_CEN;
TIM6->CNT = 0;

После включения таймера (CEN) значение CNT, наблюдаемое через отладчик сразу изменяется на 5-10 единиц, за время одной С команды, это при предделителе 48000)
То есть во время отладки таймер как будто не учитывает значение PSC, как будто он всегда =0.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу 1, 2  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB