当前位置: 首页 > java >正文

delay的几个函数说明

delay下面的主要函数是delay_init,delay_us和delay_ms。

非OS的时候,可以很简单

void delay_init(u8 SYSCLK)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);fac_us=SYSCLK/8;        //每个us需要运行21个时间片
fac_ms=(u16)fac_us*1000;//

}        
比如系统的频率是168M,SYSCLK传入的是168,那么systick就是168M/8=21M,那么每us就需要systick运行168/8个时间片。
因为不需要兼容OS,所以可以肆意的对systick计数器进行清零。OS的时候,systick计数到会触发中断,所以不能随便对SysTick->LOAD和SysTick->VAL进行操作。
void delay_us(u32 nus)
{        u32 temp;             SysTick->LOAD=nus*fac_us; // 那么多延时需要的时间片            SysTick->VAL=0x00;        //计数器清零SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16)));// 查询是不是计数到了SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //SysTick->VAL =0X00;       //
}

通过查询是systick计数器的寄存器状态,确认计数是否到了。

有OS的时候,要兼容OS和原本的delay_us函数。

void delay_init(u8 SYSCLK)
{u32 reload;SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);  //没有分频 168Mfac_us=SYSCLK;                            // 168个时间片reload=SYSCLK;                            //reload*=1000000/configTICK_RATE_HZ;        //168*1000000/1000//fac_ms=1000/configTICK_RATE_HZ;            //SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;// 开启中断SysTick->LOAD=reload;                     //赋重载值SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启systick
}            

和之间的非OS相比,reload在初始化被定义,并复制给LOAD。因为非OS的时候,systick只在延时的时候被使用,用来计算时间片。而OS运行的时候,需要一个心

跳,要一直运行的,所以就用systick,systick的频率是168M,reload=168M/1000,所以systick每次都数1ms。每次计数到,都会触发SysTick_Handler中断函数,OS

会在里面做任务切换等等事情。

然后delay_us这个函数,也和之前不一样了。之前可以去修改systick的值来实现固定时间的延时。现在只能通过设置一个tcnt的变量,通过读取systick->VAL的值,来

确定多少us的延时。

void delay_us(u32 nus)
{        u32 ticks;u32 told,tnow,tcnt=0;u32 reload=SysTick->LOAD;                //ticks=nus*fac_us;                         //told=SysTick->VAL;                        //¸while(1){tnow=SysTick->VAL;    if(tnow!=told){        if(tnow<told)tcnt+=told-tnow;    //else tcnt+=reload-tnow+told;        told=tnow;if(tcnt>=ticks)break;            //
        }  };                                            
}  

delay_ms都是类似的,基于delay_us,就不做介绍了。

 

转载于:https://www.cnblogs.com/nasduc/p/8487864.html

http://www.xdnf.cn/news/11098.html

相关文章:

  • Linux Shell Shock漏洞利用和实战
  • php语法之计算1~100偶数之和
  • c语言-exit函数
  • 【C语言】Windows下的多线程编程-关键段(临界区)
  • LARGE_INTEGER 转换 __int64
  • 进化计算(八)——MOEA/D算法详解Ⅱ
  • 12036 抢票助手开源,星标 12.7K !
  • B2B2C电商app系统开发(java开源,快速搭建)
  • 【一文读懂】什么是磁带存储?为何焕发第二春?
  • 【Laravel系列4.3】模型Eloquent ORM的使用(一)
  • 5000字详解性能需求
  • 滚动条样式修改
  • 内网端口映射工具有哪些?
  • 蝶阀的作用介绍
  • 史上最全网络安全站点集合
  • Java面试宝典
  • 分享126个图片JS特效,总有一款适合您
  • Nios II嵌入式软处理器提升系统性能方式详解
  • Happytime RTSP可用于流式传输各种设备和文
  • 俄罗斯 搜索引擎 邮箱创建
  • 使用 iMacros 来自动化日常的工作
  • LAMP架构
  • erp是什么意思?ERP系统是什么
  • 使用Plist编辑器——简单入门指南
  • 前HP大中华区总裁孙振耀退休感言
  • Java小白(学习Java详细讲解)从入门到精通
  • 一文带你了解红墨水实验!
  • 华为交换机配置入门指南:从零开始,轻松掌握基础配置
  • 一文读懂背照式CMOS图像传感器
  • 报表学习总结(一)——ASP.NET 水晶报表(Crystal Reports)的简单使用