Содержание
Время выполнения кода STM32. » Хабстаб
Воспользуйтесь строкой поиска,
чтобы найти нужный материал
Всё началось с того что, появилась необходимость хотя бы примерно оценить время выполнения участка кода. Оказалось у микроконтроллеров с ядром Cortex-M3 для этого предназначен специальный модуль, который называется Data Watchpoint and Trace Unit, сокращённо DWT.
Чтобы настроить DWT на измерение длительности выполнения кода, необходимо установить 2 бита.
Бит TRCENA в регистре DEMCR, установка единицы в который разрешает использовать DWT.
Бит CYCCNTENA в регистре DWT_CTRL, установка единицы в который запускает счётчик.
Текущее значение счётчика можно считать из 32-битного регистра CYCCNT.
Код, позволяющий оценить время выполнения кода, выглядит следующим образом
#define DWT_CYCCNT *(volatile unsigned long *)0xE0001004 #define DWT_CONTROL *(volatile unsigned long *)0xE0001000 #define SCB_DEMCR *(volatile unsigned long *)0xE000EDFC SCB_DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;// разрешаем использовать DWT DWT_CYCCNT = 0;// обнуляем значение DWT_CONTROL|= DWT_CTRL_CYCCNTENA_Msk; // включаем счётчик Какой-то код count_tic = DWT_CYCCNT;//смотрим сколько натикало
count_tiс – количество тактов, в течение которых выполнялся код. Если мы хотим получить время надо разделить это значение на тактовую частоту, в моём случае на 56 000 000.
В принципе на этом можно было бы закончить, но есть желание разобраться соответствует ли в действительности то, что мы считываем из DWT_CYCCNT реальному времени.
Для того чтобы проверить это, давайте настроим таймер, который будет генерировать прерывание раз в секунду, внутри прерывания будем считывать значение DWT_CYCCNT, обнулять его и так по кругу.
#include "stm32f10x.h" #define DWT_CYCCNT *(volatile unsigned long *)0xE0001004 #define DWT_CONTROL *(volatile unsigned long *)0xE0001000 #define SCB_DEMCR *(volatile unsigned long *)0xE000EDFC uint32_t count_tic = 0; void TIM3_IRQHandler(void) { count_tic = DWT_CYCCNT; //останавливаем DWT DWT_CONTROL &= ~DWT_CTRL_CYCCNTENA_Msk; DWT_CYCCNT = 0; //выключаем таймер TIM3->CR1 &= ~TIM_CR1_CEN; //обнуляем его значение TIM3->CNT = 0; //сбрасываем флаг прерывания 2 раза, у меня он иначе он не сбрасывался TIM3->SR &= ~TIM_SR_UIF; TIM3->SR &= ~TIM_SR_UIF; } int main(void) { //включаем тактирование таймера RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; //уcтанавливаем предделитель, новая частота таймера 10KHz TIM3->PSC = 5600 - 1; //период 1 секунда TIM3->ARR = 10000 - 1; //счётчик считает вниз TIM3->CR1 &= ~TIM_CR1_DIR; //в режиме одного импульса TIM3->CR1 |= TIM_CR1_OPM; //разрешаем прерывания TIM3->DIER |= TIM_DIER_UIE; NVIC->ISER[0] = NVIC_ISER_SETENA_29; //запускаем таймер TIM3->CR1 |= TIM_CR1_CEN; //включаем DWT SCB_DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT_CYCCNT = 0; DWT_CONTROL|= DWT_CTRL_CYCCNTENA_Msk; while(1) { //включаем таймер TIM3->CR1 |= TIM_CR1_CEN; //запускаем DWT DWT_CONTROL|= DWT_CTRL_CYCCNTENA_Msk; } }
Установка бита TIM_CR1_OPM включает режим одиночного импульса, в этом режиме после возникновения события счёт прекращается.
Первое значение отличается от остальных, потому как таймер и счётчик надо бы запустить одновременно, следующие отличаются от расчётного значения на несколько тактов, которые необходимы для сохранения значения DWT_CYCCNT в count_tic, то есть данный способ работает. На этом всё, спасибо за внимание.
Источник: hubstub.ru
Статья
STM32. Новый курс по программированию
Опубликовано 13.11.2022
На сегодняшний день микроконтроллеры семейства STM32 заняли прочную позицию на рынке, а появление полноценных средств разработки и отладки позволяет быстро осваивать их возможности.
Но, тем не менее, материалов для изучения этих микроконтроллеров и особенностям разработки ПО на языке С для микроконтроллеров достаточно мало.
Этой статьей мы начинаем свой обновленный авторский курс.
Аппаратное обеспечение
В нашем курсе мы будем использовать Аппаратно-программный комплекс «Импульс» для изучения микроконтроллеров.
Импульс. Аппаратно-программный комплекс для изучения МК семейства STM32
Первая статья цикла будет посвящена описанию этого учебного стенда. В его состав входит плата Nucleo F411RE, а так же простейшие периферийные устройства, применяемые в устройствах на МК. Кнопки, дисплей, пьезоизлучатель, датчики температуры, переменные резисторы, светодиоды и внешние RTC.
Статьи цикла вполне можно изучать и проделывать эксперименты в том числе не имея под рукой этого отладочного комплекта.
Программное обеспечение
На сегодняшний день программная среда STM32CubeIDE — наилучшим образом подходит для разработки под STM32. Она органично интегрирует средства для инициализации кода, менеджмент файлов проекта и поддержку отладочных средств. Но самое главное — это официальная бесплатная среда разработки с поддержкой непосредственно от производителей этих микроконтроллеров.
Также мы будем использовать в своем курсе HAL-драйвер (Hardware Abstraction Layer), так как в подавляющем большинстве случаев серьезные проекты так или иначе разрабатываются с применением этого драйвера.
Все статьи курса вы можете найти по этим ссылкам:
- STM32. Введение. Импульс. Аппаратно-программный комплекс для изучения МК семейства STM32
- STM32. Тема 0.0 Работа в STM32CubeIDE
- STM32. Тема 1.0 Генерация управляющих импульсных сигналов
- STM32. Тема 1.1 Генератор меандра
- STM32. Тема 1.2 Генератор сигнала SOS
- STM32. Тема 1.3 Генератор сигнала SOS со звуком
- STM32. Тема 1.4 Линейный обработчик светофора
- STM32. Тема 1.5 Линейный обработчик светофора для перекрестка
- STM32. Тема 1.6 Обработчик светофора со трелкой
- STM32. Тема 1.7 Обработчик светофора с пешеходными секциями в автоматном стиле
- STM32. Тема 2.0 Семисегментный индикатор
- STM32. Тема 2.1 Обработчик семисегментного индикатора
- STM32. Тема 2.2 Обратный таймер 5 сек
- STM32. Тема 2.3 Таймер 10 сек
- STM32. Тема 2.4 Бегущий огонь
- STM32. Тема 2.5 Индикатор состояния
- STM32. Тема 2.6 Таймер 1 минута
- STM32. Тема 2.7 Светофор с таймером обратного отсчета
- STM32. Тема 3.0 Тактовые кнопки
- STM32. Тема 3.1 Телеграфный манипулятор
- STM32. Тема 3.2 Вызывной светофор
- STM32. Тема 3.3 Ямбический ключ
- STM32. Тема 3.4 Счетчик внешних событий
- STM32. Тема 3.5 Индикатор переключения АКПП
- STM32. Тема 3.6 Матричная клавиатура
Мы будем очень рады, если вы поддержите наш ресурс и посетите магазин наших товаров shop.customelectronics.ru.
Метки отсутствуют
Просмотров: 624
Please enable JavaScript to view the comments powered by Disqus.
Микроконтроллер
— предварительный делитель и счетчик периода (STM32)
\$\начало группы\$
Для таймеров на stm32 есть возможность установки периода предварительного делителя и счетчика. Я понял, что прескалер делит частоту перед тем, как использовать ее для счетчика. Однако мне кажется, что установка значения счетчика делает в основном то же самое, потому что, если я установлю счетчик на N, результирующая частота f должна быть f’ = f / N, что на самом деле приводит к тому же, что и предварительный делитель. Что я сделал не так?
- микроконтроллер
- stm32
- часы
- таймер
- счетчик
\$\конечная группа\$
\$\начало группы\$
- Предварительный делитель определяет частоту счетчика. AR (автоматическая перезагрузка) — это просто ограничение на максимальное количество единиц и обновление рег; в ШИМ или простой временной базе они работают одинаково. но как насчет захвата ввода? Как насчет ШИМ без ущерба для разрешения?
- Больше гибкости. Обычно прескалеры представляют собой степень двойки, например
2,4,8,. .. и это несмотря на то, что там одни микроконтроллеры
без ограничений, но добавление обоих делает его более гибким.
\$\конечная группа\$
\$\начало группы\$
Предварительный делитель используется для установки частоты изменения счетчика.
Пример:
Если тактовая частота вашего таймера составляет 100 МГц, и вы хотите, чтобы таймер переполнялся каждые 2 мс, вам необходимо выполнить некоторые математические действия.
-
В течение 2 мс ваш счетчик должен считать до 100 МГц * 2 мс = 200000. Большинство счетчиков таймеров STM32 имеют 16 бит, и это значение не подходит. Максимальное значение 65535.
-
200000 / (65535 + 1) = 3,05. Ближайшее целое число, большее этого числа, равно 4,
.
-
100 МГц / 4 = 25 МГц. Счетчик должен будет считать до 50000, и это значение будет соответствовать 16-битному регистру.
Таким образом, ваш регистр предварительного делителя (PSC) должен быть установлен на 3 (4-1), а регистр счетчика (ARR) — на 49. 999 (50000-1). Смещение единицы необходимо, потому что так работают эти таймеры.
\$\конечная группа\$
0
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания, политикой конфиденциальности и политикой использования файлов cookie
Микроконтроллер
— Настройка таймера STM32 в качестве счетчика частоты
спросил
Изменено
3 года, 10 месяцев назад
Просмотрено
2к раз
\$\начало группы\$
Я пытаюсь настроить один из входов таймера на STM32 для работы в качестве счетчика частоты для внешнего сигнала. Техническое описание STM32 описывает «режим захвата ввода» в разделе 17.3.6 (стр. 342)
Насколько я понимаю этот режим, всякий раз, когда на выбранный вход TIMx_CHx поступает вход, процессор фиксирует значение автономной внутренней прилавок. Затем можно рассчитать частоту, используя значение счетчика и частоту внутреннего счетчика.
Я пытаюсь включить это в CubeMX, и у меня возникают трудности с сопоставлением пояснений таблицы данных с настройками в CubeMX. Это то, что я сейчас настроил. Это правильно?
Кроме того, могу ли я запустить несколько независимых входов в отдельные каналы на одном и том же таймере для одновременного захвата времени?
- микроконтроллер
- stm32
- таймер
- stm32cubemx
\$\конечная группа\$
1
\$\начало группы\$
Счетчики частоты могут быстро усложняться в зависимости от желаемой полосы пропускания и тактовой частоты внутренних часов, а также размера регистров, содержащих такты часов и входные такты.
Добавить комментарий