07.05.2019, 17:41
|
|
Частый гость
Регистрация: 11.04.2019
Сообщений: 11
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Задержка на DWT не соответствует реальности
Приветствую всех. На stm32f4 делаю задержку на полсекунды путем зацикливания в while на нужное количество тактов контроллера. Проверяю счетчик CYCCNT, там столько натикало, сколько должно, но светодиод меняет свое состояние реже. Цифровой анализатор 1.3 сек выдает. Что это? Как это понимать?
Пробовал и SysTick, но не нравятся его частые прерывания, да и такая же хрень. FOR можно подобрать, но это костыль. Не настало еще их время
|
|
|
|
07.05.2019, 18:12
|
|
Частый гость
Регистрация: 11.04.2019
Сообщений: 11
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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);
}
|
|
|
|
07.05.2019, 21:30
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,170
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
|
Re: Задержка на DWT не соответствует реальности
Для такого ногодрыга светодиодом вполне хватило бы одного NE556 с минимумом обвязки. F4 тут сильно больше электронного микроскопа получается
Вы прерывания запрещали в том цикле? И проверяли их обработку с коррекцией счетчика цикла?
Таймеры собственно для этой цели и существуют - дабы время процессора использовать с большим смыслом…
И совсем не зря их там не один предусмотрен, да ещё и режимов у них множество…
Устанавливаете и запускаете таймер, в его обработчике взводите флаг, ждёте в нужном месте (если так устроена логика) и продолжаете, иначе можно заняться другими делами.
Посмотрите на работу вариаций функции delay…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
07.05.2019, 21:57
|
|
Прописка
Регистрация: 10.03.2016
Сообщений: 114
Сказал спасибо: 14
Сказали Спасибо 46 раз(а) в 41 сообщении(ях)
|
Re: Задержка на DWT не соответствует реальности
Сообщение от mike-y-k
|
Вы прерывания запрещали в том цикле? И проверяли их обработку с коррекцией счетчика цикла?
|
Не прикалывайтесь так цинично над начинающим. DWT пофигу что там и как, он тупо считает циклы в CYCCNT, независимо, есть там прерывания или нет.
|
|
|
Сказали "Спасибо" scorpi_0n
|
|
|
07.05.2019, 23:37
|
|
Прописка
Регистрация: 17.03.2015
Сообщений: 296
Сказал спасибо: 0
Сказали Спасибо 220 раз(а) в 126 сообщении(ях)
|
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
|
|
|
07.05.2019, 23:40
|
|
Частый гость
Регистрация: 11.04.2019
Сообщений: 11
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Задержка на DWT не соответствует реальности
Сообщение от mike-y-k
|
Для такого ногодрыга светодиодом вполне хватило бы одного NE556 с минимумом обвязки. F4 тут сильно больше электронного микроскопа получается
Вы прерывания запрещали в том цикле? И проверяли их обработку с коррекцией счетчика цикла?
Таймеры собственно для этой цели и существуют - дабы время процессора использовать с большим смыслом…
И совсем не зря их там не один предусмотрен, да ещё и режимов у них множество…
Устанавливаете и запускаете таймер, в его обработчике взводите флаг, ждёте в нужном месте (если так устроена логика) и продолжаете, иначе можно заняться другими делами.
Посмотрите на работу вариаций функции delay…
|
И не лень же Вам столько писать о том, как я иначе это мог бы сделать. Так называемый ногодрыг - не конечная цель.
По умолчанию все прерывания запрещены и ощущение, что какая-то неразбериха с тактированием. Таймерами проверял, там тоже странно всё при тактировании от кварца. Но опять же, таймер - это ножка, таймер - это прерывания. Мне нужно именно "зависнуть" в программе
Еще один вариант еще не успели предложить - библиотеку HAL. Заранее скажу, что только SPL интересует
|
|
|
|
07.05.2019, 23:44
|
|
Частый гость
Регистрация: 11.04.2019
Сообщений: 11
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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.
|
|
|
|
08.05.2019, 00:33
|
|
Прописка
Регистрация: 17.03.2015
Сообщений: 296
Сказал спасибо: 0
Сказали Спасибо 220 раз(а) в 126 сообщении(ях)
|
Re: Задержка на DWT не соответствует реальности
Сообщение от Alexan.dr
|
Так а почему светодиод мигает не с задержкой 500 мс? )) сделал 80 млн тактов на частоте 160 млн, а светодиод не переключается ((
|
Дык, кто-же знает, что у Вас там еще понаписано в коде.
Могу лишь предположить, что SystemCoreClock не соответствует РЕАЛЬНОЙ частоте.
Копайте код, выведите частоту SYSCLK на MCO2 и проверьте, действительно ли там нужная частота.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо ProtAS-13 за это сообщение:
|
|
|
08.05.2019, 02:40
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,170
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
|
Re: Задержка на DWT не соответствует реальности
Alexan.dr, таки есть термин good practice - и огромное множество примеров bad practice.
Вам нужна задержка - поставьте delay (500) и посмтрите на полученный код.
Заодно поставьте cube и выполните инициализацию платы для посмотреть как оно делается.
Можете в LL подергать светодиодом с той задержкой. И это все совсем почти без HAL
Изучите работающий код, полученное знание примените к обсуждаемому проекту…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
Эти 2 пользователя(ей) сказали Спасибо mike-y-k за это сообщение:
|
|
|
08.05.2019, 10:35
|
|
Частый гость
Регистрация: 11.04.2019
Сообщений: 11
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Задержка на DWT не соответствует реальности
ProtAS-13, можете подсказать, как настроить вывод частоты на пин, есть MCO1 на PA8, а MCO2 на PC9? Пусть не сам код, а алгоритм, потому что меня смущает, что максимальная скорость переключения пина 100МГц или же 160 МГц никто не выводит, а делают 10-50 МГц? Хотя у меня анализатор до 24 МГц, я физически не смогу 160 МГц ничем отловить.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:01.
|
|