欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32F4 开发笔记7:定时器驱动程序的移植

程序员文章站 2022-03-13 23:30:56
...

    本文讲述移植STM32CubeMX生成的驱动程序到自己的项目中,以定时器为例。为什么要写这篇文章呢?是因为定时器移植这件事情耗费了我整整2天的时间,只因为一个特殊的地方没有注意到。把整个移植过程用文字记录下来,以利于自身其它程序的移植,并对本文的读者提供一些技术上的参考。

    1、如果仅完成计时功能,在STM32CubeMX中设置比较简单,如下图所示,只需指定其时钟源即可。

STM32F4 开发笔记7:定时器驱动程序的移植

    2、对时钟进行进一步设置,这个在先前的日志中已经描述过,将分频系数与MCU的主频系数设置成一致,例如我现在MCU的主频是72M,则进行72分频即可,这样单位计数周期是1us,按照下图所示,我在Counter Period中设置为1000,则定时器的中断时间是1ms。

STM32F4 开发笔记7:定时器驱动程序的移植

    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  






    

上一篇: Request

下一篇: Request详解