OpenEdv-开源电子网

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

正点原子delay_us是不是有bug

[复制链接]

3

主题

7

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2019-4-23
在线时间
8 小时
发表于 2024-12-20 11:40:32 | 显示全部楼层 |阅读模式
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

7

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2019-4-23
在线时间
8 小时
 楼主| 发表于 2024-12-20 11:43:35 | 显示全部楼层
补充说明:100MHz的芯片,驱动中SysTick->LOAD = (uint32_t)(ticks - 1UL); 初始化时传入ticks为100000,寄存器中SysTick->LOAD值为99999。而SysTick从99999递增到0不断循环。
回复 支持 反对

使用道具 举报

70

主题

6724

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12867
金钱
12867
注册时间
2012-11-26
在线时间
3755 小时
发表于 2024-12-23 09:18:20 | 显示全部楼层
你这啥时候版本的    正点用的一般是时钟摘取法吧,不会对寄存器设置数据,只会读取数据
回复 支持 反对

使用道具 举报

3

主题

7

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2019-4-23
在线时间
8 小时
 楼主| 发表于 2024-12-23 10:38:57 | 显示全部楼层
本帖最后由 fovery 于 2024-12-25 15:18 编辑

帖子中的图片不知道为啥没有显示出来,我重新用文字说明下:void delay_us(u32 nus)
{               
        u32 ticks;
        u32 told,tnow,tcnt=0;
        u32 reload=SysTick->LOAD;                                //LOAD的值——【BUG点】这儿应该是reload=SysTick->LOAD + 1;
        ticks=nus*fac_us;                                                 //需要的节拍数
        told=SysTick->VAL;                                        //刚进入时的计数器值
        while(1)
        {
                tnow=SysTick->VAL;        
                if(tnow!=told)
                {            
                        if(tnow<told)tcnt+=told-tnow;        //这里注意一下SYSTICK是一个递减的计数器就可以了.
                        else tcnt+=reload-tnow+told;            
                        told=tnow;
                        if(tcnt>=ticks)break;                        //时间超过/等于要延迟的时间,则退出.
                }  
        };
}

因为驱动中SysTick->LOAD = (uint32_t)(ticks - 1UL); 例如100MHz主频下,初始化时传入ticks为100000,寄存器中SysTick->LOAD值为99999,SysTick从99999递增到0不断循环。
因此当定时器溢出时进行计算时间长度,应该用周期100000,而不是用LOAD值99999。
回复 支持 反对

使用道具 举报

70

主题

6724

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12867
金钱
12867
注册时间
2012-11-26
在线时间
3755 小时
发表于 2024-12-24 09:02:43 | 显示全部楼层
fovery 发表于 2024-12-23 10:38
帖子中的图片不知道为啥没有显示出来,我重新用文字说明下:void delay_us(u32 nus)
{               
        u32 ticks;

那你再练练吧   
学无止境
回复 支持 反对

使用道具 举报

3

主题

7

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2019-4-23
在线时间
8 小时
 楼主| 发表于 2024-12-25 15:16:10 | 显示全部楼层
本帖最后由 fovery 于 2024-12-26 19:25 编辑

怎么感觉你们没get到我提的bug点
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-1-19 02:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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