STM32delay函数应用与说明

news/2025/3/15 16:25:55/

STM32delay函数应用应用与说明

  • Cortex M4内核编程手册有关时钟系统的内容
  • 定时函数的实现
    • delay_init 函数
    • delay_us 函数

对与32中的delay函数有很多中形式可以使用,这里提供一些自己使用遇到过的函数类型。

Cortex M4内核编程手册有关时钟系统的内容

p230
SysTick timer (STK)
The processor has a 24-bit system timer, SysTick, that counts down from the reload value to zero, reloads (wraps to) the value in the STK_LOAD register on the next clock edge, then counts down on subsequent clocks.
When the processor is halted for debugging the counter does not decrement.

处理器有一个24位的系统计时器(SysTick),这个定时器从装载值进行递减,知道0为止,在下一个时钟边缘对STK_LOAD中的值进行重载入,然后在后续的时钟中递减计数。
在对处理器进行暂停调试的时候,计数器不会减小。

在arm体系中与时钟有关的寄存器是:STK_CTRL STK_LOAD STK_VAL STK_CALIB是这四个寄存器

在明确了以上内容之后,利用STM32的内部SysTick来实现延时,这样既不占用中断,也不会占用系统定时器。

定时函数的实现

delay_init 函数

该函数用来初始化2个重要参数:fac_us以及fac_ms;tongshi ba SysTick的时钟源选择位外部时钟,在不加入系统的时候,延时初始化函数的代码如下:

 // 初始化延时函数//SYSTICK的时钟固定为HCLK时钟的1/8
static  uint8_t  fac_us=0;
void delay_init(uint8_t SYSCLK)
{HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);//SysTick 频率为 HCLKfac_us=SYSCLK; //不论是否使用 OS,fac_us 都需要使用 
}

delay_us 函数

这个函数是用来指定us的,其参数nus为延时的微妙数。

//延时 nus
//nus:要延时的 us 数. 
//nus:0~190887435(最大值即 2^32/fac_us@fac_us=22.5)
void delay_us(uint32_t nus)
{ uint32_t ticks;uint32_t told,tnow,tcnt=0;uint32_t reload=SysTick->LOAD;  //LOAD 的值ticks=nus*fac_us; //需要的节拍数delay_osschedlock();  //阻止 OS 调度,防止打断 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;  //时间超过/等于要延迟的时间,则退出.}};
}

进行测试:是正确的!


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

相关文章

android wait函数使用,Android Sleep/Wait/Delay函数

首先,我是一个初学Android的世界,所以请道歉,如果这是愚蠢的问题.. 我正在尝试做以下事情: 启用移动数据 等待10秒 一个。检查Mobile是否有IP地址(数据连接成功) 湾如果未连接,则禁用数据 C。转到第1步 这些步骤1到3在For循环中执行用户给定的重试次数。 现在我的问题是:…

delay函数

在VC中使用带上头文件#include <windows.h>注意:在VC中Sleep中的第一个英文字符为大写的"S"在标准C中是sleep, 不要大写.. 下面使用大写的来说明,, 具体用什么看你用什么编译器. 简单的说VC用Sleep, 别的一律使用sleep.Sleep函数的一般形式:Sleep(unisgned lon…

c语言delay函数的作用,delay函数 delay() c语言延迟函数

51单片机C语言中delay函数是怎么定义和使用的?很多时候我们看别人的故事哀其不幸恨其不争等到发现在自己身上好像突然就明白了别人的道理。 void Delay (unsigned int a){ unsigned int i; while( a 。= 0){ for(定义一个延时xms毫秒的延时函数 void delay(unsigned int xms) …

c语言delay函数的作用,delay用法(delay函数使用)

是delay to do 还是delay doing 还是delay do?还是什么啊~~ 问下 delayvt.延期, 延缓; 推迟We decided to delay our holiday until next month.我们决定将休假延至下个月。所以应该是delay doing 函数名: delay 功 能: 将程序的执行暂停一段时间(毫秒) 用 法: void dela…

python中delay__python delay函数

Python 中的sleep函数 本人是Python菜鸟一枚,今天用python时,发现如果按照下图所示来写程序在我的Python环境(Win7+Python2.7.9)下测试没问题,是等待5秒后再输出 m。 你的问题可能是被标准输出流的缓冲区缓冲了,给 stdout 加一个 flush 就可以了: from time import sleepf…

delay函数c语言例子,模拟delay函数

使用标准函数 clock 模拟非标准函数 delay 。只是出于娱乐目的&#xff0c;没什么移植性&#xff0c;因为 clock() 不一定每次都能获取程序当前运行了多久&#xff0c;如果不能获取&#xff0c;则返回 -1 。 代码如下&#xff1a; // C 版本 // 文件名&#xff1a;my_delay.cpp…

【51单片机】定时器产生指定延迟的delay函数

可以自己输入的延迟时间,灵活性高下面代码定时1ms&#xff0c;用户可以自行更改定时器初值 void delay(unsigned int n)//STC89C52,晶振:11.0592MHZ { int i;for(i0;i<n;i){TMOD & 0xF0; TMOD | 0x01; //定时器0,工作模式1TH0 0xFC; //至初值TL0 0x66; //定时1…

Arduino延迟函数delay(),以及为什么不应该使用它

delay()函数 delay()工作方式非常简单。它接受单个整数&#xff08;或数字&#xff09;参数。此数字表示时间&#xff08;以毫秒为单位&#xff09;。当程序遇到这个函数时&#xff0c;应该等到下一行代码。然而&#xff0c;问题是&#xff0c;delay()函数并不是让程序等待的好…