Перейти к содержанию

Stm32F0 Sysclk И Программные Задержки


Pag

Рекомендуемые сообщения

Всем доброго времени суток!

Начал осваивать STM32 и появились непонятки с программной задержкой.

Тактирование включено от HSI и sysclk=HSI т.е. 8МГц (файл инициализации в аттаче). Я предположил что в коде ниже надо в цикле писать j<8000 но не тут то было. Опытным путем выяснилось что корректные задержки получаются при j<1000 т.е. исходя от некой частоты на которой работает cortex system timer. (см картинку с конфигуратора частоты)

Собственно вопрос в том на какой частоте происходит работа цикла?

Код задержки в ms ниже.

void delay_ms(uint16_t time)
{
uint16_t i,j;
for(i=0;i<time;i++)
   for(j=0;j<1000;j++);
}

system_stm32f0xx.rar

post-33479-0-54784800-1447223818_thumb.jpg

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

В каждом круге цикла выполняется несколько действий процессора: увеличить j на 1, сравнить с 1000, перейти на начало цикла на новый круг и т.д. Каждый шаг происходит с частотой sysclk. Вот, видимо, в Вашем случае один проход цикла занимает 8 тактов. Поэтому и 1000, а не 8000.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Надо таймер использовать. Настраиваете, например, таймер на переполнение каждую милисекунду, а в обработчике прерывания уменьшаете ненулевую переменную типа volatile uint32_t time_ms на 1. После этого процедура задеркжи будет типа такого:

void delay_ms(uint32_t time)
{
time_ms = time;
while(time_ms);
}

Ошибка такой задержки может быть до -1мс, т.к. таймер тикает сам по себе и в момент вызова delay_ms() он уже может быть близко к переполнению, и таким образом от первой мс останется только часть. Для больших задержек это может и не важно.

Если добавить старт/стоп и установку таймера в процедуре, то задержку можно получить гораздо точнее. Например, вот так

void delay_ms(uint32_t time)
{
  TIMER_COUNTER = начальное значение таймера;
  TIMER_START;

  time_ms = time;
  while(time_ms);

  TIMER_STOP;
}

Изменено пользователем Yurkin2015
Ссылка на комментарий
Поделиться на другие сайты

ок, спасибо, общий смысл я уловил. Попробую написать.

Посмотрим как получится, а то первые опыты с таймером удались не сразу, уж больно мутная у STM32 система тактирования оказалась

Ссылка на комментарий
Поделиться на другие сайты

RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq(&RCC_Clocks);
SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000);
void SysTick_Handler (void)
{
//сюда попадаем каждую 1 миллисекунду
time--;
}
void delay_ms(uint32_t t) // функция задержки
{
time=t;
while(time);
}

вообщем опробовал способ с использованием systick. все заработало отменно

Изменено пользователем Pag
Ссылка на комментарий
Поделиться на другие сайты

если внимательно посмотреть на процедуру инициализации systick, то станет понятно, что период его тиков при любой частоте тактового генератора составит ровно 1 мс. Можно переконфигурировать вручную. Тогда будет как угодно. Но делать это строго не рекомендую. Дело в том, что некоторые драйверы используют систик, и если привыкнуть использовать его не по назначению, гдето в будущем нарветесь на грабли. Особенно это будет заметно при использовании любой RTOS.

Вообще от души рекомендую познакомиться с FreeRTOS(которая по дефолту кстати добавляется из CubeMX и движений руками даже не требует), а не заниматься ерундой с глупыми задержками . Там можно спокойно не написав ни строчки дополнительного кода (кроме своей процедуры) засунуть хоть 10 потоков с разными задержками и все они будут выполняться совершенно независимо друг от друга. Там есть функция - OSDelay(ms), которую можно использовать где угодно. И еще куча всяких задержек по функционалу похожих на делэй, но умеющих например работать с четким периодом между событиями, или по передним границам событий. Повторюсь - FreeRTOS это на самом деле ооочень просто и экономит просто тьму времени на кодинг. У вас в руках сверхзвуковой истребитель, а вы из него воздушного змея слепить пытаетесь.

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Спасибо! Операционка конечно это здорово и унас на работе ведется разработка устройств именно с FreeRTOS с неплохими результатми (это я как тестировщик могу сказать :yes:

Однако для моих радиолюбительских нужд наличие ОС считаю избыточным. Да и программированием я после интститута не занимался. В последние пару недель вот вспоминаю :) Пока после атмеги все конечно выглядит посложнее, но в целом более изящно чес на АВР.

Изменено пользователем Pag
Ссылка на комментарий
Поделиться на другие сайты

операционка это только по определению. В реале это просто готовый скелет программы с удобной структурой и некоторым набором уже изобретенных велосипедов

STM гораздо проще атмеги на самом деле

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...