STM32精确延迟1us和1ms的函数

STM32精确延迟1us和1ms的函数

延迟1us:

 1 /*******************************************************************************
 2 * 函 数 名         : delay_us
 3 * 函数功能           : 延时函数,延时us
 4 * 输    入         : i
 5 * 输    出         : 无
 6 *******************************************************************************/
 7 void delay_us(u32 i)
 8 {
 9     u32 temp;
10     SysTick->LOAD=9*i;         //设置重装数值, 72MHZ时
11     SysTick->CTRL=0X01;         //使能,减到零是无动作,采用外部时钟源
12     SysTick->VAL=0;                //清零计数器
13     do
14     {
15         temp=SysTick->CTRL;           //读取当前倒计数值
16     }
17     while((temp&0x01)&&(!(temp&(1<<16))));     //等待时间到达
18     SysTick->CTRL=0;    //关闭计数器
19     SysTick->VAL=0;        //清空计数器
20 }

延迟1ms:

 1 /*******************************************************************************
 2 * 函 数 名         : delay_ms
 3 * 函数功能           : 延时函数,延时ms
 4 * 输    入         : i
 5 * 输    出         : 无
 6 *******************************************************************************/
 7 void delay_ms(u32 i)
 8 {
 9     u32 temp;
10     SysTick->LOAD=9000*i;      //设置重装数值, 72MHZ时
11     SysTick->CTRL=0X01;        //使能,减到零是无动作,采用外部时钟源
12     SysTick->VAL=0;            //清零计数器
13     do
14     {
15         temp=SysTick->CTRL;       //读取当前倒计数值
16     }
17     while((temp&0x01)&&(!(temp&(1<<16))));    //等待时间到达
18     SysTick->CTRL=0;    //关闭计数器
19     SysTick->VAL=0;        //清空计数器
20 }

注意:以上两函数中间的参数u32 i不能超过1800,举例,想定时一分钟,可以通过for循环让delay_ms(1000)走60次,而不能使用delay_ms(60000),不然程序就出错了。

时间: 2024-12-13 17:44:00

STM32精确延迟1us和1ms的函数的相关文章

STM32启动文件详解及SystemInit函数分析(转)

;先在RAM中分配系统使用的栈,RAM的起始地址为0x2000_0000 ;然后在RAM中分配变量使用的堆 ;然后在CODE区(flash)分配中断向量表,flash的起始地址为0x0800_0000,该中断向量表就从这个起始地址开始分配 ;分配完成后,再定义和实现相应的中断函数, ;所有的中断函数全部带有[weak]特性,即弱定义,如果编译器发现在别处文件中定义了同名函数,在链接时用别处的地址进行链接. ;中断函数仅仅实现了Reset_Handler,其他要么是死循环,要么仅仅定义了函数名称

STM32 HAL库的定时器中断回调函数跟串口中断回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { //添加回调后的程序逻辑 if (htim->Instance == htim2.Instance) //判断是否定时器2 { } } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { //添加回调后的程序逻辑 if(huart->Instance == USART1) //判断是否串口1 { } } 中断

基于STM32实现的的短信实时传送位置----GPS+GSM

总的来说就是实现了一个GPS数据通过串口发送给STM32, STM32进行解码, 在通过串口把解码提取出的经纬度发送给GSM, GSM根据给定的手机号发短信过去. main函数里的最后一个while循环是每隔5s发一个位置出去 延时函数写在sim900a.c里,可以自行调节时间间隔. 就是这么任性. main.c /* ****************************************************************************** * @attenti

VC++中的延时函数

原文链接:http://www.educity.cn/develop/478947.html VC中提供了很多关于时间操作的函数,编写程序时我们可以跟据定时的不同精度要求选择不同的时间函数来完成定时和计时操作. 方式一:VC中的WM_TIMER消息映射能进行简单的时间控制.首先调用函数SetTimer()设置定时 间隔,如SetTimer(0,200,NULL)即为设置200ms的时间间隔.然后在应用程序中增加定时响应函数 OnTimer(),并在该函数中添加响应的处理语句,用来完成到达定时时间

lodash用法系列(3),使用函数

Lodash用来操作对象和集合,比Underscore拥有更多的功能和更好的性能. 官网:https://lodash.com/引用:<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.min.js"></script>安装:npm install lodash 首先通过npm安装lodash:npm i --save lodash 在js文件中引用lodash:var _ =

JavaScript学习总结(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例

JavaScript学习总结(一)--延迟对象.跨域.模板引擎.弹出层.AJAX示例 目录 一.AJAX示例 1.1.优点 1.2.缺点 1.3.jQuery AJAX示例 二.延迟对象(Deferred) 2.1.回调函数 2.2.deferred.done 三.跨域 3.1.什么是跨域 3.2.JSONP跨域 3.3.jQuery使用JSONP跨域 3.4.跨域资源共享(CORS) 3.5.小结 四.弹出层 五.模板引擎 5.1.Hello World 5.2.方法 5.3.与AJAX结合应

Window中C++进行精确计时的方法

嗯,程序员一个永恒的追求就是性能吧? 为了衡量性能,自然需要计时. 奈何无论C标准库还是C++标准库,因为通用性的考虑,其time API精度都不高.基本都是毫秒级的. 所以如果要真正精确地衡量程序的性能,还是得靠系统API.下面的计时方式可以精确到<1us. 如果不想了解什么原理,可以直接拷走下面这个简易计时器类.放在一个头文件里,用的时候Include一下就行. #include<windows.h> class MyTimer { private: LARGE_INTEGER _f

一定间隔时间下重复执行一个函数的几个方法

如果有个操作,我们需要过一会儿再做,或者每隔一段时间就要做一次.可以有很多种做法. 独立线程 是的,对.NET Framework本身一知半解的程序员才会使用这种方案.不过,现实中这个方案其实并不少见. public static void Repeat(this Action action, TimeSpan interval) { new Thread(new ThreadStart(() => { while(true) { Thread.Sleep(interval); action()

jquery学习之路之核心函数

jquery 1.核心 : 核心函数: jquery([sel,[context]]). each(callback). jquery(html,[ownerDoc]). size(). jquery(callback). length(). jquery.holdready(hold). selector. context. get([index]). index([selector|element]). data([key],[value]). removeData([name|list])