STM32-实现us延时
STM32-实现us延时
1.当在cubemx配置时基源SysTick时可以使用以下函数直接进行us延时,当用TIM时以下函数会失效,如果使用freertos使用tim也可以用以下函数
void HAL_Delay_us(uint32_t us)//延时us函数
{//需要cubemx配置时SYS时基源选择SysTick__IO uint32_t currentTicks = SysTick->VAL;/* Number of ticks per millisecond */const uint32_t tickPerMs = SysTick->LOAD + 1;/* Number of ticks to count */const uint32_t nbTicks = ((us - ((us > 0) ? 1 : 0)) * tickPerMs) / 1000;/* Number of elapsed ticks */uint32_t elapsedTicks = 0;__IO uint32_t oldTicks = currentTicks;do {currentTicks = SysTick->VAL;elapsedTicks += (oldTicks < currentTicks) ? tickPerMs + oldTicks - currentTicks :oldTicks - currentTicks;oldTicks = currentTicks;} while (nbTicks > elapsedTicks);
}
2.使用额外的定时器单独进行us延时
缺点:需要额外的外设资源
cubemx配置:
目标将TIM分频到1Mhz,即1us加一次
stm32f4:
TIM1–168M,我们就168分频,填168-1;
普通定时器,84M,填84-1
代码实现
us函数实现
#define US_TIM htim7 //定义需要的定时器 只需要修改这个就可以了,记得包含tim.h就可以了
void HAL_TimDelay_us(uint32_t us)//注意不要超过65535,一般大于10ms用HAL_Delay()函数
{__HAL_TIM_SetCounter(&US_TIM,0);//清零HAL_TIM_Base_Start(&US_TIM);//开启定时器while(__HAL_TIM_GetCounter(&US_TIM)<us){};HAL_TIM_Base_Stop(&US_TIM);//关闭定时器
}
同时我们还可以封装一个延时ms的函数,下次可以不用HAL_Delay()了
void HAL_TimDelay_ms(uint32_t ms)
{for(uint32_t Delay_Cnt=0;Delay_Cnt<ms;Delay_Cnt++)HAL_TimDelay_us(997);//考虑实际代码运行损耗,不写1000,差一点点补上
}
实测延时1ms和延时300ms时误差可以在0.2%内,就算写1000其实误差也很小,无所谓的
最后总的代码汇总如下
void HAL_TimDelay_us(uint32_t us);//延时us函数
void HAL_TimDelay_ms(uint32_t ms);//延时ms函数#define US_TIM htim7//修改定时器,注意两点,第一需要定时器分频到1M,第二记得包含tim.h,否则找不到htimxvoid HAL_TimDelay_us(uint32_t us)//延时us函数
{__HAL_TIM_SetCounter(&US_TIM,0);//清零HAL_TIM_Base_Start(&US_TIM);//开启定时器while(__HAL_TIM_GetCounter(&US_TIM)<us){};HAL_TIM_Base_Stop(&US_TIM);//关闭定时器
}
void HAL_TimDelay_ms(uint32_t ms)//延时ms函数
{for(uint32_t Delay_Cnt=0;Delay_Cnt<ms;Delay_Cnt++)HAL_TimDelay_us(997);//考虑实际代码运行损耗,不写1000,差一点点补上
}
STM32-实现us延时相关推荐
- STM32怎样实现延时?
答案是操作Systick系统嘀嗒定时器.这个定时器比较特殊,它属于Cortex-M3处理器内核外设,故并非STM32所特有,而是所有以CM3为内核的MCU都具有的一种定时器.CM3提供了4个寄存器来控 ...
- STM32 us精确延时方式
STM32精确延时方式 使用TIM定时器方式延时 使用空代码方式延时 F103系列 F429系列 本文纯属记录自己学习历程,如有不妥之处,欢迎指正. 使用TIM定时器方式延时 使用STM32CubeM ...
- STM32初学笔记---延时函数及u16、u32、u8
在编写流水灯程序时发现,和对之前用的51单片机所用的普通软件延时函数有所不同,51的普通软件延时函数我们一般是这样编写的: #include<reg52.h> #include< ...
- STM32三种延时函数实现方法
想学习单片机的同学可以关注.私信我或者在评论区回复我要入门.在51入门的时候我们第一个实验就是点亮LED灯,如果没有延时,我们就很难看到亮灭效果. 1. STM32延时函数概述 在产品开发的过程中我们 ...
- STM32使用定时器延时
STM32F427 使用定时器T4作为延时定时器 设置如下:主要是预分频设置为90,因为系统APB1的时钟是90Hz 预分频90 #ifndef __DELAY_H__ #define __DELAY ...
- stm32中的延时函数
//粗延时函数,微秒 void delay_nus(u16 time) { u16 i=0; while(time--) { i=10; //自己定义 while(i--) ; } } //毫秒级的 ...
- STM32 进阶教程 4 - 软件实现高精度延时 2
前言 软件工程师在在实际项目开发过程中,软件延时想必或多或少都有接触过,诸如delay_s(x); delay_ms(x);delay_us(x)等类型的延时函数大家也一定见过或自已曾经实现过,本节给 ...
- 关于STM32的延时问题
最近一直在搞一辆智能小车,用STM32单片机驱动,往上面加了很多外设,外型如下: 今天下午打算在LCD显示一个温度,却发现怎么都显示不了,也找不出原因,还好我们公司的郑工帮我看出了问题,让我顺利改过来 ...
- 古董万年历升级WiFi授时 STM32+ESP8266
[小制作]古董万年历升级WiFi授时 STM32+ESP8266 故事,还得从一只蝙蝠说起... 先来看一下前后对比 硬件方面 升级之前 升级之后 功能方面 调用序列图-这里只放个大概 详细的还得结合 ...
- linux内核的延时函数,linux中内核延时函数 (转)
第一类延时函数原型是:(忙等) void ndelay(unsigned long nsecs); void udelay(unsigned long usecs); void mdelay(unsi ...
最新文章
- 五分钟了解机器学习十大算法
- XMLHTTP.readyState的五种状态
- Nginx的rewrite之rewrite_log指令
- 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)
- 连续交付友好的Maven版本
- 湖北大学计算机复试笔试题型,2016年湖北大学计算机与信息工程学院计算机组成原理复试笔试最后押题五套卷...
- (王道408考研操作系统)第四章文件管理-第一节6:文件基本操作
- dj鲜生-13-类视图-使用篇
- DataList分页访问FooterTemplate模板里的控件
- Spring MVC中基于自定义Editor的表单数据处理技巧
- oracle裸设备文件复制,Oracle Goldengate在HP平台裸设备文件系统OGG-01028处理
- 系统学习 TypeScript(三)——基础类型
- [20171120]11G关闭直接路径读.txt
- c语言编程学习入门指南
- 2021年最完善的谷歌SEO关键词调研技巧
- ERP软件与需求漫延,如何解决?
- php合成flv,用php将任何格式视频转为flv
- 谢惠民恽自求易法槐钱定边数学分析习题课讲义第2版上册全部思考题练习题参考题解答...
- 3DMAX - 使用编辑多边形的小技巧
- AT2442 フェーン現象 (Foehn Phenomena)