搜索
bottom↓
回复: 18

STM32除了systick,timer 做延时以外,有没有其他办法

[复制链接]

出0入0汤圆

发表于 2023-6-5 18:34:03 | 显示全部楼层 |阅读模式
很早之前试过,一些自减操作,延时的时间很不稳定,不知道是什么原因。

注意到里面也有个__nop()的函数,不知道延时稳定不稳定。

主要打算用来给io模拟spi读写或者ssi读取使用。

出100入312汤圆

发表于 2023-6-5 19:31:47 来自手机 | 显示全部楼层
rtc,可以看看,不过不适合你的需求

出10入0汤圆

发表于 2023-6-5 20:46:04 来自手机 | 显示全部楼层
有,前几天在用freertos的时候找到的,也是us延时用的。

出0入18汤圆

发表于 2023-6-5 21:00:03 来自手机 | 显示全部楼层
systick timer应该是最好的延时方法了吧

出105入79汤圆

发表于 2023-6-5 22:59:23 | 显示全部楼层
systick, timer,是硬件级别的延时,没有比这个更加稳定更加好的了。

出0入59汤圆

发表于 2023-6-5 23:08:05 | 显示全部楼层
SPI 延时这些,用定时器延时?

出0入0汤圆

发表于 2023-6-5 23:10:14 来自手机 | 显示全部楼层
可以用dwt delay

出0入0汤圆

发表于 2023-6-5 23:47:14 | 显示全部楼层
几个时钟的延时,还是加NOP最好

出0入0汤圆

 楼主| 发表于 2023-6-6 00:33:36 | 显示全部楼层
modbus 发表于 2023-6-5 23:47
几个时钟的延时,还是加NOP最好
(引用自8楼)

大概100ns~300ns的延时。

一个时钟周期,理论上是5ns~15ns左右

出0入31汤圆

发表于 2023-6-6 11:06:39 | 显示全部楼层
使用多个nop,不要用循环,用了循环就要看汇编成了多少条指令

出0入0汤圆

发表于 2023-6-6 15:37:26 | 显示全部楼层
dwt定时器做延时
  1. /**
  2. * @brief 阻塞微妙延时
  3. */
  4. __STATIC_INLINE void delay_us(uint16_t nUs)
  5. {
  6.     __IO uint32_t dwtCnt = DWT->CYCCNT;
  7.     __IO uint32_t CntPerUs = nUs*SysClockMhz; //每1us 计数 这么多个 数

  8.     while (DWT->CYCCNT - dwtCnt < CntPerUs);
  9. }

  10. /**
  11. * @brief 阻塞毫秒延时
  12. */
  13. __STATIC_INLINE void delay_ms(uint16_t nMs)
  14. {
  15.     __IO uint32_t i;
  16.     for (i = 0; i < nMs; i++)
  17.         delay_us(1000);
  18. }
复制代码

出0入0汤圆

发表于 2023-6-6 18:09:21 | 显示全部楼层
szafa 发表于 2023-6-6 15:37
dwt定时器做延时
(引用自11楼)

这个dwt的1us和外部systick配置没关系吗?

出140入158汤圆

发表于 2023-6-6 18:35:22 | 显示全部楼层
不关中断(或更高优先级的中断),啥精确延时都白搭,哈哈

出0入0汤圆

 楼主| 发表于 2023-6-6 19:42:30 | 显示全部楼层
amigenius 发表于 2023-6-6 18:35
不关中断(或更高优先级的中断),啥精确延时都白搭,哈哈
(引用自13楼)

spi ssi 现在就是放在最高优先级的中断里面读的。

出140入158汤圆

发表于 2023-6-6 20:05:02 | 显示全部楼层
sy8501 发表于 2023-6-6 19:42
spi ssi 现在就是放在最高优先级的中断里面读的。
(引用自14楼)

最高优先级里极短时间的延时用NOP就好,除了M7时间不准外,其他都准。而如果延时时间较长,则阻塞延迟并不是好方法,应当使用状态机非阻塞延时。

出0入0汤圆

发表于 2023-6-7 11:09:50 | 显示全部楼层
风过不留痕z 发表于 2023-6-6 18:09
这个dwt的1us和外部systick配置没关系吗?
(引用自12楼)

dwt定时器和systick定时器是独立的,没有任何关联

出0入0汤圆

发表于 2023-6-7 11:21:01 | 显示全部楼层
szafa 发表于 2023-6-7 11:09
dwt定时器和systick定时器是独立的,没有任何关联
(引用自16楼)

使用前需要在外部先初始化吗

出105入79汤圆

发表于 2023-6-7 11:26:51 | 显示全部楼层
io模拟spi SSI 是很消耗CPU的,频率太高了

出0入0汤圆

发表于 2023-6-7 11:46:56 | 显示全部楼层
风过不留痕z 发表于 2023-6-7 11:21
使用前需要在外部先初始化吗
(引用自17楼)

需要初始化的。主要就是DEMCR寄存器启动TRACE功能。然后DWT的CTRL寄存器位0 置1 启动DWT定时器
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 07:50

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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