STM32delay函数应用与说明[通俗易懂]

STM32delay函数应用与说明[通俗易懂]STM32delay函数应用应用与说明CortexM4内核编程手册有关时钟系统的内容定时函数的实现delay_init函数delay_us函数对与32中的delay函数有很多中形式可以使用,这里提供一些自己使用遇到过的函数类型。CortexM4内核编程手册有关时钟系统的内容p230SysTicktimer(STK)Theprocessorhasa24-bitsystemtimer,SysTick,thatcountsdownfromthereloadvalu

大家好,又见面了,我是你们的朋友全栈君。

对与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 频率为 HCLK
    fac_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;  //时间超过/等于要延迟的时间,则退出.
          }
     };
}

进行测试:是正确的!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/137245.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • markersize是什么意思_Marker

    markersize是什么意思_Marker为什么80%的码农都做不了架构师?>>>…

    2022年10月22日
  • iptable 详解_iptable命令详解1

    iptable 详解_iptable命令详解1-p-protocal[!]protocol:协议-s-source[!]address[/mask]:源地址-d–destination[!]address[/mask]:目的地址-j–jumptarget:-i–in-interface[!][name]:入口-o–out-interface[!][name]:出口-f,–fragment:分片指定-pt…

  • 3DES 加解密

    3DES 加解密

  • linux安装gcc命令步骤(centos安装gcc命令)[通俗易懂]

    linux安装gcc命令步骤(centos安装gcc命令)[通俗易懂]linux安装gcc命令步骤(centos安装gcc命令)>一、前言本文介绍在CentOS7.8系统下使用YUM升级GCC版本的相关操作步骤。CentOS7默认安装的gcc版本是4.8版本,gcc4.8最主要的一个特性就是全面支持C++11,如果不清楚什么用的也没关系,简单说一些C++11标准的程序都需要gcc4.8以上版本的gcc编译器编译。很多工具依赖的是更高版本的gcc,比如编译MySQL8.0(8.0.16以上版本是C++14标准,需gcc5.3以上版本)、Redis6.

    2022年10月10日
  • 在触屏设备上面利用html5裁剪图片[通俗易懂]

    在触屏设备上面利用html5裁剪图片

  • 哈夫曼树

    哈夫曼树一、哈夫曼树的概念和定义 什么是哈夫曼树?让我们先举一个例子。判定树:       在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设计直接影响着程序的执行效率。例如,编制一个程序,将百分制转换成五个等级输出。大家可能认为这个程序很简单,并且很快就可以用下列形式编写出来:  if(score<60) cout<<"Bad"<

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号