MyTetra Share
Делитесь знаниями!
Timers (tim6)
Время создания: 06.01.2018 14:01
Раздел: Electronics - Microcontrollers - STM32 - HAL

В кьюбе включаем TIM6. Далее в даташите на МК ищем на какой шине располагается этот таймер. В разделе "2 Memory and bus architecture - 2.3 Memory map" ищем TIM6 и определяем, что он на шине APB1. Настроим ее в Кьюбе в Clock Configuration. Здесь главное не превысить граничную частоту (42 МГц). Ставим делитель APB1 prescaler равным 8, частота получится 21 МГц (max = 42), а для таймера будет 42 (см на наличие умножителя).


Затем идем в закладку Configuration и настраиваем там таймер TIM6. В закладке Parameter Settings выставляем следующие значения:

Prescaler (PSC – 16 bit value) – 20999;

Counter Period – 499;

Trigger Event Selection – Update Event.

/* 21 МГц = 21 000 000 такт в секунду. Делим на 21000, получаем 1000. Таймер срабатывает и сбрасывается, когда достигает значения Counter Period = 499. Т.е. с такими настройками он будет срабатывать 2 раза в секунду. */


В закладке NVIC Settings включаем глобальные прерывания таймера 6. Генерируем код.


В даташите на HAL смотрим раздел "65.2.3 Time Base functions". Ищем функцию запуска таймера HAL_TIM_Base_Start.

HAL_TIM_Base_Start(&htim6);

В качестве параметра функция принимает указатель на таймер. Он инициализирован в разделе:


/* Private variables ---------------------------------------------------------*/

TIM_HandleTypeDef htim6;


Включаем прерывание от таймера функцией:


HAL_TIM_Base_Start_IT (&htim6);


В файле "stm32f4xx_it.c" ищем функцию прерывания: void TIM6_DAC_IRQHandler(void).

В тело функции вставляем обработчик прерывания.




ТЗ: в бесконечном цикле поочередно мигают светодиоды, переключаясь каждые 0.5с. При нажатии кнопки на 0.5с загараются все светодиоды, после чего программа возвращается к бегущим огонькам.


Из практики avr збс, когда в прерывании выполняется минимальный код. Поэтому я просто инкрементирую переменную (не забываем объявить ее как extern в файле с обработчиком). А весь фарш уже в главной программе.



//main.c

/* Private variables ---------------------------------------------------------*/

uint8_t tim6_counter = 0; //counter for timer6

/* USER CODE END PV */


/* USER CODE BEGIN 2 */

HAL_TIM_Base_Start(&htim6);

HAL_TIM_Base_Start_IT(&htim6);

/* USER CODE END 2 */


/* USER CODE BEGIN WHILE */

while (1)

{

/* USER CODE END WHILE */


/* USER CODE BEGIN 3 */

if(tim6_counter < 4)

{

HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET);

switch(tim6_counter)

{

case 0: HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);

break;

case 1: HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET);

break;

case 2: HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);

break;

case 3: HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET);

break;

default: break;

}

}

else tim6_counter = 0;


if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0))

{

HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_SET);

HAL_Delay(500);

HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET);

}

}

/* USER CODE END 3 */

}


//stm32f4xx_it.c

/* USER CODE BEGIN 0 */

extern uint8_t tim6_counter;

/* USER CODE END 0 */


void TIM6_DAC_IRQHandler(void)

{

/* USER CODE BEGIN TIM6_DAC_IRQn 0 */


/* USER CODE END TIM6_DAC_IRQn 0 */

HAL_TIM_IRQHandler(&htim6);

/* USER CODE BEGIN TIM6_DAC_IRQn 1 */

++tim6_counter;

/* USER CODE END TIM6_DAC_IRQn 1 */

}

 
MyTetra Share v.0.53
Яндекс индекс цитирования