STM32开发笔记23: 使用__weak修饰符

2019-07-16来源: eefocus关键字:STM32  __weak  修饰符

单片机型号:STM32L053R8T6


在 HAL 库中,很多回调函数前面使用__weak 修饰符。

 

weak 顾名思义是“弱”的意思,所以如果函数名称前面加上__weak 修饰符,我们一般称这个函数为“弱函数”。

加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,
那么编译器就会执行__weak 声明的函数,并且编译器不会报错。

 

举个例子:

我们打开工程模板,找到并打开文件stm32f4xx_hal.c 文件,里面定义了一个函数 HAL_MspInit,定义如下:


  1. __weak void HAL_MspInit(void)  

  2. {  

  3. __IO uint32_t tmpreg = 0x00;  

  4. UNUSED(tmpreg);  

  5. }  

可以看出,HAL_MspInit 函数前面有加修饰符__weak。同时,在该文件的前面有定义函数HAL_Init,并且 HAL_Init 函数中调用了函数 HAL_MspInit。


  1. HAL_StatusTypeDef HAL_Init(void)  

  2. {  

  3. …//此处省略部分代码  

  4. HAL_MspInit();  

  5. return HAL_OK;  

  6. }  

如果我们没有在工程中其他地方重新定义 HAL_MspInit()函数,那么 HAL_Init 初始化函数执行的时候,会默认执行 stm32f4xx_hal.c 文件中定义的 HAL_MspInit 函数,而这个函数没有任何控制逻辑。

如果用户在工程中重新定义函数 HAL_MspInit,那么调用 HAL_Init 之后,会执行用户自己定义的 HAL_MspInit 函数而不会执行 stm32f4xx_hal.c 默认定义的函数。也就是说,表面上我们看到函数 HAL_MspInit 被定义了两次,但是因为有一次定义是弱函数,使用了__weak修饰符,所以编译器不会报错。
 

 总结:

__weak 在回调函数的时候经常用到。这样的好处是,系统默认定义了一个空的回调函数,保证编译器不会报错。同时,如果用户自己要定义用户回调函数,那么只需要重新定义即可,不需要考虑函数重复定义的问题,使用非常方便,在 HAL 库中__weak 关键字被广泛使用。


关键字:STM32  __weak  修饰符

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic468083.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32开发笔记24:STM32L0低功耗设计——需求概述
下一篇:STM32开发笔记22: 手动添加驱动文件

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm32f103在使用定时器1重映射引脚输出PWM

在使用stm32f103ZGT6单片机输出PWM时候,各种配置都不能正确输出,后来查看手册,PE11该引脚对应的确实是定时器1的通道2,但是属于该引脚的重映射功能,遇到这种情况,需要多加一条语句。RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 ,ENABLE);      //TIM1时钟使能    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO,ENABLE);GPIO_PinRemapConfig(GPIO_FullRemap_TIM1
发表于 2019-08-21
stm32f103在使用定时器1重映射引脚输出PWM

STM32F10x TIM1 CH3/CH4 的重映射PWM输出

TIMx在ARR上的预装载寄存器  TIM_CtrlPWMOutputs(TIM1,ENABLE);        //MOE 主输出使能,高级定时器必须开启这个  TIM_Cmd(TIM1, ENABLE);  //使能TIM1  }    .H文件#ifndef __TIMER_H#define __TIMER_H#include "stm32f10x.h"  void TIM1_PWM_Init(u16 arr,u16 psc); #endif2.应用版源码   
发表于 2019-08-21

stm32 TIM1PWM多通道捕获模式测速

因为一个项目的要求,需要测速,之前就想学一下stm32的捕获模式了,借这个机会,刚好利用一下,现在分享出来。硬件:MCU:stm32f103zet6平台:航太电子流行7号智能小车显示:mini12864软件:语言:C语言IDE:keil5测速部分环境是典型的测速方法,测速码盘加光电对管,单片机采集光电对管模块传来的PWM波,要对两个轮子测速,实际速度取俩轮的较大值。软件上采用了TIM1的捕获模式,使用了通道CH1和CH4,分别对应PA8和PA11,先看下官方对输入捕获模式的描述:在输入捕获模式下,当检测到ICx信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存器(TIMx_CCRx)中。当发生捕获事件时,相应的CCxIF标志
发表于 2019-08-21

STM32F103ZET定时器TIM1输出六路带死区互补PWM波形

TIM_OCInitStructure;     GPIO_InitTypeDef GPIO_InitStructure;     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;     TIM_BDTRInitTypeDef TIM_BDTRInitStructure;       NVIC_InitTypeDef NVIC_InitStructure;         RCC_APB2PeriphClockCmd
发表于 2019-08-21

STM32的TIM1互补PWM输出

芯片为STM32F412VETx,使用的是高级定时器TIM1的PWM互补PWM输出,看一下STM32CubeMX配置,再看时钟的配置,TIM1用的是APB2的时钟,。再看引脚的配置产生的PWM频率为:Fpwm = 96MHz / ((95+1)(9999+1)) =100Hz,占空比为50%然后生成代码,看下代码中的FMX_TIM1_Init函数初始化/* TIM1 init function */static void FMX_TIM1_Init(void){   TIM_ClockConfigTypeDef sClockSourceConfig;  TIM_Mast
发表于 2019-08-21
STM32的TIM1互补PWM输出

STM32高级定时器TIM1、TIM15输出PWM

配置GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_1);该函数配置对应GPIO引脚的功能,具体的引脚功能参数GPIO_AF_x 找对应的芯片数据手册 查看下图为STM32F051C8T6相关引脚功能与其他普通定时器不同的是 特别注意TIM1、TIM15的BDTR寄存器 需要将MOD置位(寄存器第15位) 才能输出PWMTIM1->BDTR|=1<<15;TIM15->BDTR|=1<<15;
发表于 2019-08-21
STM32高级定时器TIM1、TIM15输出PWM

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved