
STM32外设固件库里回调函数 首先,作为一个函数库,除了个别初始化函数外,里面不存在现存的完整的回调函数。结合前面的介绍,我们知道回调函数需要结合具体场景而拟定,作为函数库根本做不到这一点,它没法事先知晓发生某个事件时不同的应用会需要采取怎样的操作。 其次,STM32库函数的确采用了回调机制,并基于可能的各种事件为STM32开发者预留了只有函数定义而无具体内容的空回调函数,或者是只定义了一些基于各类事件的函数指针,具体的回调函数需要用户完成并将函数地址赋给相应的函数指针而被调用。简单点说,函数库给我们事先预留了众多的回调函数接口。 STM32固件库里的回调函数采用了两种调用方式: 7 o$ O4 S5 y" A- @; J4 A第一种是legacy方式,传统的回调方式,库以weak方式定义了各种空的回调函数,像下面这些。STM32库里都给我们准备好了。【下面是有关UART部分事件的弱回调函数体,内容为空】 1 [# W3 @" O+ [" R% P' [0 s![]() 具体开发时,我们根据事件和应用场景基于类似上面的weak函数进行重写,重写时拿掉weak,库里预留的弱定义函数尽量不用动它。比方像下面这些都是最终的用户回调函数。 ![]() 另外一种就是指针方式,或称注册方式。即函数库里事先基于各类事件定义好了各种回调函数指针,具体的回调函数由用户基于不同事件和应用需求撰写,然后将函数地址赋给函数指针,这个动作我们称之为回调函数进行注册,之后回调函数就可以通过函数指针而被适时调用。 / U- _4 m( R, F7 z6 m% ?0 y比方下面是UART外设里定义的一些函数指针:【星号所指的是与UART传输完成事件有关的回调函数所用的指针】 ![]() 当我们将回调函数写好后,将函数地址赋给函数指针即可在相应事件发生时被调用。比方类似下面的操作代码。红星标所指代码就是在做回调函数的注册。 ![]() 给函数指针赋地址可以直接赋地址或通过调用库函数xxx_RegisterCallback完成【见上图星标代码】。 这种指针方式需要我们对C语言中的结构体、函数指针有相应的了解,库只是给我们提供了相应的函数指针,具体的用户回调函数由用户根据需要来编写,将其地址赋给相应的函数指针以供调用。 而前面介绍的传统型回调函数,库则帮我们把可能涉及到的回调函数全部以弱定义的方式都准备好了,我们按需针对性选用,去掉weak填空重写。使用起来相对更直观些,无需我们对函数指针有太多了解。 目前STM32库回调机制中,作为用户到底使用上面的哪种回调方式呢?在每个系列的固件库的配置头文件中有针对各个外设事件回调函数使用方式的选择,比方以STM32F4系列为例,这里有个stm32f4xx_hal_conf.h的头文件,我们可以看到基于各个外设事件回调函数使用方式选择的宏。 ) q$ Z0 R3 }: J. h: ], \![]() 若我们不对该头文件的相应外设事件的回调函数调用方式的宏定义做调整,则默认传统回调方式,即legacy方式,非指针方式。若将相应的宏值改为1,则该外设事件相关回调函数采用指针注册方式。 3 Q+ ]( p d/ M. B转载自STM32公众号 |
Keil下的STM32N6之RAM运行工程配置说明
【STM32MP257-DK】01开发板开箱、ST MPU 生态资源使用、环境搭建以及镜像更新
兔哥的初代M33【002】-H503Nucleo 内部flash操作
兔哥的杂谈【002】——如何性价比更高地去编译STM32
汇编浮点库qfplib移植STM32F769I-DISCO开发板与硬件浮点运算性能测试对比
FreeRTOS学习笔记2
【NUCLEO-H533RE评测】+05 调试PWM
基于STM32在线升级OTA经验分享
基于STM32 hardfault问题分析经验分享
【NUCLEO-C0评测】硬件OLED显示