历史上的今天
返回首页

历史上的今天

今天是:2024年09月12日(星期四)

正在发生

2018年09月12日 | STM32F4 开发笔记7:定时器驱动程序的移植

2018-09-12 来源:eefocus

    本文讲述移植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文件中的中断服务处理函数对应上,否则中断服务处理函数得不到调用。


推荐阅读

史海拾趣

德芯半导体(Doeshare)公司的发展小趣事

德芯半导体深知人才是企业发展的核心。因此,公司注重人才队伍的建设,吸引了一批具有丰富经验和专业知识的资深工程师和管理人员。这些人才不仅为公司带来了先进的技术和管理经验,还为公司的发展提供了源源不断的动力。公司设立技术委员会,布局先进封装项目,推动公司在高端封装技术上的突破。

Control Sciences Inc公司的发展小趣事

作为一家有社会责任感的企业,Control Sciences Inc始终关注环境保护和社会公益。公司积极推广节能减排技术,减少生产过程中的环境污染。此外,公司还积极参与社会公益活动,为社会的发展贡献自己的力量。这些举措不仅提升了公司的社会形象,也赢得了社会各界的广泛认可。


以上只是基于通用框架编写的示例故事,具体的内容需要您根据Control Sciences Inc公司的实际情况进行调整和补充。在编写过程中,请确保遵循事实,避免加入主观评价或猜测。

国炬(GOOGLL)公司的发展小趣事
可能是由于负载过大、散热不良或电路设计不合理等原因引起。解决方法包括降低负载阻抗、改善散热条件或重新设计电路结构。
Electronicon Kondensatoren GmbH公司的发展小趣事

ELECTRONICON Kondensatoren GmbH,其前身为RFT Kondensatorenwerk Gera,于20世纪30年代末与德国图林根东部的Gera的电容器制造商建立了紧密的合作。自此,ELECTRONICON开始崭露头角,专注于电容器技术的研发与生产。公司始终将产品的质量和可靠性作为核心理念,为未来的发展奠定了坚实的基础。

Cedrat Technologies公司的发展小趣事

在电子行业中,合作与共赢是企业发展的重要途径。Cedrat Technologies积极与产业链上下游企业建立紧密的合作关系,共同推动电子行业的发展。通过与合作伙伴的协同创新和技术交流,Cedrat Technologies不仅拓展了自身的业务范围,也提升了在行业内的影响力和竞争力。

ABC [ABC Taiwan Electronics Corp]公司的发展小趣事

近年来,随着环保意识的日益增强,ABC Taiwan Electronics Corp积极响应绿色生产的号召。公司引入了环保材料和节能技术,降低了生产过程中的能耗和排放。同时,公司还加强了废弃物的处理和回收利用,实现了资源的循环利用。此外,ABC还积极参与社会公益活动,支持教育事业和环保事业,履行了企业的社会责任。

这五个故事展示了ABC Taiwan Electronics Corp从创业初期的艰难起步到逐步成长为国际知名电子零件供应商的发展历程。通过技术突破、国际化战略、产业升级和绿色生产等方面的努力,ABC不断应对市场的变化和挑战,实现了稳健的发展。

问答坊 | AI 解惑

开关电源原理及介绍

介绍............................... [ 本帖最后由 82541 于 2009-8-3 14:24 编辑 ]…

查看全部问答>

如何知道通讯录被修改过?

我发的贴,如下 http://topic.eeworld.net/u/20100528/13/fc32eafe-a232-45de-aff6-eaa81c5d2bc5.html?97042…

查看全部问答>

ARM开发板的选购

以前有过在开发板上学习的经历,只是了解基本的开发; 现在主要做GPS和GPRS方面,用Linux做,要求开发板厂商能有比较好的技术支持,希望能提供具体的品牌和型号,谢谢。…

查看全部问答>

100分求助activesync连接问题!!

在CE42系统下用从USB与PC连接(activesync连接) PC下设备管理器里已经能发现PDA设备 但是有时activesync连接不上,必须在PDA上或PC上手动启动连接才能连接上, 有时候手动连接也连接不上, 出现上述问题的概率很大! 另外,传输大文件的过程 ...…

查看全部问答>

2410-linux系统移植

2410-linux系统移植…

查看全部问答>

Tornade使用问题

我下载了 WINDRIVER TORNADO V2.2 FOR XSCALE WINDRIVER TORNADO V2.2 FOR ARM WINDRIVER TORNADO V2.2 FOR PENTIUM WINDRIVER TORNADO V2.2 FOR POWERPC 是不是可以在Windows下安装 有什么需要注意的吗 …

查看全部问答>

STM32的硬件I2C搞了2天没搞定,换了软件模拟,30分钟就OK了

STM32的硬件I2C设计的针式异常复杂,我都不明白,别的单片机就那么几个寄存器,照样实现了I2C的所有功能,为什么ST就要设计的这么复杂,还不好用的很。我用I2C2读写铁电,参考了读写EEPROm的sample,并且按照本论坛中的方法进行修改,至少试验 ...…

查看全部问答>

STM32固件库及其附件

收集了STM32最新的固件库的资料,分享给大家,免费下载!有什么问题一起探讨! [attach]87204 [/attach][attach]87205 [/attach][attach]87206 [/attach][attach]87207 [/attach][attach]87208 [/attach][attach]87209 [/attach][attach]872 ...…

查看全部问答>

德州仪器宣布实施重组 裁员1100人削减开支~~真的吗?

据abcnews网站报道,德州仪器周二宣布,它将在全球范围内裁员1100人以削减成本和减少在某些市场的投资。到2014年年底,在嵌入式处理器部门和日本的裁员将节省1.30亿美元年度开支。 德州仪器周二还公布了截至2013年12月31日的第四季度财务报告。财 ...…

查看全部问答>