скрытое меню

идеалогия HAL

Чтобы подключить в свой проект таймер на стандартах HAL от STM32 надо проверить включение в свой проект нескольких файлов и проверить наличие нескольких функций.

В основном коде программы (обычно main.c) обычно глобально объявляем таймеры :

TIM_HandleTypeDef htim5;
TIM_HandleTypeDef htim3;

Инициализируем таймеры . Собственно здесь вызываются функции HAL_TIM_Base_MspInit , HAL_TIM_OC_MspInit и т.д.

MX_TIM5_Init();
MX_TIM3_Init();

И наконец запускаем таймеры. Чтобы увидеть , что они работают ставим точки прерывания на функциях TIM5_IRQHandler и TIM3_IRQHandler.

HAL_TIM_OC_Start_IT(&htim5 , TIM_CHANNEL_1);
HAL_TIM_OC_Start_IT(&htim3 , TIM_CHANNEL_1);

Исходные файлы

Управление таймерами разнесено на несколько файлов. Инициализация таймеров реализована в файлах stm32f2xx_hal_msp.c и stm32f2xx_hal_tim.h . Обратите внимание названия файлов разные. stm32f2xx_hal_msp.c относится не только к таймерам , а и к другой периферии, а stm32f2xx_hal_tim.h относится только к таймерам.

MSP расшифровывается как MCU Support Packge. Примерно означает , что содержит функции инициализации , конфигурирования.

Для таймеров обязательно надо проверить наличие и содержание ниже указанных функций в файле stm32f2xx_hal_msp.c :

HAL_TIM_Base_MspInit и HAL_TIM_Base_MspDeInit

HAL_TIM_OC_MspInit и HAL_TIM_OC_MspDeInit

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

На что надо обратить внимание в функциях HAL_TIM_Base_MspInit и HAL_TIM_OC_MspInit - установка приоритета прерываний .

void HAL_TIM_OC_MspInit ( TIM_HandleTypeDef* htim_oc )
{
	/* USER CODE BEGIN TIM5_MspInit 0 */
	if ( htim_oc->Instance == TIM5 )
	{
		/* Peripheral clock enable */
		__HAL_RCC_TIM5_CLK_ENABLE() // включение тактирования канала таймера
		;
		/* TIM5 interrupt Init */
		HAL_NVIC_SetPriority ( TIM5_IRQn , 0 , 0 ); // для  FreeRTOS обычно второй параметр 5
		HAL_NVIC_EnableIRQ ( TIM5_IRQn ); // непосредственно включение прерывания
	}
}

Какие еще файлы необходимы для работы таймеров на примере контроллера STM32F205VGT6 . У нас для примера рассмотрены два таймера TIM5 И TIM3.

Обработчики прерываний

stm32f2xx_it.h и stm32f2xx_it.с - здесь реализуются обработчики прерываний : это функции TIM5_IRQHandler и TIM3_IRQHandler для каждого таймера отдельно.

Эти функции вызывают один общий для всех таймеров обработчик HAL_TIM_IRQHandler(&htim3); , который в свою очередь вызовет коллбек функции , если вы их не забудете реализовать. Колбек функции бывают разные под разные типы таймеров:

HAL_TIM_OC_DelayElapsedCallback(htim);
HAL_TIM_PWM_PulseFinishedCallback(htim);
HAL_TIM_PeriodElapsedCallback(htim);
HAL_TIMEx_BreakCallback(htim);
HAL_TIM_TriggerCallback(htim);
HAL_TIMEx_CommutationCallback(htim);

Какие из этих коллбек (callback) функций реализовывать, а какие нет - решать вам.

Обратите внимание : по идеалогии HAL вызываются две коллбек функции в обработке одного прерывания. Получается ,что реализовывать надо по идеи только одну из функций:

HAL_TIM_OC_DelayElapsedCallback(htim);
HAL_TIM_PWM_PulseFinishedCallback(htim);

Теперь минуя генерацию в STM32 CubeMX можно реализовывать таймеры в своих проектах в соответствие с идеалогией HAL.