STM32 LL库延时函数 LL_mDelay解析
注意看上面的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解析相关推荐
- STM32三种延时函数实现方法
想学习单片机的同学可以关注.私信我或者在评论区回复我要入门.在51入门的时候我们第一个实验就是点亮LED灯,如果没有延时,我们就很难看到亮灭效果. 1. STM32延时函数概述 在产品开发的过程中我们 ...
- stm32中的延时函数
//粗延时函数,微秒 void delay_nus(u16 time) { u16 i=0; while(time--) { i=10; //自己定义 while(i--) ; } } //毫秒级的 ...
- STM32初学笔记---延时函数及u16、u32、u8
在编写流水灯程序时发现,和对之前用的51单片机所用的普通软件延时函数有所不同,51的普通软件延时函数我们一般是这样编写的: #include<reg52.h> #include< ...
- 关于SYSTICK延时函数的两个小疑问
我们知道,STM32库函数里通常使用来自内核的系统定时器SYSTICK作为时基,实现计数延时.一般来讲,ST公司提供的库函数里将SYSTICK定时器配置为1ms的定时器中断,每产生1ms中断则相关中断 ...
- linux内核的延时函数,linux中内核延时函数 (转)
第一类延时函数原型是:(忙等) void ndelay(unsigned long nsecs); void udelay(unsigned long usecs); void mdelay(unsi ...
- stm32延时us寄存器_自己写一个STM32 HAL库的US微秒延时函数
当本菜鸟开始接触STM32的时候还是看了原子哥的寄存器教程才跳坑的. 现在ST已经把HAL库推向了主流,但是令我不解的是,HAL那么强大,居然没有一个微秒级别的延时函数?! 黑人问号脸. 好了,废话不 ...
- stm32延时us寄存器_STM32延时函数的四种方法
关注.星标公众号,不错过精彩内容 单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us()和毫秒级delay_ms().本文基于STM32F207介绍4种不同方式实现的延时函数. ...
- 从头开始写STM32F103C8T6驱动库(四)——编写延时函数,详解Systick
系列文章目录 Github开源地址 从头开始写STM32F103C8T6驱动库(一)--STM32CubeMX创建并调整工程结构 从头开始写STM32F103C8T6驱动库(二)--编写系统初始化程序 ...
- STM32延时函数的四种方法:普通延时(2种)、SysTick 定时器延时(2种)
STM32延时函数的三种方法:普通延时.SysTick 定时器延时(1.中断方式:2.非中断方式) 单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us( )和毫秒级delay_ ...
- STM32延时函数的四种方法
目录 1.普通延时 2.定时器中断 3.查询定时器 4.汇编指令 单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us()和毫秒级delay_ms().本文基于STM32F207 ...
最新文章
- sqlserver mysql 乱码_SQLServer数据库如何解决中文乱码问题?方法有哪些?
- 空气球+操作系统,海尔智能家居雄心何在?
- gatewayproperties 是空_一个空手套白狼的商业模式
- EasyUI中datagrid的行编辑模式中,找到特定的Editor,并为其添加事件
- JAVA连接 mongodb(mac OSX)
- 错误make: nvcc: Command not found 解决方案
- JavaFX 8的弹出式编辑器
- 通信原理matlab实验课程设计,通信原理matlab课程设计报告
- 曲线图绘制软件_OpenFoam离心泵数值仿真及不同CFD软件间对比
- Atitit ceo之道 艾龙 著 atitit 各分部ceo cao行政经理职责.docx 1.1. “重大执行权”和“日常执行权”两块分离 ,重大事件如大政方针、重大人事任命和重大投资方面
- 使用hexo+github搭建免费个人博客详细教程
- go module使用教程:使用go mod的方法.报错go: cannot determine module path for source directory E:\tttttt (outside
- Fernando Torres
- 50. 文件上传篇——文件上传漏洞原理
- java一个球左右躲避障碍_java 飞机躲避小游戏分析及实现[源码][附图]
- 全国计算机等级考试监考培训,全国计算机等级考试 (NCRE) 监考培训
- Android 6.0 Marshmallow
- Patch:虚拟DOM最核心的部分--如何对比虚拟DOM树,以及如果生成真实DOM
- Element-ui源码分析之滚动条— el-scrollbar
- wps的高亮怎么用_WPS表格高亮显示重复项功能的使用及其不足介绍与改进
热门文章
- Life of Pie 少年派的奇幻漂流
- 何新生的英语史(八)—看好莱坞学英语,就是这么简单 1
- 分类与预测模型效果评价
- Golang使用lxn/walk做GUI界面开发:邮件群发器
- python将两个文件合并_python实现两个文件合并功能
- 全国计算机四级薪资,全国计算机四级通过率有多少
- 王垠 java,王垠,40行代码,JAVA吧的大神怎么评论?
- Silverlight实用窍门系列:1.Silverlight读取外部XML加载配置---(使用WebClient读取XAP包同目录下的XML文件))【附带实例源码】...
- 【xctf之easyphp】
- mysql快照数据_制作mysql数据快照