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

【经验分享】STM32的HAL库实现自定义延时函数delay_us()

[复制链接]
STMCU小助手 发布时间:2022-6-7 09:54
  STM32程序从标准库移植到HAL库的时候,会发现HAL库中只有一个毫秒级延时函数HAL_Delay(),而没有微秒级延时delay_us(),本文就在HAL库中用定时器实现这个delay_us()。
    如下图,找到HAL_Delay()函数定义的地方,发现这个函数有__weak标识,是一个弱化函数,可以被重写。
9A2GMQDMGC8RJ$XVF)V[{)D.png
    由于HAL库许多地方都使用了HAL_Delay()函数,为了避免惹麻烦建议不重写,可以用定时器自己写一个延时函数。
    项目设置,勾选后每个外设的源文件.c、头文件.h分别成双出现。- k8 R4 h4 R( B, h9 h6 {, W
`H_FITDB~)[7409}8`HDYAT.png
    我用的是ISP编程,选择的是Serial Wire。
- A; M- w% i1 ^/ ^: t; V  _
]K2J466)(2)XT2OF{1@TEYG.png
    配置外部高速时钟。
0 ?. e+ X  @5 x# E, d: M* b, J! r
U(Q8V{I}@[LV_OYO7ZN[F48.png
为了观察效果,开一个LED,它在PC0管脚,低电平点亮。
% B# ?7 M- {7 Y& x! {
4U0UV6DA6}1~NLDCVY[[DQ1.png
W626RPDODT0F@ACAA%WMR0Q.png
    本实例用到了TIM7,它挂在APB1上,时钟为72MHz。( w( d  B2 Y! m+ h3 f  e, y
CU8XMW_DF4WMD[0QDC~093Y.png
    激活TIM7,设置如下:
  • 预分频PSC为71,分频后TIM7时钟为72/(71+1)=1MHz
    4 \" Q0 V2 x8 M& y5 A* ]: N
  • 计数模式为向上
    3 F$ R. q$ W' \/ d9 F
  • 计数周期为1,就是说定时器一个周期后就溢出了,而定时器一个周期的时间是定时器时钟频率的倒数,1/1M,也就是1us。
    7 b+ x' d$ E. g* I6 h+ e5 K
    ( k8 {2 Y1 h. u0 G( g# U
B}3BH8(FCZUl772QPAL)4.png
    生成代码。
" f; K$ M" Y3 v& c
373YG6V_R7T(MV})BE@I3{M.png
    在tim.c的用户代码区添加如下代码。
+ F8 s2 T+ `1 E
X1Q0M6NKWC}1QY[1@KG1[_3.png
    在tim.h的user code处添加如下引用代码,其中HAL_Delay_us()是微秒级延时函数,HAL_Delay_ms()是毫秒级延时函数。
$SS[D5HFC%~{J}S2TL_%~}Q.png
    main.c中添加如下代码,测试效果。8 X: `+ S- x  W3 O( ]4 v* i+ l
JBD8P9(]KK3N0_IZ}LR`MPW.png
    上面代码连续用了13个延时函数,是为了凑够1秒方便观察。另外延时函数的参数是uint16_t,无符号短整型,数值范围为0~65535,数值超限会报错,如下图。
{~HI~BFK_{QSJ$iCT)BWN.png
    编译代码。
; \3 J& c5 z: h. c1 C: J
6XBQ3XFU7Y]MVL7C[%Z6[%P.png
  
收藏 评论0 发布时间:2022-6-7 09:54

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版