OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2697|回复: 9

程序延时的问题

[复制链接]

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1846
金钱
1846
注册时间
2014-6-27
在线时间
983 小时
发表于 2016-6-30 15:27:29 | 显示全部楼层 |阅读模式
一个程序需要延时,我往往做2个延时就够用了,一个用节拍定时器做的延时,毫秒级别的,一个US级别的,偶尔用下。本人觉得一个工程有这2个延时基本够用了。

/****************************************************
函数功能:滴滴定时器初始化
输入参数:SYSCLK : 系统时钟
输出参数:无
备    注:无
*****************************************************/
void Ticker_Init(u8 SYSCLK,u16 tickerTime)
{
         u32 x;
//   SysTick->CTRL &=~BIT(2);//选择外部时钟
//         SysTick->CTRL &=~BIT(1);//关闭定时器减到0后的中断请求
//         fac_us = SYSCLK/8;//计算好SysTick加载值
//         fac_ms = (u16)fac_us*1000;         
         SysTick->CTRL &=~BIT(2);//选择外部时钟
         SysTick->CTRL |=BIT(1);//关闭定时器减到0后的中断请求
         x = SYSCLK/8;//计算好SysTick加载值
         x = 1000*tickerTime-1;
         SysTick->LOAD=x;
         SysTick->VAL = 1;//随便写个值,清除加载寄存器的值
         SysTick->CTRL |= BIT(0);//SysTick使能
}
/*
滴答定时器中断,上面滴答定时器初始化节拍时间,假设5MS
*/
void  SysTick_Handler(void)
{
    SYS_Ticker=1;  //节拍标志,MS级别,程序基本延时由此完成 ,或者下面的累加变量完成等                              
    bus_count++;
}
/*

us级别延时,不影响滴滴定时器的运行,虽然可以定时很长,建议多用在延时小于一个节拍时间的场合,用在不经常运行的地方。
滴答定时器运行就行了,不会造成死循环。
*/

void delay_us(u32 x)//可以延时大于节拍时间的us时间
{
        u32 new_load,old_load,cmp_load=0,tickers;
        tickers=x;//根据滴滴定时器修改,比如滴滴定时器跑8M,则  tickers=x*8;
        old_load=SysTick->VAL;
        while(1)
        {
            new_load=SysTick->VAL;
            if(new_load!=old_load)
            {        
                if(new_load<old_load)
                    cmp_load+=old_load-new_load;
                else
                    cmp_load+=SysTick->LOAD+old_load-new_load;        
                old_load=new_load;
                if(cmp_load>=tickers)break;
            }  
        }
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-6-30
在线时间
1 小时
发表于 2016-6-30 16:30:24 | 显示全部楼层
回复 支持 反对

使用道具 举报

3

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2019-5-8
在线时间
27 小时
发表于 2019-5-23 09:58:15 | 显示全部楼层
兄弟 如果我cpu主频是16M  这个延时函数还能这么准吗?
回复 支持 反对

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1846
金钱
1846
注册时间
2014-6-27
在线时间
983 小时
 楼主| 发表于 2019-5-27 10:38:53 | 显示全部楼层
hope0116 发表于 2019-5-23 09:58
兄弟 如果我cpu主频是16M  这个延时函数还能这么准吗?

你测试一下就知道了,都是准的。
回复 支持 反对

使用道具 举报

0

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2019-4-28
在线时间
5 小时
发表于 2019-5-27 14:05:04 | 显示全部楼层
谢谢分享!
回复 支持 反对

使用道具 举报

3

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2019-5-8
在线时间
27 小时
发表于 2019-5-27 15:07:03 | 显示全部楼层
TinyBoy 发表于 2019-5-27 10:38
你测试一下就知道了,都是准的。

好的谢谢
回复 支持 反对

使用道具 举报

3

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2019-5-8
在线时间
27 小时
发表于 2019-6-4 16:06:15 | 显示全部楼层
你的这个函数能在ucos上跑吗?
回复 支持 反对

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1846
金钱
1846
注册时间
2014-6-27
在线时间
983 小时
 楼主| 发表于 2019-6-4 16:30:25 | 显示全部楼层
hope0116 发表于 2019-6-4 16:06
你的这个函数能在ucos上跑吗?

当然可以了,ucos里面一样用的,你可以用在一些需要US延时的地方,比如IIC操作等,大的时间还是用UCOS自身的节拍累加完成。
回复 支持 反对

使用道具 举报

3

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2019-5-8
在线时间
27 小时
发表于 2019-6-4 16:38:00 | 显示全部楼层
TinyBoy 发表于 2019-6-4 16:30
当然可以了,ucos里面一样用的,你可以用在一些需要US延时的地方,比如IIC操作等,大的时间还是用UCOS自 ...

能把工程发我一份吗?里面有的东西我不知道是怎么定义的
回复 支持 反对

使用道具 举报

3

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2019-5-8
在线时间
27 小时
发表于 2019-6-4 16:39:55 | 显示全部楼层
hope0116 发表于 2019-6-4 16:38
能把工程发我一份吗?里面有的东西我不知道是怎么定义的

就是用在ucos里  IIC通信里有us级的延时 搞的我头大
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-9 04:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表