你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

SysTick时钟做延时

[复制链接]
andrewsss 提问时间:2019-1-8 10:36 /
在用SysTick时钟做延时程序时,我在F103的板子是用SysTick_Config()没问题,但是在L151的板子上发现堵这个函数这里了,但是我看了这个函数里面也没有while,怎么就阻塞了,SysTick时钟是Cortex-M3都有的吧?然后我在SysTick_Config()里面定位,发现是堵在这一步了SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |                    SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;
不懂为什么这一步不能执行,如果说没有这个寄存器的话,上面的SysTick->LOAD  = ticks - 1; 是可以执行的,问题到底出在哪里?
附上程序图:
360截图20190108100806665.jpg 360截图20190108100826473.jpg 360截图20190108102705814.jpg


收藏 评论16 发布时间:2019-1-8 10:36

举报

16个回答
五哥1 回答时间:2019-1-8 19:21:55
用HAL_Delay(0.1)试下
andrewsss 回答时间:2019-1-8 11:06:06
发现问题了,是SysTick->LOAD 的值设置的太小了,我改成64(SysTick_Config(64))就可以了,现在是2us中断一次,SysTick->LOAD还有最小值???
zjczm 回答时间:2019-1-8 12:03:26
本帖最后由 zjczm 于 2019-1-8 12:05 编辑

那就是你中断太快了。太快的话,别的事情没法干了。
微秒的延时,不如单独搞个定时器来实现吧。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

watershade 回答时间:2019-1-8 12:15:22
systick主要是用来做时间基准的,一般就是1ms延时一次。尽管可以配置。也是建议你用专门的定时器,算一下你一个任务到底要多久。感觉32MHz要定us定时,其实处理不了啥任务。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

butterflyspring 回答时间:2019-1-8 12:24:24
STM32有很多定时器,建议用外设定时器做timerx。 systic 通常做系统节拍用的,功能也比较单一,一般都不建议用户用来定时。 另外你的定时频率快,考虑用定时器的某些硬件功能。 否则中断进出消耗时间,再加上代码执行时间,根本做不了多少事情,甚至会影响其他代码执行的。 外设定时器在函数库中有很多例程,照着用也不复杂的

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

andrewsss 回答时间:2019-1-8 14:01:37
zjczm 发表于 2019-1-8 12:03
那就是你中断太快了。太快的话,别的事情没法干了。
微秒的延时,不如单独搞个定时器来实现吧。

我搞了个定时器,没法微秒定时啊,只能搞成毫秒,不然一直进定时器中断
andrewsss 回答时间:2019-1-8 14:04:09
watershade 发表于 2019-1-8 12:15
systick主要是用来做时间基准的,一般就是1ms延时一次。尽管可以配置。也是建议你用专门的定时器,算一下你 ...

我只是为了写个能进行微秒延时的函数,不关系其他的任务
andrewsss 回答时间:2019-1-8 14:05:56
butterflyspring 发表于 2019-1-8 12:24
STM32有很多定时器,建议用外设定时器做timerx。 systic 通常做系统节拍用的,功能也比较单一,一般都不建 ...

定时器能进行微秒计时吗,怎么做,我配置的只能最小是毫秒
watershade 回答时间:2019-1-22 11:09:00
五哥1 发表于 2019-1-8 19:21
用HAL_Delay(0.1)试下

你如果愿意回答请好好回答。不要通过灌水的方式来赚积分。谢谢
HAL_Delay的函数原型是:void HAL_Delay (__IO uint32_t Delay)
五哥1 回答时间:2019-1-23 01:36:07
watershade 发表于 2019-1-22 11:09
你如果愿意回答请好好回答。不要通过灌水的方式来赚积分。谢谢
HAL_Delay的函数原型是:void HAL_Delay ( ...

我尝试过用HAL_Delay(0.15)来代替正点原子程序里Delay(150us)的延时,并且成功把标准库的程序改成了HAL库的程序,你有测试过吗?你如何确定这个是灌水?别死搬教条,实践是检验真理的唯一标准。
watershade 回答时间:2019-1-25 09:51:46
本帖最后由 watershade 于 2019-1-25 10:08 编辑
五哥1 发表于 2019-1-23 01:36
我尝试过用HAL_Delay(0.15)来代替正点原子程序里Delay(150us)的延时,并且成功把标准库的程序改成了HAL库 ...

兄弟,首先我道个歉。应该和你联系一下,先讨论一下再说你是不是灌水。Whatever,咱就说说这是不是死板和教条。如果你非要用HAL_Delay,那最好的办法是你再重写这个函数,否则按照C语言语法和编译原则你输入的Doubl或float类型回被强制转换成整形。0.15会变成0.但是如果你非要争论会不会产生延时。我想会的。毕竟你执行了几句话,但是延时不可能太大的。而且也不是你想要的150us延时。(实际上这里你写的0.15默认是double类型)
否则按照函数的内容,怎么可能实现?
  1. __weak void HAL_Delay(uint32_t Delay)
  2. {
  3.   uint32_t tickstart = HAL_GetTick();
  4.   uint32_t wait = Delay;

  5.   /* Add a period to guaranty minimum wait */
  6.   if (wait < HAL_MAX_DELAY)
  7.   {
  8.     wait++;
  9.   }

  10.   while((HAL_GetTick() - tickstart) < wait)
  11.   {
  12.   }
  13. }
复制代码
你忽悠我吧。如果你能让我信服,我发个帖子。专门向你道歉


五哥1 回答时间:2019-1-25 18:17:48
watershade 发表于 2019-1-25 09:51
兄弟,首先我道个歉。应该和你联系一下,先讨论一下再说你是不是灌水。Whatever,咱就说说这是不是死板和教 ...

不知道你有没有WT588D的语音模块,给你个程序来测下。
watershade 回答时间:2019-1-26 18:23:34
五哥1 发表于 2019-1-25 18:17
不知道你有没有WT588D的语音模块,给你个程序来测下。

咱们讨论的是这个funtion,怎么扯到模块上了?
chenplay 回答时间:2019-5-3 07:26:57
使用的比较少的话,用定时中断,也可以。不然资源浪费在等待上

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版