打印
[STM32G4]

LL库微秒us级函数

[复制链接]
673|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linfelix|  楼主 | 2024-8-31 11:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     项目使用STM32CubeMX生成的STM32G474的LL库程序,stm32g4xx_ll_utils.c文件内的延时函数,只有LL_mDelay()延时函数,此函数为ms级延时函数,只能在程序里提供最低1ms延时(LL_mDelay(0),官方程序里默认防止开发人员设置为0,会在你要延时的时间参数上加1,已用示波器验证过,设置为参数为1,示波器会采集到IO口为2ms的波形电平变化)。

       要想在程序里实现us微秒级延时,主要需要修改添加stm32g4xx_ll_utils.c文件里面的函数,需要添加us级初始化函数,初始化滴答定时器的重装寄存器SysTick->LOAD值为169(注意,我设置单片机频率为170Mhz,所以设置为(169+1)/170000000=1us),LLLL_InitTick(HCLKFrequency, 1000000U)值改为1000000,LL_InitTick函数里面会进行170000000/1000000=170;所以原本ms毫秒级延时为170000000/1000=170000,寄存器值设置为(169999+1)/170000000=1ms。

     前面说过官方程序里默认防止开发人员设置为0,会在你要延时的时间参数上加1,因为我是个人使用,不会写0,所以删掉这块加1代码,如下图红色圈内LL_uDelay()函数所示,这个是仿照官方的LL_mDelay()函数(棕色圈内)写的;官方这个函数注意要注释掉(我现在是解释对比,所以去掉注释了),因为滴答定时器的重装寄存器参数值不为ms毫秒级的参数,不能再实现准确延时,所以我们要重写LL_mDelay()函数;

       重写LL_mDelay()函数如下图,并且原LL_mDelay()函数已注释掉,可以看到ms毫秒级延时,是用到1000us的延时循环做的,也可以直接给LL_uDelay()函数附上*1000的值;

     注意stm32g4xx_ll_utils.h文件里面加上新的函数声明,和mian.c文件里面的滴答定时器时钟初始化函数名称要修改成LL_Init1usTick(170000000)。

下图为示波器 测量的1us、5us、10us、1ms 、10ms 、20ms延时IO引脚波形图





使用特权

评论回复
沙发
无法去污粉| | 2024-8-31 21:42 | 只看该作者
可以通过配置 SysTick 定时器来达到你的需求。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

1301

帖子

1

粉丝