Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Удаленная работа
Помощь проекту


 
Опции темы
Непрочитано 07.05.2019, 17:41  
Alexan.dr
Прохожий
 
Регистрация: 11.04.2019
Сообщений: 8
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Alexan.dr на пути к лучшему
По умолчанию Задержка на DWT не соответствует реальности

Приветствую всех. На stm32f4 делаю задержку на полсекунды путем зацикливания в while на нужное количество тактов контроллера. Проверяю счетчик CYCCNT, там столько натикало, сколько должно, но светодиод меняет свое состояние реже. Цифровой анализатор 1.3 сек выдает. Что это? Как это понимать?
Пробовал и SysTick, но не нравятся его частые прерывания, да и такая же хрень. FOR можно подобрать, но это костыль. Не настало еще их время
Реклама:
Alexan.dr вне форума  
Непрочитано 07.05.2019, 18:12  
Alexan.dr
Прохожий
 
Регистрация: 11.04.2019
Сообщений: 8
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Alexan.dr на пути к лучшему
По умолчанию Re: Задержка на DWT не соответствует реальности

В system_stm32f4xx.c поменял коэффициенты для тактирования на 160 МГц. Да, если сделать DeInit_RCC(), то все мигает правильно, но почему сейчас за 500 мс насчитывает 80 млн. и при этом пауза более секунды?

Нажмите, чтобы открыть спойлер

#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"

uint32_t CountSystemTick = 0; // счетчик тактов МК

void Init_GPIO_LED(void);
void Delay_us(uint32_t ms);

/************************************************** ****************/
int main()
{
// Data Watchpoint and Trace unit
CoreDebug->DEMCR|=CoreDebug_DEMCR_TRCENA_Msk; // включаем
DWT->CTRL|= DWT_CTRL_CYCCNTENA_Msk; // запускаем

while(1)
{
DWT->CYCCNT = 0; // обнуляем

GPIO_ToggleBits(GPIOA,GPIO_Pin_5);
Delay_us(500);

CountSystemTick = DWT->CYCCNT; // сохраняем
}
}

/************************************************** *****************/
void Delay_us(uint32_t ms)
{
uint32_t start = DWT->CYCCNT;
ms = ms*(SystemCoreClock/1000);
while((DWT->CYCCNT - start) < ms);
}

void Init_GPIO_LED(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE );

GPIO_InitTypeDef Init_GPIO_LED;
Init_GPIO_LED.GPIO_Pin = GPIO_Pin_5;
Init_GPIO_LED.GPIO_Mode = GPIO_Mode_OUT;
Init_GPIO_LED.GPIO_OType = GPIO_OType_PP;
Init_GPIO_LED.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOA,&Init_GPIO_LED);

GPIO_SetBits(GPIOA,GPIO_Pin_5);
}

Alexan.dr вне форума  
Непрочитано 07.05.2019, 21:30  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 7,694
Сказал спасибо: 7,824
Сказали Спасибо 2,405 раз(а) в 1,857 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Задержка на DWT не соответствует реальности

Для такого ногодрыга светодиодом вполне хватило бы одного NE556 с минимумом обвязки. F4 тут сильно больше электронного микроскопа получается

Вы прерывания запрещали в том цикле? И проверяли их обработку с коррекцией счетчика цикла?
Таймеры собственно для этой цели и существуют - дабы время процессора использовать с большим смыслом…
И совсем не зря их там не один предусмотрен, да ещё и режимов у них множество…

Устанавливаете и запускаете таймер, в его обработчике взводите флаг, ждёте в нужном месте (если так устроена логика) и продолжаете, иначе можно заняться другими делами.

Посмотрите на работу вариаций функции delay…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при малом числе вариантов…
mike-y-k вне форума  
Непрочитано 07.05.2019, 21:57  
scorpi_0n
Прописка
 
Регистрация: 10.03.2016
Сообщений: 110
Сказал спасибо: 14
Сказали Спасибо 44 раз(а) в 40 сообщении(ях)
scorpi_0n на пути к лучшему
По умолчанию Re: Задержка на DWT не соответствует реальности

Сообщение от mike-y-k Посмотреть сообщение
Вы прерывания запрещали в том цикле? И проверяли их обработку с коррекцией счетчика цикла?
Не прикалывайтесь так цинично над начинающим. DWT пофигу что там и как, он тупо считает циклы в CYCCNT, независимо, есть там прерывания или нет.
scorpi_0n вне форума  
Сказали "Спасибо" scorpi_0n
mike-y-k (08.05.2019)
Непрочитано 07.05.2019, 23:37  
ProtAS-13
Прописка
 
Регистрация: 17.03.2015
Сообщений: 145
Сказал спасибо: 0
Сказали Спасибо 123 раз(а) в 66 сообщении(ях)
ProtAS-13 на пути к лучшему
По умолчанию Re: Задержка на DWT не соответствует реальности

Сообщение от Alexan.dr Посмотреть сообщение
В system_stm32f4xx.c поменял коэффициенты для тактирования на 160 МГц. ... но почему сейчас за 500 мс насчитывает 80 млн.
т.к. SystemCoreClock=160MHz=160000000
и ms=500, то
ms=ms*(SystemCoreClock/1000)=500*160000000/1000=80000000
Т.е., что хотели - того и добились
ProtAS-13 вне форума  
Сказали "Спасибо" ProtAS-13
mike-y-k (08.05.2019)
Непрочитано 07.05.2019, 23:40  
Alexan.dr
Прохожий
 
Регистрация: 11.04.2019
Сообщений: 8
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Alexan.dr на пути к лучшему
По умолчанию Re: Задержка на DWT не соответствует реальности

Сообщение от mike-y-k Посмотреть сообщение
Для такого ногодрыга светодиодом вполне хватило бы одного NE556 с минимумом обвязки. F4 тут сильно больше электронного микроскопа получается

Вы прерывания запрещали в том цикле? И проверяли их обработку с коррекцией счетчика цикла?
Таймеры собственно для этой цели и существуют - дабы время процессора использовать с большим смыслом…
И совсем не зря их там не один предусмотрен, да ещё и режимов у них множество…

Устанавливаете и запускаете таймер, в его обработчике взводите флаг, ждёте в нужном месте (если так устроена логика) и продолжаете, иначе можно заняться другими делами.

Посмотрите на работу вариаций функции delay…
И не лень же Вам столько писать о том, как я иначе это мог бы сделать. Так называемый ногодрыг - не конечная цель.
По умолчанию все прерывания запрещены и ощущение, что какая-то неразбериха с тактированием. Таймерами проверял, там тоже странно всё при тактировании от кварца. Но опять же, таймер - это ножка, таймер - это прерывания. Мне нужно именно "зависнуть" в программе
Еще один вариант еще не успели предложить - библиотеку HAL. Заранее скажу, что только SPL интересует
Alexan.dr вне форума  
Непрочитано 07.05.2019, 23:44  
Alexan.dr
Прохожий
 
Регистрация: 11.04.2019
Сообщений: 8
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Alexan.dr на пути к лучшему
По умолчанию Re: Задержка на DWT не соответствует реальности

Сообщение от ProtAS-13 Посмотреть сообщение
т.к. SystemCoreClock=160MHz=160000000
и ms=500, то
ms=ms*(SystemCoreClock/1000)=500*160000000/1000=80000000
Т.е., что хотели - того и добились
Так а почему светодиод мигает не с задержкой 500 мс? )) сделал 80 млн тактов на частоте 160 млн, а светодиод не переключается ((

Последний раз редактировалось Alexan.dr; 07.05.2019 в 23:48.
Alexan.dr вне форума  
Непрочитано 08.05.2019, 00:33  
ProtAS-13
Прописка
 
Регистрация: 17.03.2015
Сообщений: 145
Сказал спасибо: 0
Сказали Спасибо 123 раз(а) в 66 сообщении(ях)
ProtAS-13 на пути к лучшему
По умолчанию Re: Задержка на DWT не соответствует реальности

Сообщение от Alexan.dr Посмотреть сообщение
Так а почему светодиод мигает не с задержкой 500 мс? )) сделал 80 млн тактов на частоте 160 млн, а светодиод не переключается ((
Дык, кто-же знает, что у Вас там еще понаписано в коде.
Могу лишь предположить, что SystemCoreClock не соответствует РЕАЛЬНОЙ частоте.
Копайте код, выведите частоту SYSCLK на MCO2 и проверьте, действительно ли там нужная частота.
ProtAS-13 вне форума  
Эти 2 пользователя(ей) сказали Спасибо ProtAS-13 за это сообщение:
Alexan.dr (08.05.2019), mike-y-k (08.05.2019)
Непрочитано 08.05.2019, 02:40  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 7,694
Сказал спасибо: 7,824
Сказали Спасибо 2,405 раз(а) в 1,857 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Задержка на DWT не соответствует реальности

Alexan.dr, таки есть термин good practice - и огромное множество примеров bad practice.
Вам нужна задержка - поставьте delay (500) и посмтрите на полученный код.
Заодно поставьте cube и выполните инициализацию платы для посмотреть как оно делается.
Можете в LL подергать светодиодом с той задержкой. И это все совсем почти без HAL
Изучите работающий код, полученное знание примените к обсуждаемому проекту…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при малом числе вариантов…
mike-y-k вне форума  
Эти 2 пользователя(ей) сказали Спасибо mike-y-k за это сообщение:
akegor (08.05.2019), Alexan.dr (08.05.2019)
Непрочитано 08.05.2019, 10:35  
Alexan.dr
Прохожий
 
Регистрация: 11.04.2019
Сообщений: 8
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Alexan.dr на пути к лучшему
По умолчанию Re: Задержка на DWT не соответствует реальности

ProtAS-13, можете подсказать, как настроить вывод частоты на пин, есть MCO1 на PA8, а MCO2 на PC9? Пусть не сам код, а алгоритм, потому что меня смущает, что максимальная скорость переключения пина 100МГц или же 160 МГц никто не выводит, а делают 10-50 МГц? Хотя у меня анализатор до 24 МГц, я физически не смогу 160 МГц ничем отловить.
Alexan.dr вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задержка импульса SAHA_T AVR 95 12.09.2014 01:54
LCD DEM 16261(4 bit mode) + AT89C51 ajborman Микроконтроллеры, АЦП, память и т.д 8 21.03.2007 15:26


Часовой пояс GMT +4, время: 00:32.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot