STM32 LL库延时函数 LL_mDelay解析

博客介绍了STM32系统定时器(SysTick)的配置过程,包括如何设置时钟源、计数器初值,以及如何通过SysTick实现1ms的时基。代码示例展示了如何初始化SysTick以产生1ms中断,并提供了延时函数LL_mDelay的实现,该函数基于SysTick计数器进行精确延时。
摘要由CSDN通过智能技术生成

注意看上面的CTRL寄存器的CLKSOURCE位(时钟源位),它有两个选择,一个是内核时钟源FLCK(72MHz),一个是外部时钟源HCLK,这里应该是

我们知道,我们设定一个计数,那么每次计数器减到0,时间经过了:系统时钟周期 *计数器初值.我们使用72M作为系统时钟,那么每次计数器减1所用的时间是1/72M,计数器的初值如果是72000,那么每次计数器减到0,时间经过(1/72M)*72000= 0.001,(简单理解:用72M的时钟频率,即1s计数72M=72000000次,那1ms计数72000次,所以计数值为72000),

让我们来看看这些寄存器的配置:

系统库core_cm3.h中

STATIC_INLINE void LL_InitTick(uint32_t HCLKFrequency, uint32_t Ticks)

{

/* Configure the SysTick to have interrupt in 1ms time base */

SysTick->LOAD = (uint32_t)((HCLKFrequency / Ticks) - 1UL); /* set reload register */

SysTick->VAL = 0UL; /* Load the SysTick Counter Value */

SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |

SysTick_CTRL_ENABLE_Msk; /* Enable the Systick Timer */

}

再看看

/* SysTick Control / Status Register Definitions */

#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */

#define SysTick_CTRL_COUNTFLAG_Msk (1ul << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */



#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */

#define SysTick_CTRL_CLKSOURCE_Msk (1ul << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */



#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */

#define SysTick_CTRL_TICKINT_Msk (1ul << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */



#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */

#define SysTick_CTRL_ENABLE_Msk (1ul << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */



/* SysTick Reload Register Definitions */

#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */

#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFul << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */



/* SysTick Current Register Definitions */

#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */

#define SysTick_VAL_CURRENT_Msk (0xFFFFFFul << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */

#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */

#define SysTick_CTRL_CLKSOURCE_Msk (1ul << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */

ul是unsigned long 型, 这两行代码的意思是1左移2位,也就是将2这位置1,这里就是选择了内核时钟源HCLK(72MHz),所以我们要把计数初值设置为72000,这样才能产生1ms的基准时钟

1、 LL_Init1msTick(72000000);

2、 LL_InitTick(HCLKFrequency, 1000U);/初始化systick定时器

3、void LL_mDelay(uint32_t Delay)

void LL_Init1msTick(uint32_t HCLKFrequency)

{

/* Use frequency provided in argument */

LL_InitTick(HCLKFrequency, 1000U);

}

初始化systick定时器跳转;

STATIC_INLINE void LL_InitTick(uint32_t HCLKFrequency, uint32_t Ticks)

{

/* Configure the SysTick to have interrupt in 1ms time base */

SysTick->LOAD = (uint32_t)((HCLKFrequency / Ticks) - 1UL); /* set reload register */

SysTick->VAL = 0UL; /* Load the SysTick Counter Value */

SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |

SysTick_CTRL_ENABLE_Msk; /* Enable the Systick Timer */

}

初始化systick定时器,并重装载为1MS(72Mhz对应1MS为72M/1000)的时间;



void LL_mDelay(uint32_t Delay)

{

__IO uint32_t tmp = SysTick->CTRL; /* Clear the COUNTFLAG first */

/* Add this code to indicate that local variable is not used */

((void)tmp);



/* Add a period to guaranty minimum wait */

if (Delay < LL_MAX_DELAY)

{

Delay++;

}

while (Delay)

{

if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) != 0U)

{

Delay--;

}

}

}

延时函数,判断SysTick寄存器是否数到0若数到0(SysTick_CTRL_COUNTFLAG_Msk数到0为1读取后自动置0)则Delay减1

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值