Рейтинг@Mail.ru
STM32. Уроки по программированию STM32F4. Урок № 3. Системный таймер SysTick STM32F4.
Войти
или
Зарегистрироваться
Главная Файлы Видеоматериалы Форум
Карта сайта
Главная -> РУБРИКИ: -> Программирование STM32F4 -> STM32. Уроки по программированию STM32F4. Урок № 3. Системный таймер SysTick STM32F4.

Статья опубликована: 2015-11-24/10:01:12-admin

STM32. Уроки по программированию STM32F4. Урок № 3. Системный таймер SysTick STM32F4.



Начало здесь:


STM32. Уроки по программированию STM32F4. Урок № 0. Вводный. Описание. Установка IDE.


STM32. Уроки по программированию STM32F4. Урок № 1. Система тактирования STM32F4.


STM32. Уроки по программированию STM32F4. Урок № 2. Мигание светодиодом STM32F4.


STM32. Уроки по программированию STM32F4. Урок № 0. Update № 1.Портирование из STM32CubeMX в SW4STM32.




 

Вместо предисловия.

 

В прошлом уроке рассказывалось о более простом и наверное более правильном способе портировании проекта из STM32CubeMX в SW4STM32. На уроке № 2 был кратко затронут вопрос о работе порта на выход для мигания светодиодом. В этом уроке продолжим тему мигания светодиода, но вот задержку для него реализуем при помощи аппаратных средств - системного таймера SysTick STM32F4.

 

Предисловие.

 

Системный таймер SysTick представляет собой 24-разрядный декрементирующий счетчик. Источником тактирования является системная тактовая частота SYSCLK, либо та же частота, но поделенная на 8 – SYSCLK/8.

Углубляться в изучении его регистров, настройки не будем. Библиотека HAL создавалась именно для того что бы абстрагироваться от низкоуровнего изучения МК. Не будем на данном этапе удивлять разочаровывать разработчиков HALа.

 

Что нам нужно для настройки?

 

STM32CubeMX при создании проекта настраивает системный таймер по умолчанию. Каких то специальных манипуляций делать не придется. По умолчанию STM32CubeMX настроит прерывание от SysTick в 1 миллисекунду. Вычисление необходимых констат для счетчиков SysTick STM32CubeMX возьмет на себя. Включит прерывание от системного таймера. И нам в программе останеться лишь использовать уже это все на своё усмотрение.

 

Как он поможет со светодиодом?

 

На уроке №2, а также в Update №1 к уроку №0 мы использовали задержку HALа. Но если вчитаться в функцию задержки, то она выполена "далеко" не оптимально. Процессор простаивает в пустом ожидании окончании задержки и в этот момент не делат ни чего полезного. Конечно для простого мигания светодиодом больше и не нужно, но если проект большой и в нем есть критичные ко времени действия, то такая задержка применяться не должна.

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

 

Проект STM32CubeMX.

 

Для этого урока нам не понадобится изменять проект в STM32CubeMX. Он по умолчанию настроил нам системный таймер  SysTick STM32. Так что смело переходим в System Workbench for STM32 и начинаем править код иммено там.

 

SW4STM32.

 

Для работы с ситемным таймером в HALе предусмотренно несколько функций.

Все эти функии расположены в файле: stm32f4xx_hal.c.

Основные функции для организации задержки в HAL выгляд так:

/**
  * @brief This function is called to increment  a global variable "uwTick"
  *        used as application time base.
  * @note In the default implementation, this variable is incremented each 1ms
  *       in Systick ISR.
 * @note This function is declared as __weak to be overwritten in case of other 
  *      implementations in user file.
  * @retval None
  */
__weak void HAL_IncTick(void)
{
  uwTick++;
}

/**
  * @brief Provides a tick value in millisecond.
  * @note This function is declared as __weak to be overwritten in case of other 
  *       implementations in user file.
  * @retval tick value
  */
__weak uint32_t HAL_GetTick(void)
{
  return uwTick;
}

/**
  * @brief This function provides accurate delay (in milliseconds) based 
  *        on variable incremented.
  * @note In the default implementation , SysTick timer is the source of time base.
  *       It is used to generate interrupts at regular time intervals where uwTick
  *       is incremented.
  * @note This function is declared as __weak to be overwritten in case of other
  *       implementations in user file.
  * @param Delay: specifies the delay time length, in milliseconds.
  * @retval None
  */
__weak void HAL_Delay(__IO uint32_t Delay)
{
  uint32_t tickstart = 0;
  tickstart = HAL_GetTick();
  while((HAL_GetTick() - tickstart) < Delay)
  {
  }
}
}

Каждое прерывание вызывается функция void HAL_IncTick(void) в которой происходит инкремент переменной uwTick. И от неё уже отталкиваются для организации задержки.

Теперь давайте рассмотрим возможность организации задержки про помощи этих функций, но не вгоняя процессор в бесполезный ступор.

 

Немного кода.

 

В файле майн напишем следующее:

 

  /* USER CODE BEGIN 2 */
  delay_temp=HAL_GetTick();
  delay_count=500;
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  if (HAL_GetTick()-delay_temp>delay_count){
		  HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_12);
		  delay_temp=HAL_GetTick();
	  }

 

Главное отличие данного подхода от HALовского delay, в том что процессор не простаивает. Но такой метод не единственный. В прерывании от системного таймера SysTicka проиходит вызов функции инкремента переменной. Поэтому некоторые любители быстрых прерываний скажут так не стоит делать. К тому же нам ведь не нужна задержка для мигания светодиодом с точностью до машинного такта. Если необходимость такая есть, то весь такой ритичный код необходимо будет вынести в прерывание. И если понадобяться другие критичные задержки другой кратности, то не стоит насиловать системный таймер, для этого в STM32 имеется полно других аппаратных таймеров с большим функционалом, но об этом позже.

 

Изменим немного код.

 

Теперь сделаем почти все тоже самое, но уменьшим время пребывания в прерывании от системного таймера SysTick STM32. Для этого заведем байтувую переменную под флаг. И будет устанавливать его в прерывании от системного таймера, а основном цикле майна будем делать с ним все что нам необходимо.

Пример:

	  if (!delay_ms){
		  HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_12);
		  delay_ms=500;
	  }

	  if (flag_sys){
		  flag_sys=0;
		  if (delay_ms){
			  delay_ms--;
		  }
	  }

Пример достаточно прост для понимания.

Остальное подробно смотри в видео к уроку посвященному системному таймеру SysTick STM32.

 

Уроки по программированию STM32F4. Урок № 3. Системный таймер SysTick STM32F4. Видео.

 

 

 

Проект данного урока для Эклипс - Урок №3. Системный таймер SysTick STM32F4 скачать можно от сюда: тыц для скачивания.

 

Warning: Напоминаю что данный проект основан на портировании проекта из STM32CubeMX в SW4STM32 описанному в этой статье.

 

 

 

З.Ы. коментарии, вопросы и предложения складываем тут

 

 


Продолжение здесь:


STM32. Уроки по программированию STM32F4. Урок № 4. Программный многозадачный таймер STM32F4.


STM32. Уроки по программированию STM32F4. Урок № 5. Работа с АЦП+DMA + фильтр скользящее среднее.


STM32. Уроки по программированию STM32F4. Урок № 6. Работа с таймерами TIM7 и TIM1.



Просмотров: 13494



Комментарии: (0)

Оставить комментарий

Да, Я Хочу Всегда Быть В Курсе Новых Событий На Сайте!

Подпишитесь прямо сейчас, и получайте обновления на свой E-Mail:

Ваш E-Mail в безопасности


Рекомендованные статьи:



Разработка модуля программных многозадачных таймеров на STM32.


Update № 1. Это небольшое дополнение к Уроку № 0. Вводному. В данной статье опишится менее затратный способ по портированию проекта из STM32CubeMX в SW4STM32.


РУБРИКИ:








Последняя статья:

Часть I. Статья №6. Верстка подвала – блока футтер

На прошлом уроке мы сверстали основной блок контент. Оформили  статьи, которые отображаются на главной странице. Оформили их стилями, не входящими в макет сайта, но вписывающимися в общий дизайн сайта. На сегодняшнем уроке мы оформим подвал сайта. В данный блок войдут ссылки на стандартные страницы любого сайта, а также копирайт.

Читать далее »


Справка Обратная связь Вопросы и ответы Контакты RSS-лента © 2013-2016, ДРУиД - Дом Рационально-Умный и Душевный
Рейтинг@Mail.ru Яндекс.Метрика