FREERTOS使用Delay函数

news/2025/3/15 5:06:20/

//初始化延迟函数
//SYSTICK的时钟固定为AHB时钟,基础例程里面SYSTICK时钟频率为AHB/8
//这里为了兼容FreeRTOS,所以将SYSTICK的时钟频率改为AHB的频率!
//SYSCLK:系统时钟频率
void delay_init()
{u32 reload;SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择外部时钟  HCLKfac_us=SystemCoreClock/1000000;				//不论是否使用OS,fac_us都需要使用reload=SystemCoreClock/1000000;				//每秒钟的计数次数 单位为M  reload*=1000000/configTICK_RATE_HZ;			//根据configTICK_RATE_HZ设定溢出时间//reload为24位寄存器,最大值:16777216,在72M下,约合0.233s左右	fac_ms=1000/configTICK_RATE_HZ;				//代表OS可以延时的最少单位	   SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;   	//开启SYSTICK中断SysTick->LOAD=reload; 						//每1/configTICK_RATE_HZ秒中断一次	SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;   	//开启SYSTICK    
}								    
fac_us = 72M/1M //这句话就是计算在 SystemCoreClock 时钟频率下延时 1us 需要多少个 SysTick 时钟周期
reload= 72*1000000/configTICK_RATE_HZ;//72*1S/configTICK_RATE_HZ  72*1000000/configTICK_RATE_HZ
比如系统节拍1MS,即每个RTOS系统节拍1MS需要72*1000个时钟周期,为了确保定时器与系统时钟对应那么装载值必须为每1MS产生一次中断//延时nus
//nus:要延时的us数.	
//nus:0~204522252(最大值即2^32/fac_us@fac_us=168)	    								   
void delay_us(u32 nus)
{		u32 ticks;u32 told,tnow,tcnt=0;u32 reload=SysTick->LOAD;				//LOAD的值	    	 ticks=nus*fac_us; 						//需要的节拍数 told=SysTick->VAL;        				//刚进入时的计数器值while(1){tnow=SysTick->VAL;	if(tnow!=told){	    if(tnow<told)tcnt+=told-tnow;	//这里注意一下SYSTICK是一个递减的计数器就可以了.else tcnt+=reload-tnow+told;	    told=tnow;if(tcnt>=ticks)break;			//时间超过/等于要延迟的时间,则退出.}  };										    
}  比如 delay_us(50),在刚进入 delay_us 的时候先计算好这段延时需要等待的 systick 计数
次数,这里为 50*72(假设系统时钟为 72Mhz,那么 systick 每增加 1,fac_us=SystemCoreClock/1000000;),然后我
们就一直统计 systick 的计数变化,直到这个值变化了 50*72,一旦检测到变化达到或者超
过这个值,就说明延时 50us 时间到了


http://www.ppmy.cn/news/810135.html

相关文章

delay函数代码

delay.c代码如下 #include "./delay/delay.h" /*** 功能&#xff1a;SysTick定时器初始化函数* 参数&#xff1a;None* 返回值&#xff1a;None*/ void initSysTick(void) {SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //设置时钟源8分频SysTick->CT…

STM32中HAL_Delay函数的改写

最近在做NVC与STM32芯片的通信&#xff0c;因为NVC要匹配时序宽度&#xff0c;考虑到系统时钟的频率的设定&#xff0c;所以专门研究了一下&#xff0c;也是为了以后遇到的话可以回头看看笔记之类&#xff0c;也给大家做一个参考 STM32是8分频特性&#xff0c;具体的延迟函数可…

STM32F4(用SysTick实现Delay函数)

STM32F4(用SysTick实现Delay函数) GitHub仓库&#xff1a;https://github.com/XinLiGitHub/STM32F4xx_Delay_Example PS&#xff1a;博文不再更新&#xff0c;后续更新会在GitHub仓库进行。 1&#xff0c;开发环境 1&#xff0c;适用芯片&#xff1a;STM32F4全部芯片 2&…

关于各种型号单片机delay函数不起作用问题的解决方法

这里以单片机HT45F75为例&#xff1a; // 定义一个延时xms毫秒的延时函数 void delay(unsigned int xms) // xms代表需要延时的毫秒数 { unsigned int x,y; for(xxms;x>0;x--) for(y960/4;y>0;y--) { _nop(); }; } &#xff08;1&#xff09; 首…

正点原子delay函数移植到rt thread操作系统(HAL库)

正点原子教程中涉及到的操作系统只涉及了UCOS的教程&#xff0c;其中例程的system文件夹中的delay.c函数只是适配了UCOS。 下面将delay.c函数移植到rt thread中&#xff0c;使用的bsp是rt thread stm32中的stm32f407-st-discovery开发板 已修改好的delay.c函数&#xff08;适配…

linux内核级调用时间delay函数,及常用文件头

最近做一个嵌入式内核级rookit 的编写/ 需要设计一个每3秒亮一次灯的内核级rookit 在设计rookit中使用了delay时间&#xff0c;需要包含<linux/delay.h>头文件。 #include<linux/delay.h> //linux内核级文件头,用户应用层一般调用不了# #include<unistd.h>…

快速计算delay函数中for循环延时程序占用的时间

首先根据板子上晶振知道时钟频率为12MHz(0.08us0.1us)&#xff0c;板子上长方形金属外壳上有标&#xff08;或者看原理图&#xff09; 根据ISP软件延时计算器得到循环代码 运行_nop_()需要包含库 #include <INTRINS.H> void Delay500ms() //12.000MHz {unsigned c…

c语言延时函数nop,延时函数怎么写delay

1. c语言延时函数delay,怎么算延时 下面是delay 函延迟函数里执行的都是空语句,也就是说通过循环执行空语句来达到延迟的目的.每执行一条语句,即使是空语句都要耗费电脑一些处理时间的,就是因为这个,在延迟函数里写一些无关紧要的东西,用来浪费电脑处理时间,从而达到延迟…