STM32的时钟(二):SysTick定时器实现Delay()函数

SysTick是一个简单的24位倒计数定时器,当计数到0时,可产生中断请求,系统将从RELOAD 寄存器中自动重装定时初值,只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作时钟来源可以是处理器时钟,也可以是参考时钟(通常是片上时钟源)。

SysTick定时器有4个寄存器:CTRL、LOAD、VAL、CALIB

1.分析misc.c库函数中:SysTick_CLKSourceConfig()函数

1)检测入口参数;

       关于assert_param()的使用:
        在固件库中,
实际上assert_param是一个宏定义,它的作用就是检测传递给函数的参数是否有效,即满足规定范围的参数如果超出设定的范围,则         这个assert_param()可以在运行的程序调用到这个函数时报告错误,使程序员可以及时发现错误,这是一种常见的软件技术,可以在调试阶段帮助程         序员快速地排除明显的错误。

2)选择时钟源;

2.core_cm4.h库函数中:__STATIC_INLINE uint32_t SysTick_Config()函数

3.位指示宏和位屏蔽宏:

以下摘自《零死角玩转STM32》

   寄存器位指示宏:SysTick_xxx_Pos ,宏展开后即为xxx在相应寄存器中的位置,如控制SysTick时钟源的SysTick_CTRL_CLKSOURCE_Pos ,宏展开为2,这个寄存器位正是在寄存器STK_CTRL中的Bit2

   寄存器位屏蔽宏:SysTick_xxx_Msk,宏展开是xxx的位全部置1后,左移SysTick_xxx_Pos位。如控制SysTick时钟源的 SysTick_CTRL_CLKSOURCE_Msk,宏展开为(1ul <<  SysTick_CTRL_CLKSOURCE_Pos),把无符号长整型数值(ul) 1左移2位,得到了一个只有Bit2:CLKSOURCE位被置1,其它位为0的数值,这样的数值配合位操作 &(按位与)、|(按位或)可以很方便地修改寄存器的某些位。假如控制CLKSOURCE 需要四个寄存器位,这个宏就应该被改为(0xf ul << SysTick_CTRL_CLKSOURCE_Pos),这样就会得到一个关于CLKSOURCE的四位被置1的值,这些宏的参数就是这样被确定的。

4.实现Delay函数



你可能感兴趣的:(STM32的时钟(二):SysTick定时器实现Delay()函数)