STM32除了systick,timer 做延时以外,有没有其他办法
很早之前试过,一些自减操作,延时的时间很不稳定,不知道是什么原因。注意到里面也有个__nop()的函数,不知道延时稳定不稳定。
主要打算用来给io模拟spi读写或者ssi读取使用。
rtc,可以看看,不过不适合你的需求 有,前几天在用freertos的时候找到的,也是us延时用的。 systick timer应该是最好的延时方法了吧 systick, timer,是硬件级别的延时,没有比这个更加稳定更加好的了。 SPI 延时这些,用定时器延时? 可以用dwt delay 几个时钟的延时,还是加NOP最好 modbus 发表于 2023-6-5 23:47
几个时钟的延时,还是加NOP最好
(引用自8楼)
大概100ns~300ns的延时。
一个时钟周期,理论上是5ns~15ns左右
使用多个nop,不要用循环,用了循环就要看汇编成了多少条指令 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);
} szafa 发表于 2023-6-6 15:37
dwt定时器做延时
(引用自11楼)
这个dwt的1us和外部systick配置没关系吗? 不关中断(或更高优先级的中断),啥精确延时都白搭,哈哈 amigenius 发表于 2023-6-6 18:35
不关中断(或更高优先级的中断),啥精确延时都白搭,哈哈
(引用自13楼)
spi ssi 现在就是放在最高优先级的中断里面读的。
sy8501 发表于 2023-6-6 19:42
spi ssi 现在就是放在最高优先级的中断里面读的。
(引用自14楼)
最高优先级里极短时间的延时用NOP就好,除了M7时间不准外,其他都准。而如果延时时间较长,则阻塞延迟并不是好方法,应当使用状态机非阻塞延时。 风过不留痕z 发表于 2023-6-6 18:09
这个dwt的1us和外部systick配置没关系吗?
(引用自12楼)
dwt定时器和systick定时器是独立的,没有任何关联 szafa 发表于 2023-6-7 11:09
dwt定时器和systick定时器是独立的,没有任何关联
(引用自16楼)
使用前需要在外部先初始化吗 io模拟spi SSI 是很消耗CPU的,频率太高了
风过不留痕z 发表于 2023-6-7 11:21
使用前需要在外部先初始化吗
(引用自17楼)
需要初始化的。主要就是DEMCR寄存器启动TRACE功能。然后DWT的CTRL寄存器位0 置1 启动DWT定时器
页:
[1]