sy8501 发表于 2023-6-5 18:34:03

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

很早之前试过,一些自减操作,延时的时间很不稳定,不知道是什么原因。

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

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

akey3000 发表于 2023-6-5 19:31:47

rtc,可以看看,不过不适合你的需求

mainbp 发表于 2023-6-5 20:46:04

有,前几天在用freertos的时候找到的,也是us延时用的。

tang_qianfeng 发表于 2023-6-5 21:00:03

systick timer应该是最好的延时方法了吧

qwe2231695 发表于 2023-6-5 22:59:23

systick, timer,是硬件级别的延时,没有比这个更加稳定更加好的了。

polarbear 发表于 2023-6-5 23:08:05

SPI 延时这些,用定时器延时?

jenkins 发表于 2023-6-5 23:10:14

可以用dwt delay

modbus 发表于 2023-6-5 23:47:14

几个时钟的延时,还是加NOP最好

sy8501 发表于 2023-6-6 00:33:36

modbus 发表于 2023-6-5 23:47
几个时钟的延时,还是加NOP最好
(引用自8楼)

大概100ns~300ns的延时。

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

zchong 发表于 2023-6-6 11:06:39

使用多个nop,不要用循环,用了循环就要看汇编成了多少条指令

szafa 发表于 2023-6-6 15:37:26

dwt定时器做延时
/**
* @brief 阻塞微妙延时
*/
__STATIC_INLINE void delay_us(uint16_t nUs)
{
    __IO uint32_t dwtCnt = DWT->CYCCNT;
    __IO uint32_t CntPerUs = nUs*SysClockMhz; //每1us 计数 这么多个 数

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

/**
* @brief 阻塞毫秒延时
*/
__STATIC_INLINE void delay_ms(uint16_t nMs)
{
    __IO uint32_t i;
    for (i = 0; i < nMs; i++)
      delay_us(1000);
}

风过不留痕z 发表于 2023-6-6 18:09:21

szafa 发表于 2023-6-6 15:37
dwt定时器做延时
(引用自11楼)

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

amigenius 发表于 2023-6-6 18:35:22

不关中断(或更高优先级的中断),啥精确延时都白搭,哈哈

sy8501 发表于 2023-6-6 19:42:30

amigenius 发表于 2023-6-6 18:35
不关中断(或更高优先级的中断),啥精确延时都白搭,哈哈
(引用自13楼)

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

amigenius 发表于 2023-6-6 20:05:02

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

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

szafa 发表于 2023-6-7 11:09:50

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

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

风过不留痕z 发表于 2023-6-7 11:21:01

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

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

qwe2231695 发表于 2023-6-7 11:26:51

io模拟spi SSI 是很消耗CPU的,频率太高了

szafa 发表于 2023-6-7 11:46:56

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

需要初始化的。主要就是DEMCR寄存器启动TRACE功能。然后DWT的CTRL寄存器位0 置1 启动DWT定时器
页: [1]
查看完整版本: STM32除了systick,timer 做延时以外,有没有其他办法