项目使用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引脚波形图
|