Программирование STM32F4. Урок №3. Системный таймер SysTic.

Видео уроки по программированию STM32F4.

Программирование STM32F4. Урок №3. Системный таймер SysTic.

Сообщение admin » 24 ноя 2015, 15:52

Тема для комментариев, вопросов, предложений навеянных данной статьей
admin
Администратор
 
Сообщения: 41
Зарегистрирован: 07 июн 2014, 12:03

Re: Программирование STM32F4. Урок №3. Системный таймер SysT

Сообщение SirYorik » 31 янв 2016, 18:56

мой вариант под следующие условия:
1) лазить в HAL_GetTick() не более одного раза в главном цикле
2) максимально просто добавлять таймеры
3) остаться на SysTic (без таймерных либ и других железных таймеров)

в примере мигаем тремя светодиодами с платы F3-discovery

Код: Выделить всё
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint32_t timers=0;                         // 3 переменные общие для всех таймеров
uint32_t timers_delta=0;
uint32_t timers_history=0;

uint32_t timer1=500;  // по 2 переменные на каждый таймер, длительность таймера и для обратного отсчета
uint32_t timer1_countdown;
uint32_t timer2=700;
uint32_t timer2_countdown;
uint32_t timer3=100;
uint32_t timer3_countdown;

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();

  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  timers_history = HAL_GetTick();         // взводим начальные значения и погнали в бесконечность
  timer1_countdown=timer1;
  timer2_countdown=timer2;
  timer3_countdown=timer3;
  while (1)
  {
          timers=HAL_GetTick();   // один раз за главный цикл проверяем, не тикнула ли милисекунда
     timers_delta=timers-timers_history;
     if (timers_delta) { timers_history=timers;  }

  /* USER CODE END WHILE */
  /* USER CODE BEGIN 3 */
     if (timers_delta)                     // и типичные для этой схемы IFы, 
       if(timer1_countdown){     // до else обратный отсчет, 
           timer1_countdown = timer1_countdown - timers_delta;
        } else {               // после - полезное действие
           HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_8);
           timer1_countdown=timer1;
        }
        if(timer2_countdown){
           timer2_countdown = timer2_countdown - timers_delta;
        } else {
           HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_9);
           timer2_countdown=timer2;
        }
        if(timer3_countdown){
           timer3_countdown = timer3_countdown - timers_delta;
        } else {
           HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_10);
           timer3_countdown=timer3;
        }
     }
  }
  /* USER CODE END 3 */
SirYorik
 
Сообщения: 2
Зарегистрирован: 31 янв 2016, 02:12


Вернуться в Программирование STM32F4. Уроки.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron