OpenEdv-开源电子网

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

systick为什么只初始化时钟源就可以读取重载值,重载值怎么来的?

[复制链接]

2

主题

12

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2017-10-30
在线时间
7 小时
发表于 2018-10-15 14:59:24 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 p18595923265 于 2018-10-15 15:00 编辑

static u32 fac_us=0;                                                        //us延时倍乘数
void delay_init(u8 SYSCLK)
{
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);//SysTick频率为HCLK
fac_us=SYSCLK;                                                //不论是否使用OS,fac_us都需要使用
}
void delay_us(u32 nus)
{               
        u32 ticks;
        u32 told,tnow,tcnt=0;
        u32 reload=SysTick->LOAD;                                //LOAD的值                     
        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;                        //时间超过/等于要延迟的时间,则退出.
                }  
        };
}

最佳答案

查看完整内容[请看2#楼]

这里是OS里面用的延时函数,采用的是时间摘取法来实现的。 systick的特性就是开启了以后,就会自动从初始值递减计数,计数到0,则重新加载。这是systick的特性。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-10-15 14:59:25 | 显示全部楼层
这里是OS里面用的延时函数,采用的是时间摘取法来实现的。  systick的特性就是开启了以后,就会自动从初始值递减计数,计数到0,则重新加载。这是systick的特性。
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2017-10-30
在线时间
7 小时
 楼主| 发表于 2018-10-15 15:56:05 | 显示全部楼层
程序出自STM32F429阿波罗,未漏写代码。
回复

使用道具 举报

0

主题

109

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2018-9-2
在线时间
8 小时
发表于 2018-10-16 08:16:19 | 显示全部楼层
原来是这样,谢谢楼主们的分享
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2017-10-30
在线时间
7 小时
 楼主| 发表于 2018-10-16 19:28:07 | 显示全部楼层
弄明白了,Hal库中定义了一个弱函数__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority);在时钟初始化时进行了调用,不仔细看很难找,至于回帖中的从初始值递减计数这个应该不对吧?因为重载值默认0
回复

使用道具 举报

109

主题

5562

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10541
金钱
10541
注册时间
2017-2-18
在线时间
1908 小时
发表于 2018-10-16 21:51:14 | 显示全部楼层
p18595923265 发表于 2018-10-16 19:28
弄明白了,Hal库中定义了一个弱函数__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority);在时 ...

例程里边重载值不是0了。每次计数到0后就自动从重装载值再次计数
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 23:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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