打印
[应用相关]

STM32F4定时器驱动程序的移植(转载)

[复制链接]
759|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
labasi|  楼主 | 2019-6-18 13:08 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本文讲述移植STM32CubeMX生成的驱动程序到自己的项目中,以定时器为例。为什么要写这篇**呢?是因为定时器移植这件事情耗费了我整整2天的时间,只因为一个特殊的地方没有注意到。把整个移植过程用文字记录下来,以利于自身其它程序的移植,并对本文的读者提供一些技术上的参考。

使用特权

评论回复
沙发
labasi|  楼主 | 2019-6-18 13:08 | 只看该作者

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


使用特权

评论回复
板凳
labasi|  楼主 | 2019-6-18 13:08 | 只看该作者

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


使用特权

评论回复
地板
labasi|  楼主 | 2019-6-18 13:09 | 只看该作者

3、设置定时器中断。

4、生成工程文件。

5、有了上述准备后,我们就可已将工程移植到自己的项目中了。


使用特权

评论回复
5
labasi|  楼主 | 2019-6-18 13:09 | 只看该作者
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


使用特权

评论回复
6
labasi|  楼主 | 2019-6-18 13:09 | 只看该作者

  7、复制定时器初始化函数中的程序到SetMode函数中。

   8、复制中断函数中的内容到CPP文件中。

   9、复制初始化文件中的内容到CPP文件中。


使用特权

评论回复
7
labasi|  楼主 | 2019-6-18 13:10 | 只看该作者
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);

}

使用特权

评论回复
8
labasi|  楼主 | 2019-6-18 13:10 | 只看该作者
  • void TIM3_IRQHandler(void)

  • {

  •   HAL_TIM_IRQHandler(&htim3);

  • }



使用特权

评论回复
9
labasi|  楼主 | 2019-6-18 13:11 | 只看该作者
  • void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)



  • {       



  •         if (htim->Instance == htim3.Instance)



  •         {



  •                         CommonTimer_InterruptFunction();



  •         }



  • }



使用特权

评论回复
10
labasi|  楼主 | 2019-6-18 13:11 | 只看该作者
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);
  }
}



使用特权

评论回复
11
labasi|  楼主 | 2019-6-18 13:12 | 只看该作者
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base)
{
  if(htim_base->Instance==TIM3)
  {
    __HAL_RCC_TIM3_CLK_DISABLE();
    HAL_NVIC_DisableIRQ(TIM3_IRQn);
  }
}


使用特权

评论回复
12
labasi|  楼主 | 2019-6-18 13:12 | 只看该作者
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


使用特权

评论回复
13
labasi|  楼主 | 2019-6-18 13:12 | 只看该作者
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);


使用特权

评论回复
14
labasi|  楼主 | 2019-6-18 13:13 | 只看该作者

至此,就完成了整个驱动程序的移植工作,我所忽略的地方就是stm32f4xx_it.h文件,必须在这个文件中添加相应的中断服务处理函数,才能够使startup_stm32f401xc.s文件中中断向量与C文件中的中断服务处理函数对应上,否则中断服务处理函数得不到调用。



使用特权

评论回复
15
renzheshengui| | 2019-7-8 11:45 | 只看该作者

非常感谢楼主分享

使用特权

评论回复
16
wakayi| | 2019-7-8 11:50 | 只看该作者

非常感谢楼主分享

使用特权

评论回复
17
wowu| | 2019-7-8 11:53 | 只看该作者

非常感谢楼主分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

3382

帖子

2

粉丝