OpenEdv-开源电子网

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

Freertos 在通过ds18b20采集温度时,自带的延时函数出现问题导致程序卡死的问题

[复制链接]

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2021-4-7
在线时间
16 小时
楼主
发表于 2024-3-15 15:10:36 | 显示全部楼层
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2021-4-7
在线时间
16 小时
2#
发表于 2024-3-15 15:12:40 | 显示全部楼层
void delay_us_freertos(u32 nus)
{
       u32 ticks;
       u32 told,tnow,reload,tcnt=0;
       if((0x0001&(SysTick->CTRL)) ==0)    //定时器未工作
              vPortSetupTimerInterrupt();  //初始化定时器

       reload = SysTick->LOAD;                     //获取重装载寄存器值
       ticks = nus * (SystemCoreClock / 1000000);  //计数时间值
       told=SysTick->VAL;                          //获取当前数值寄存器值(开始时数值)

       while(1)
       {
              tnow=SysTick->VAL;          //获取当前数值寄存器值
              if(tnow!=told)              //当前值不等于开始值说明已在计数
              {         

                     if(tnow<told)             //当前值小于开始数值,说明未计到0
                          tcnt+=told-tnow;     //计数值=开始值-当前值

                     else                  //当前值大于开始数值,说明已计到0并重新计数
                            tcnt+=reload-tnow+told;   //计数值=重装载值-当前值+开始值  (已
                                                      //从开始值计到0)

                     told=tnow;                //更新开始值
                     if(tcnt>=ticks)break;     //时间超过/等于要延迟的时间,则退出.
              }
       }     
}

可以试试这个
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-20 14:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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