硬汉嵌入式论坛

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

[技术讨论] 请问F103使用UCOSII怎么在硬件初始化中实现us级延时

[复制链接]

3

主题

13

回帖

22

积分

新手上路

积分
22
发表于 2019-6-4 11:28:32 | 显示全部楼层 |阅读模式
请问F103使用UCOSII怎么在硬件初始化中实现us级延时,程序如下:

                GPIO_ResetBits(GPIOB,GPIO_Pin_0);
                bsp_DelayUS(520);(使用bsp_time.c中的延时函数)

使用bsp_time.c中的延时函数后,管脚一直高,注释掉就可以拉低,请问怎么解决
void bsp_DelayUS(uint32_t n)
{
    uint32_t ticks;
    uint32_t told;
    uint32_t tnow;
    uint32_t tcnt = 0;
    uint32_t reload;

        reload = SysTick->LOAD;               
    ticks = n * (SystemCoreClock / 1000000);       

    tcnt = 0;
    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;
            }
        }  
    }
}


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2019-6-4 11:33:25 | 显示全部楼层
这个延迟方案不好,要借助硬件滴答定时器,推荐这个方案,各种OS里面随意使用

适用于所有M3,M4和M7内核芯片

DWT实现一个精确微秒延迟的参考例程
http://www.armbbs.cn/forum.php?m ... 9128&fromuid=58
(出处: 安富莱电子论坛)


回复

使用道具 举报

3

主题

13

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2019-6-4 11:36:57 | 显示全部楼层
eric2013 发表于 2019-6-4 11:33
这个延迟方案不好,要借助硬件滴答定时器,推荐这个方案,各种OS里面随意使用

适用于所有M3,M4和M7内核 ...

请问是在UCOSII中开一个定时器吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2019-6-4 11:38:25 | 显示全部楼层
Jie_y2dlA 发表于 2019-6-4 11:36
请问是在UCOSII中开一个定时器吗

不是,这个是时钟周期计数器,内核自带的。
回复

使用道具 举报

3

主题

13

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2019-6-4 11:43:04 | 显示全部楼层
eric2013 发表于 2019-6-4 11:38
不是,这个是时钟周期计数器,内核自带的。

请问在UCOS中使用bsp_time.c中的函数会出现问题是吗,比如一些中断,延时
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2019-6-4 11:46:49 | 显示全部楼层
Jie_y2dlA 发表于 2019-6-4 11:43
请问在UCOS中使用bsp_time.c中的函数会出现问题是吗,比如一些中断,延时

可以用,你可以将bsp_timer.C里面有一个Systick_Config函数,注释掉这个函数,然后就是里面一个滴答定时器中断函数也注释掉,之后就是将Systick_ISR函数放在uCOS的滴答定时器钩子函数里面。

这样所有函数就都可以使用了。
回复

使用道具 举报

3

主题

13

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2019-6-4 11:50:40 | 显示全部楼层
eric2013 发表于 2019-6-4 11:46
可以用,你可以将bsp_timer.C里面有一个Systick_Config函数,注释掉这个函数,然后就是里面一个滴答定时 ...

那是注释掉之后就可以使用里面的延时函数吗,还有钩子函数麻烦您发一下。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2019-6-4 12:33:27 | 显示全部楼层
Jie_y2dlA 发表于 2019-6-4 11:50
那是注释掉之后就可以使用里面的延时函数吗,还有钩子函数麻烦您发一下。。。

检索xxxhook
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-17 07:19 , Processed in 0.221807 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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