你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32使用回调函数两种方法

[复制链接]
guoyuli 发布时间:2023-9-22 10:59
STM32外设固件库里回调函数
* v# w6 l/ j9 Q) F7 f6 T9 E5 ^
. W( Y- U9 V' z
首先,作为一个函数库,除了个别初始化函数外,里面不存在现存的完整的回调函数。结合前面的介绍,我们知道回调函数需要结合具体场景而拟定,作为函数库根本做不到这一点,它没法事先知晓发生某个事件时不同的应用会需要采取怎样的操作。

+ |: z  O* w/ j2 q
其次,STM32库函数的确采用了回调机制,并基于可能的各种事件为STM32开发者预留了只有函数定义而无具体内容的空回调函数,或者是只定义了一些基于各类事件的函数指针,具体的回调函数需要用户完成并将函数地址赋给相应的函数指针而被调用。简单点说,函数库给我们事先预留了众多的回调函数接口。

: A0 u, W) @- C0 C1 S% @
STM32固件库里的回调函数采用了两种调用方式:
# N1 q8 ]3 a) M3 }
第一种是legacy方式,传统的回调方式,库以weak方式定义了各种空的回调函数,像下面这些。STM32库里都给我们准备好了。【下面是有关UART部分事件的弱回调函数体,内容为空】

( N# F! x# D6 g* T6 N' k" k: s
微信图片_20230917112232.png

/ O' i! r7 z- E8 t3 c% t* [
具体开发时,我们根据事件和应用场景基于类似上面的weak函数进行重写,重写时拿掉weak,库里预留的弱定义函数尽量不用动它。比方像下面这些都是最终的用户回调函数。

" ]6 p" r: w& W+ }' X; {5 @. M
微信图片_20230917112232_1.png
+ L1 u0 c, r8 w
' ~* O9 S1 A: Z, I
另外一种就是指针方式,或称注册方式。即函数库里事先基于各类事件定义好了各种回调函数指针,具体的回调函数由用户基于不同事件和应用需求撰写,然后将函数地址赋给函数指针,这个动作我们称之为回调函数进行注册,之后回调函数就可以通过函数指针而被适时调用。
2 v6 d, A( F; u' L& a
比方下面是UART外设里定义的一些函数指针:【星号所指的是与UART传输完成事件有关的回调函数所用的指针】
微信图片_20230917112233.png

# z7 }3 z( C5 v. k' ]' C
当我们将回调函数写好后,将函数地址赋给函数指针即可在相应事件发生时被调用。比方类似下面的操作代码。红星标所指代码就是在做回调函数的注册。
; |5 y& W' M  p' E  c
微信图片_20230917112233_1.png
7 |2 L3 l. ]1 Y8 K4 K% I5 \
给函数指针赋地址可以直接赋地址或通过调用库函数xxx_RegisterCallback完成【见上图星标代码】。

. S( v9 R+ j, x/ Y6 n
这种指针方式需要我们对C语言中的结构体、函数指针有相应的了解,库只是给我们提供了相应的函数指针,具体的用户回调函数由用户根据需要来编写,将其地址赋给相应的函数指针以供调用。
' s$ l7 q: B8 \: Q( q
而前面介绍的传统型回调函数,库则帮我们把可能涉及到的回调函数全部以弱定义的方式都准备好了,我们按需针对性选用,去掉weak填空重写。使用起来相对更直观些,无需我们对函数指针有太多了解。
! A2 x4 N* b3 L2 U
目前STM32库回调机制中,作为用户到底使用上面的哪种回调方式呢?在每个系列的固件库的配置头文件中有针对各个外设事件回调函数使用方式的选择,比方以STM32F4系列为例,这里有个stm32f4xx_hal_conf.h的头文件,我们可以看到基于各个外设事件回调函数使用方式选择的宏。
7 F8 X$ J. k" l* L1 {6 @) R  O' s* O% q& Q
微信图片_20230917112233_2.png

0 V5 u+ `6 f8 v
若我们不对该头文件的相应外设事件的回调函数调用方式的宏定义做调整,则默认传统回调方式,即legacy方式,非指针方式。若将相应的宏值改为1,则该外设事件相关回调函数采用指针注册方式。

8 [9 G. |' b2 \) U: E1 z
转载自STM32公众号
3 R8 ~/ ~4 q5 L! d  z+ D" r

9 K3 q( H- v# o* m( \$ \  i
赞 收藏 评论0 发布时间:2023-9-22 10:59

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版