STM32F4 开发笔记7:定时器驱动程序的移植
本文讲述移植STM32CubeMX生成的驱动程序到自己的项目中,以定时器为例。为什么要写这篇文章呢?是因为定时器移植这件事情耗费了我整整2天的时间,只因为一个特殊的地方没有注意到。把整个移植过程用文字记录下来,以利于自身其它程序的移植,并对本文的读者提供一些技术上的参考。
1、如果仅完成计时功能,在STM32CubeMX中设置比较简单,如下图所示,只需指定其时钟源即可。
2、对时钟进行进一步设置,这个在先前的日志中已经描述过,将分频系数与MCU的主频系数设置成一致,例如我现在MCU的主频是72M,则进行72分频即可,这样单位计数周期是1us,按照下图所示,我在Counter Period中设置为1000,则定时器的中断时间是1ms。
3、设置定时器中断。
4、生成工程文件。
5、有了上述准备后,我们就可已将工程移植到自己的项目中了。
6、建立定时器相应的CPP和H文件,H文件的代码如下:
/*
* Timer3ʼÖÕ²úÉú1ms¶¨Ê±
*/
#ifndef TIMER3_H_
#define TIMER3_H_
void CommonTimer_InterruptFunction(void);
#ifdef __cplusplus
extern "C"{
class CTimer3
{
public:
void SetMode(uint8_t mode);
};
}
#endif
#endif
7、复制定时器初始化函数中的程序到SetMode函数中。
8、复制中断函数中的内容到CPP文件中。
9、复制初始化文件中的内容到CPP文件中。
10、在CPP文件中定义自己的中断服务处理函数,以方便在main.cpp中调用,完整的CPP文件如下:
#include "include.h"
TIM_HandleTypeDef htim3;
void CTimer3::SetMode(uint8_t mode)
{
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;
htim3.Instance = TIM3;
if (mode == 0)
{
htim3.Init.Prescaler = 72;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 1000;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
}
if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
{
Target.ErrorHandler(__FILE__, __LINE__);
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
{
Target.ErrorHandler(__FILE__, __LINE__);
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
{
Target.ErrorHandler(__FILE__, __LINE__);
}
HAL_TIM_Base_Start_IT(&htim3);
}
void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim3);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == htim3.Instance)
{
CommonTimer_InterruptFunction();
}
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{
if(htim_base->Instance==TIM3)
{
__HAL_RCC_TIM3_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM3_IRQn);
}
}
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base)
{
if(htim_base->Instance==TIM3)
{
__HAL_RCC_TIM3_CLK_DISABLE();
HAL_NVIC_DisableIRQ(TIM3_IRQn);
}
}
11、完成上述步骤后,还需对2个文件进行设置,首先设置stm32f4xx_hal_conf.h文件,打开相应的驱动模块,如下所示。
/* ########################## Module Selection ############################## */
/**
* @brief This is the list of modules to be used in the HAL driver
*/
#define HAL_MODULE_ENABLED
#define HAL_ADC_MODULE_ENABLED
/* #define HAL_CRYP_MODULE_ENABLED */
/* #define HAL_CAN_MODULE_ENABLED */
/* #define HAL_CRC_MODULE_ENABLED */
/* #define HAL_CRYP_MODULE_ENABLED */
/* #define HAL_DAC_MODULE_ENABLED */
/* #define HAL_DCMI_MODULE_ENABLED */
/* #define HAL_DMA2D_MODULE_ENABLED */
/* #define HAL_ETH_MODULE_ENABLED */
/* #define HAL_NAND_MODULE_ENABLED */
/* #define HAL_NOR_MODULE_ENABLED */
/* #define HAL_PCCARD_MODULE_ENABLED */
/* #define HAL_SRAM_MODULE_ENABLED */
/* #define HAL_SDRAM_MODULE_ENABLED */
/* #define HAL_HASH_MODULE_ENABLED */
/* #define HAL_I2C_MODULE_ENABLED */
/* #define HAL_I2S_MODULE_ENABLED */
/* #define HAL_IWDG_MODULE_ENABLED */
/* #define HAL_LTDC_MODULE_ENABLED */
/* #define HAL_RNG_MODULE_ENABLED */
/* #define HAL_RTC_MODULE_ENABLED */
/* #define HAL_SAI_MODULE_ENABLED */
/* #define HAL_SD_MODULE_ENABLED */
/* #define HAL_MMC_MODULE_ENABLED */
#define HAL_SPI_MODULE_ENABLED
#define HAL_TIM_MODULE_ENABLED
/* #define HAL_UART_MODULE_ENABLED */
/* #define HAL_USART_MODULE_ENABLED */
/* #define HAL_IRDA_MODULE_ENABLED */
/* #define HAL_SMARTCARD_MODULE_ENABLED */
/* #define HAL_WWDG_MODULE_ENABLED */
#define HAL_PCD_MODULE_ENABLED
/* #define HAL_HCD_MODULE_ENABLED */
/* #define HAL_DSI_MODULE_ENABLED */
/* #define HAL_QSPI_MODULE_ENABLED */
/* #define HAL_QSPI_MODULE_ENABLED */
/* #define HAL_CEC_MODULE_ENABLED */
/* #define HAL_FMPI2C_MODULE_ENABLED */
/* #define HAL_SPDIFRX_MODULE_ENABLED */
/* #define HAL_DFSDM_MODULE_ENABLED */
/* #define HAL_LPTIM_MODULE_ENABLED */
#define HAL_GPIO_MODULE_ENABLED
#define HAL_DMA_MODULE_ENABLED
#define HAL_RCC_MODULE_ENABLED
#define HAL_FLASH_MODULE_ENABLED
#define HAL_PWR_MODULE_ENABLED
#define HAL_CORTEX_MODULE_ENABLED
12、在stm32f4xx_it.h中添加相应的中断服务处理函数,如下所示。
void NMI_Handler(void);
void HardFault_Handler(void);
void MemManage_Handler(void);
void BusFault_Handler(void);
void UsageFault_Handler(void);
void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
void TIM3_IRQHandler(void);
void OTG_FS_IRQHandler(void);
至此,就完成了整个驱动程序的移植工作,我所忽略的地方就是stm32f4xx_it.h文件,必须在这个文件中添加相应的中断服务处理函数,才能够使startup_stm32f401xc.s文件中中断向量与C文件中的中断服务处理函数对应上,否则中断服务处理函数得不到调用。
原创性文章,转载请注明出处CSDN:http://blog.csdn.net/qingwufeiyang12346。