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

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);  //没有分频 168M
    fac_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

相关文章:

  • 定制Android ListView 快速滚动的滚动条-fast scroll bar thumb
  • VR混战已开始,看各大虚拟现实如何争春?
  • java9 gc log参数迁移
  • NSURL
  • MySQL数据库----流程控制
  • windowsPhone开发(什么是手机开发?)
  • 记一次内存溢出的分析经历——thrift带给我的痛orz
  • [精华][推荐]CAS SSO 单点登录框架学习 环境搭建
  • 部门机关名称/部门人员名称的获取
  • 2017,技术年度总结篇
  • C++11 中值得关注的几大变化(详解)
  • 8-angular 要点温习-1
  • 收集一些网络检测和分析工具
  • 滴滴发布智慧交通战略产品“交通大脑”
  • 如何运用互联网手机等新兴媒体开展群众工作
  • “大数据应用场景”之隔壁老王(连载四)
  • Android Volley源码解析
  • C++入门教程(10):for 语句
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • java8-模拟hadoop
  • LintCode 31. partitionArray 数组划分
  • MySQL数据库运维之数据恢复
  • mysql中InnoDB引擎中页的概念
  • nfs客户端进程变D,延伸linux的lock
  • vue 个人积累(使用工具,组件)
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 欢迎参加第二届中国游戏开发者大会
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 使用API自动生成工具优化前端工作流
  • 微信小程序开发问题汇总
  • 我的业余项目总结
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • Nginx实现动静分离
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #Linux(帮助手册)
  • #在 README.md 中生成项目目录结构
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (待修改)PyG安装步骤
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (区间dp) (经典例题) 石子合并
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (一)认识微服务
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (状压dp)uva 10817 Headmaster's Headache
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .NET设计模式(11):组合模式(Composite Pattern)