注意看上面的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

STM32 LL库延时函数 LL_mDelay解析相关推荐

  1. STM32三种延时函数实现方法

    想学习单片机的同学可以关注.私信我或者在评论区回复我要入门.在51入门的时候我们第一个实验就是点亮LED灯,如果没有延时,我们就很难看到亮灭效果. 1. STM32延时函数概述 在产品开发的过程中我们 ...

  2. stm32中的延时函数

    //粗延时函数,微秒 void delay_nus(u16 time) { u16 i=0; while(time--) { i=10;  //自己定义 while(i--) ; } } //毫秒级的 ...

  3. STM32初学笔记---延时函数及u16、u32、u8

     在编写流水灯程序时发现,和对之前用的51单片机所用的普通软件延时函数有所不同,51的普通软件延时函数我们一般是这样编写的: #include<reg52.h> #include< ...

  4. 关于SYSTICK延时函数的两个小疑问

    我们知道,STM32库函数里通常使用来自内核的系统定时器SYSTICK作为时基,实现计数延时.一般来讲,ST公司提供的库函数里将SYSTICK定时器配置为1ms的定时器中断,每产生1ms中断则相关中断 ...

  5. linux内核的延时函数,linux中内核延时函数 (转)

    第一类延时函数原型是:(忙等) void ndelay(unsigned long nsecs); void udelay(unsigned long usecs); void mdelay(unsi ...

  6. stm32延时us寄存器_自己写一个STM32 HAL库的US微秒延时函数

    当本菜鸟开始接触STM32的时候还是看了原子哥的寄存器教程才跳坑的. 现在ST已经把HAL库推向了主流,但是令我不解的是,HAL那么强大,居然没有一个微秒级别的延时函数?! 黑人问号脸. 好了,废话不 ...

  7. stm32延时us寄存器_STM32延时函数的四种方法

    关注.星标公众号,不错过精彩内容 单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us()和毫秒级delay_ms().本文基于STM32F207介绍4种不同方式实现的延时函数. ...

  8. 从头开始写STM32F103C8T6驱动库(四)——编写延时函数,详解Systick

    系列文章目录 Github开源地址 从头开始写STM32F103C8T6驱动库(一)--STM32CubeMX创建并调整工程结构 从头开始写STM32F103C8T6驱动库(二)--编写系统初始化程序 ...

  9. STM32延时函数的四种方法:普通延时(2种)、SysTick 定时器延时(2种)

    STM32延时函数的三种方法:普通延时.SysTick 定时器延时(1.中断方式:2.非中断方式) 单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us( )和毫秒级delay_ ...

  10. STM32延时函数的四种方法

    目录 1.普通延时 2.定时器中断 3.查询定时器 4.汇编指令 单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us()和毫秒级delay_ms().本文基于STM32F207 ...

最新文章

  1. sqlserver mysql 乱码_SQLServer数据库如何解决中文乱码问题?方法有哪些?
  2. 空气球+操作系统,海尔智能家居雄心何在?
  3. gatewayproperties 是空_一个空手套白狼的商业模式
  4. EasyUI中datagrid的行编辑模式中,找到特定的Editor,并为其添加事件
  5. JAVA连接 mongodb(mac OSX)
  6. 错误make: nvcc: Command not found 解决方案
  7. JavaFX 8的弹出式编辑器
  8. 通信原理matlab实验课程设计,通信原理matlab课程设计报告
  9. 曲线图绘制软件_OpenFoam离心泵数值仿真及不同CFD软件间对比
  10. Atitit ceo之道 艾龙 著 atitit 各分部ceo cao行政经理职责.docx 1.1. “重大执行权”和“日常执行权”两块分离 ,重大事件如大政方针、重大人事任命和重大投资方面
  11. 使用hexo+github搭建免费个人博客详细教程
  12. go module使用教程:使用go mod的方法.报错go: cannot determine module path for source directory E:\tttttt (outside
  13. Fernando Torres
  14. 50. 文件上传篇——文件上传漏洞原理
  15. java一个球左右躲避障碍_java 飞机躲避小游戏分析及实现[源码][附图]
  16. 全国计算机等级考试监考培训,全国计算机等级考试 (NCRE) 监考培训
  17. Android 6.0 Marshmallow
  18. Patch:虚拟DOM最核心的部分--如何对比虚拟DOM树,以及如果生成真实DOM
  19. Element-ui源码分析之滚动条— el-scrollbar
  20. wps的高亮怎么用_WPS表格高亮显示重复项功能的使用及其不足介绍与改进

热门文章

  1. Life of Pie 少年派的奇幻漂流
  2. 何新生的英语史(八)—看好莱坞学英语,就是这么简单 1
  3. 分类与预测模型效果评价
  4. Golang使用lxn/walk做GUI界面开发:邮件群发器
  5. python将两个文件合并_python实现两个文件合并功能
  6. 全国计算机四级薪资,全国计算机四级通过率有多少
  7. 王垠 java,王垠,40行代码,JAVA吧的大神怎么评论?
  8. Silverlight实用窍门系列:1.Silverlight读取外部XML加载配置---(使用WebClient读取XAP包同目录下的XML文件))【附带实例源码】...
  9. 【xctf之easyphp】
  10. mysql快照数据_制作mysql数据快照