硬汉嵌入式论坛

 找回密码
 立即注册
查看: 9810|回复: 9
收起左侧

[有问必答] us延时

[复制链接]

92

主题

293

回帖

569

积分

金牌会员

积分
569
发表于 2013-5-8 08:00:53 | 显示全部楼层 |阅读模式
systick定时中断周期是1ms,并且产生了N ms的延时函数,我想问下如果设置成1us会不会有问题?比如像DS18B20,时序要求75us延时等,有没有更好的处理方法呢?
回复

使用道具 举报

759

主题

1050

回帖

3332

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3332
发表于 2013-5-8 13:07:33 | 显示全部楼层
这是F4里面的函数。你可以改下用于F1

/*
*********************************************************************************************************
*    函 数 名: bsp_DelayUS
*    功能说明: us级延迟,延迟精度为正负1ms
*    形    参:n : 延迟长度,单位1 us
*    返 回 值: 无
*********************************************************************************************************
*/
void bsp_DelayUS(uint32_t n)
{
    uint32_t ticks;
    uint32_t told,tnow,tcnt=0;
    uint32_t reload = SysTick->LOAD; /* LOAD的值 */
               
    ticks = n * 168;                  /* 需要的节拍数 */              
    tcnt = 0;
    told = SysTick->VAL;             /* 刚进入时的计数器值 */

    while(1)
    {
        tnow = SysTick->VAL;   
        if(tnow != told)
        {   
            /* 这里注意一下SYSTICK是一个递减的计数器 */   
            if(tnow < told)
            {
                tcnt += told - tnow;   
            }
            /* 重新装载递减 */
            else
            {
                tcnt += reload - tnow + told;   
            }        
            told = tnow;

            /*时间超过/等于要延迟的时间,则退出 */
            if(tcnt >= ticks)break;
        }  
    }
}
回复

使用道具 举报

92

主题

293

回帖

569

积分

金牌会员

积分
569
 楼主| 发表于 2013-5-8 17:02:21 | 显示全部楼层
请问下,这个us延时函数是不是独立的?如果同时具有Systick的1ms定时中断,就是F1例子中的Systick部分,会不会有冲突?
回复

使用道具 举报

759

主题

1050

回帖

3332

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3332
发表于 2013-5-8 18:34:55 | 显示全部楼层
不会冲突,他就是用systick的计数器。只读不改。
回复

使用道具 举报

92

主题

293

回帖

569

积分

金牌会员

积分
569
 楼主| 发表于 2013-5-9 11:36:00 | 显示全部楼层
我在F1上试了下,感觉应该就是改 ticks的值,但是始终不能得到1US的延时,原来可以用的DS18B20函数,还是不能读到温度值,请问是不是应该改ticks啊
回复

使用道具 举报

759

主题

1050

回帖

3332

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3332
发表于 2013-5-9 11:43:37 | 显示全部楼层
你就用一个for循环解决问题吧。用示波器测量下宽度。
回复

使用道具 举报

92

主题

293

回帖

569

积分

金牌会员

积分
569
 楼主| 发表于 2013-5-10 09:41:31 | 显示全部楼层
还是想用你提供的例子来用,这样就可以加入到原来SysTick里面,既有ms延时,又有us延时,还可以使用软定时器,呵呵
回复

使用道具 举报

92

主题

293

回帖

569

积分

金牌会员

积分
569
 楼主| 发表于 2013-5-10 17:40:04 | 显示全部楼层
我本来是通过检测按键状态通过串口发指令,同时采集温度值,检测按键就是采用10ms中断去检测(采用按键的例子),采集温度我用一个软定时器,时间到,执行一次。
但是如果单独做没有问题,可以读温度,或者可以发指令,但是如果同时都有了,就只能读温度,按键检测发指令就不行了,不知道问题在哪呢?会不会是因为温度传感器中使用的 us延时和软定时器中断发生冲突呢?
回复

使用道具 举报

92

主题

293

回帖

569

积分

金牌会员

积分
569
 楼主| 发表于 2013-5-13 16:41:49 | 显示全部楼层
已经搞定了,就是用bsp_DelayUS,已经可以读到温度了,看来以后us延时的函数有了[s:150]
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
发表于 2015-12-10 10:11:46 | 显示全部楼层

回 armfly 的帖子

armfly:这是F4里面的函数。你可以改下用于F1

/*
*********************************************************************************************************
*    函 数 名: bsp_DelayUS
....... (2013-05-08 13:07) 
这个延时在STM32F103跑在72MHZ时候延时都不准确, 怠慢执行需要4us 左右~要想延时精确到1us还需要改进.
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-7-5 21:36 , Processed in 0.278953 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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