精华内容
下载资源
问答
  • 计数器的更新计数器uwTick是在每次Systick中断中加一更新,此处配置Systick中断为每1ms中断一次。uwTick为uint32_t类型,那么uwTick的最长计时为...函数的实现void HAL_Delay(__IO uint32_t Delay) { uint32_t ticksta

    计数器的更新

    计数器uwTick是在每次Systick中断中加一更新,此处配置Systick中断为每1ms中断一次。uwTickuint32_t类型,那么uwTick的最长计时为0xFFFFFFFF毫秒(约为49.7天),也就是说 uwTick 会在系统持续运行49天后溢出清零。

    函数的实现

    void HAL_Delay(__IO uint32_t Delay)
    {
      uint32_t tickstart = HAL_GetTick();
      while((HAL_GetTick() - tickstart) < Delay)
      {
      }
    }

    函数中计时的实现是通过循环读取uwTick 变量,比较差值来实现延迟,那么当计数器溢出时,此函数是否继续有效呢?

    无符号整数的特性

    我们知道:1 - (-1) = 2
    将其转换为32位补码形式为:0x00000001 - 0xFFFFFFFF = 0x00000002
    HAL_GetTick()0xFFFFFFFF时,正好将tickstart赋值。而当计数器溢出重新开始比较的时候,可以发现,上面的比较方式任然成立
    此处需要注意HAL_GetTick()返回的无符号类型要与当前CPU的位数一致。
    uint16_t a = 0xffff,在32位系统中参与运算,赋值到32位的寄存器变量中变为0x0000FFFF,运算的结果显然不正确。

    linux 的解决方法

    在linux中,jiffies溢出是通过time_after和time_before宏来解决

    #define time_after(a,b)        \
        (typecheck(unsigned long, a) && \
         typecheck(unsigned long, b) && \
         ((long)(b) - (long)(a) < 0))
    #define time_before(a,b)    time_after(b,a)
    
    #define time_after_eq(a,b)    \
        (typecheck(unsigned long, a) && \
         typecheck(unsigned long, b) && \
         ((long)(a) - (long)(b) >= 0))
    #define time_before_eq(a,b)    time_after_eq(b,a)
    
    #define time_in_range(a,b,c) \
        (time_after_eq(a,b) && \
         time_before_eq(a,c))
    
    /* Same as above, but does so with platform independent 64bit types.
     * These must be used when utilizing jiffies_64 (i.e. return value of
     * get_jiffies_64() */
    #define time_after64(a,b)    \
        (typecheck(__u64, a) &&    \
         typecheck(__u64, b) && \
         ((__s64)(b) - (__s64)(a) < 0))
    #define time_before64(a,b)    time_after64(b,a)
    
    #define time_after_eq64(a,b)    \
        (typecheck(__u64, a) && \
         typecheck(__u64, b) && \
         ((__s64)(a) - (__s64)(b) >= 0))
    #define time_before_eq64(a,b)    time_after_eq64(b,a)

    其中需要保证ab均为无符号整数

    展开全文
  • 最开始学习单片机的时候,无论是...void Delay(__IO u32 nCount) { for(; nCount != 0; nCount--); } 首先根据C语言的规范可以知道这是一个没有返回值的带形式参数的函数. C语言中的函数使用规范如下: return_t

    最开始学习单片机的时候,无论是51还是STM32等,都会在流水灯等示例中见到延时函数,刚开始我就弄不明白,我今天认真的剖析一下.

    首先是函数体

    void Delay(__IO u32 nCount)
    { 
    for(; nCount != 0; nCount--); 
     } 

    首先根据C语言的规范可以知道这是一个没有返回值的带形式参数的函数.

    C语言中的函数使用规范如下:

    return_type function_name( parameter list )
    {
       body of the function
    }
    
    
    所以可以知道第一个是:函数返回的数据类型

    第二个是:函数名

    第三个是:参数

    第四个是:函数主体

    所以再来看这个延时函数就比较容易理解了:

    void Delay(__IO u32 nCount)
    { 
    for(; nCount != 0; nCount--); 
     } 

    这个延时函数没有返回值,函数名称是Delay,同时函数的参数部分中的_IO是类型修饰符;u32是数据类型,同等于uint_32_t同等于unsigned int型

    函数的主体是for循环递减,大致的意思是32位的非负int型数据nCount一直递减,递减到0,就产生了一个不太精确的延时函数.

    其中_IO u32可以看作一个数据类型;具体可以在相关MCU头文件,例如"stm32f10x.h"中查看定义.大致等同32位无符号int类型

    使用的时候若

    void Delay(5000)
    则就是5000自减到0为止




    
    

    展开全文
  • void Delay(__IO uint32_t nCount) { for(; nCount != 0; nCount--); } 众所周知,无论是STM32还是89C51单片机都是使用C语言进行编程的,而C语言语句的规则 函数返回的数据类型+函数名+参数+函数主体 所以这几行...
    void Delay(__IO uint32_t nCount)	 
    {
    	for(; nCount != 0; nCount--);
    }
    

    众所周知,无论是STM32还是89C51单片机都是使用C语言进行编程的,而C语言语句的规则
    函数返回的数据类型+函数名+参数+函数主体

    所以这几行代码也就不难理解了。

    该函数类型是void型,函数名称是Delay,_IO是类型修饰符,指的是单片机的静态IO口;
    uint_32_t是指32位的无符号整形变量;

    由for循环构成了函数的主体,意思是32位的非负int型数据nCount一直递减到0,就产生了一个不是那么准确的延时函数.

    如果是呼吸灯的话这个函数就可以实现呼吸灯颜色的循环。

    如果想使用比较准确的函数直接delay就可以了,比如:

     void Delay(1000)
    
    展开全文
  • mini 2440 test 的Delay

    千次阅读 2009-09-28 14:15:00
    1 延迟程序Delay void Delay(int time) { U32 val = (PCLK>>3)/1000-1; rTCFG0 &= ~(0xff rTCFG0 |= 3 rTCFG1 &= ~(0xf rTCFG1 |= 0 rTCNTB3 = val; rTCMPB3 = val>>1; //
    1 延迟程序Delay
    void Delay(int time)
    {
          U32 val = (PCLK>>3)/1000-1;
          rTCFG0 &= ~(0xff<<8);
          rTCFG0 |= 3<<8;            //prescaler = 3+1
          rTCFG1 &= ~(0xf<<12);
          rTCFG1 |= 0<<12;           //mux = 1/2

          rTCNTB3 = val;
          rTCMPB3 = val>>1;        // 50%
          rTCON &= ~(0xf<<16);
          rTCON |= 0xb<<16;        //interval, inv-off, update TCNTB3&TCMPB3, start timer 3
          rTCON &= ~(2<<16);           //clear manual update bit
          while(time--) {
               while(rTCNTO3>=val>>1);
               while(rTCNTO3<val>>1);
          };
    }
    1)          计数器的输入时钟(CCLK)频率:PCLK/(预分频+1)/分割值
    预分频值和分割值分别由TCFG0,TCFG1来确定。
    rTCFG0 &= ~(0xff<<8);
    rTCFG0 |= 3<<8;            //prescaler = 3+1
    rTCFG1 &= ~(0xf<<12);
    rTCFG1 |= 0<<12;           //mux = 1/2
    预分频为3,分割值为2,又已知PCLK=50Mhz
    因此可以计算出计数器输入时钟频率6.25Mhz。
    2)初始值的设定了是由TCMPB3和TCNTB3来完成了
    TCMPB3一定要小于TCNTB3。
    TCMPB3在定时的过程中不变,然后TCNTB3开始减计数,直到与TCMPB3相等时触发中断,通过设定就可以重新转载TCNTB3。

          U32 val = (PCLK>>3)/1000-1;
          rTCNTB3 = val;
          rTCMPB3 = val>>1;        // 50%
    我们可以比较一下rTCNTB3与计数器的输入时钟,可以发现rTCNTB3的频率是输入时钟的1000分之一,(因为包括0)。因此我们可以这样等价的认为rTCNTB3 = 1000CCLK,      rTCMPB3=500CCLK。
    然后我们看上面的定时的时序,rTCNTB3开始减计数,直到减到500与rTCMPB3相等,触发中断,然后rTCNTB3再减一以后继续装载。
    2)          rTCON定时控制寄存器
    rTCON[16,17,18,19]控制Timer3
    rTCON &= ~(0xf<<16);
          rTCON |= 0xb<<16;        //interval, inv-off, update TCNTB3&TCMPB3, start timer 3
          rTCON &= ~(2<<16);           //clear manual update bit


    3)          实现延迟
    由于Delay程序只是软件定时,因此设计了一个while循环来完成定时的功能。具体实现如下:
    while(time--) {
    while(rTCNTO3>=val>>1);
    while(rTCNTO3<val>>1);
    };
    最外层的WHILE只是DELAY的次数,然后看里面的两个WHILE,TCNTO3是个BUFFER,用来读TCNTB3,其实也就等同于TCNTB3,while(rTCNTO3>=val>>1);就是等到rTCNTO3<val时,执行下一个WHILE,
    此外前面程序设定rTCNTB3 = val;
    并且rTCMPB3 = val>>1;
    while(rTCNTO3>=val>>1)也就等同于
    while(rTCNTO3>=rTCMPB3 );
    所以,rTCNTB3开始减计数,当等于以后,再减1则进入下一个语句的while(rTCNTO3<val>>1);显然此时要自动转载TCNTO3为VAL下一个WHILE 为假,退出while。
    然后开始下一个time--
    4)实现的延迟时间的计算
    通过以上的分析,可以得到延迟时间的频率:CCLK/2
    时间是0.32ms
    展开全文
  • ** delay.h和delay.c程序,记得分别复制,保存成delay.h和delay.c文件...void delay_tus(unsigned int tus); void delay_tms(unsigned int tms); #endif delay.c #include "delay.h" //必须是11.0592Mhz晶振频率,记
  • delay.c

    2017-02-15 17:17:57
    void delay_us(unsigned char t) { while(--t); } void delay_ms(unsigned char t) { while(t--) { delay_us(200); delay_us(245); } } void delay_s(unsigned char t) { unsigned char i; f
  • stm32 delay文件总结

    千次阅读 2019-03-30 01:03:16
    stm32 delay文件总结 delay.h #ifndef __DELAY_H #define __DELAY_H ...void delay_init(void); void delay_ms(u16 nms); void delay_us(u32 nus); #endif delay.h声明了三个延时函数 delay.c #inclu...
  • C# Unblocked Delay

    2020-12-24 15:39:15
    private void UnblockedDelay(int delay_sec) { while(delay_sec-->0) { System.Threading.Thread.Sleep(1000); Application.DoEvents(); } }
  • __attribute__((always_inline))代表啥意思,查找所以头文件都没找到关于 _attribute__的定义
  • HAL_Delay

    2019-08-28 14:38:12
    __IO uint32_t uwTick; #define HAL_MAX_DELAY 0xFFFFFFFFU uint32_t uwTickFreq = HAL_TICK_FREQ_DEFAULT; /* 1KHz */ /*1U*/ ...__weak void HAL_Delay(uint32_t Delay) { uint32_t tickstart = HAL_GetT...
  • SDL_Delay函数

    千次阅读 2016-12-04 17:51:49
    用此函数来暂停指定的时间,单位为ms。void SDL_Delay(Uint32 ms)参考文章:http://blog.csdn.net/vagrxie/article/details/5735979http://www.cppblog.com/lf426/archive/2008/04/28/48325.html蔡军生C++ 培训
  • Timer类的成员方法void schedule(TimerTask task, long delay, long period)中的参数period是指相邻两次执行之间时间间隔,那么它是指前一次执行结束到下一次执行开始之间的时间间隔吗?还是前一次执行开始到下一次...
  • 知识点:这个方法是单线程的,也就是说只有当前调用此方法的...- (void)mainMethod { [self performSelector:@selector(delayMethod) withObject:nil afterDelay:1]; NSLog(@"调用方法==开始"); sle...
  • Delay not working

    2020-11-21 15:56:34
    ve got a little issue with the delay method : <p><strong>The code</strong></p> <p>Here is the code, in a jUnit test: <pre><code>java RESTMockServer.whenRequested(pathContains(BernardAPI.LOGOUT)) ....
  • "delay.h

    千次阅读 2017-03-01 15:15:26
    #include"delay.h" ...void delay_us(unsigned char t) //2t+7  {  while(t--);  }  void delay_ms(unsigned char t)  {  while(t--)  {  delay_us(200);  delay_us(245);  }  }
  • String comdata=""; void setup() { Serial.begin(9600); // 设置串口波特率为9600 while (!Serial);... delay(10); while(Serial.available()>0)//如果串口有bai数据进du入的话 { comdata +=
  • xc Delay代码

    2016-07-21 10:30:37
    void DelayMs(unsigned ms) { unsigned time; timer t; t :> time; for(int i = 0;i { time += 100000; //timer 计数频率为100MHZ t when timeafter(time) :> void; } }
  • 计数器与延时delay

    2019-10-09 09:00:48
    delay.c /* * delay.c * * Created on: Dec 5, 2019 * Author: admin */ #include "delay.h" #include "main.h" #include <string.h>...void delay_us(unsigned int nus) { unsigned i...
  • 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...
  • gpio&delay message problem

    2020-12-03 02:20:20
    void delay100ns(arg_int) { __delay_cycles(1.045); } void delay10µ(arg_int) { __delay_cycles(10.45); } void delay1ms(arg_int) { __delay_cycles(1045); } uint8_t u8x8_gpio_and_delay_template(u8x8_t *...
  • STM32通用文件(adc-delay)

    2017-02-21 20:55:49
    delay.c#include "delay.h" #include "sys.h" static u8 fac_us=0;//usÑÓʱ±¶³ËÊý static u16 fac_ms=0;...void delay_init() { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //Ñ¡Ô
  • 延时函数delay_us

    2021-04-20 13:21:31
    void delay_us(uint32_t udelay) 定义:微秒延时函数 参数; //udelay--输入--微秒 */ void delay_us(uint32_t udelay) { uint32_t startval,tickn,delays,wait; startval = SysTick->VAL; tickn = HAL_...
  • 动画特效Delay脚本

    2019-05-20 17:07:24
    using UnityEngine; using System.Collections;...public class Delay : MonoBehaviour { public float delayTime = 1.0f; private bool isDelayCallBack = false; private void OnEnable() { if(!isDelayC...
  • delay的几个函数说明

    千次阅读 2018-03-01 12:30:00
    delay下面的主要函数是delay_init,delay_us和delay_ms。...void delay_init(u8 SYSCLK) { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); fac_us=SYSCLK/8; //每个us需要运行21个时间片 ...
  • javascript:void links

    2020-12-09 01:07:15
    <div><p>The addon is not reconizing javascript:void links. So it will not open them individually <p>And there is not time delay. Is that possible? ...
  • <div><p>As an example, I converted the Cylon demo to support the 2.1 delay capability and it no longer works properly. If I use the Arduino delay, then it works properly. <p>Note: The addLED setup ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,772
精华内容 3,108
关键字:

delayvoid