OpenEdv-开源电子网

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

STM下纯软件实现精确定时

[复制链接]

5

主题

14

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
370
金钱
370
注册时间
2012-9-7
在线时间
3 小时
发表于 2012-9-8 00:43:22 | 显示全部楼层 |阅读模式

不用定时器得到精确定时

先上测试代码(普通版)

#include "stm32f10x.h"
#include "core_cm3.h"

__asm int Dellayus(u32 usec)
{
     ALIGN
     USH.W {r1}  //2时钟周期
     MOV r1,#18  //1时钟周期
     MUL r0,r1  //1时钟周期
     SUB r0,#3  //1时钟周期
loop
     SUBS r0,#1   //1时钟周期
     BNE loop   //如果跳转则为3个周期,不跳则只有1个周期
     OP {r1}   //2时钟周期
     BX lr    //3个时钟周期
                  //总共所用周期为(usec*4)-4,此处减4主要用于抵消调用此函数的消耗时钟周期(传参1时钟,BLX跳转3时钟)
}

int main(void)
{
     while(1)
     {
          //运行到此处时32.93us,第1379时钟周期
          Dellayus(100);
          //运行到此处时132.93us,第8579时钟周期,运行上条指令共花8579-1379=7200时钟周期
          //因系统时钟为72MHz,所以每72时钟周期所花时间为1微妙,上条指令所花时间
          //等于7200 ÷ 72 = 100微妙,延时完全准确
          Dellayus(100);
          //运行到此处时232.93us,第15779时钟周期,同样验证上面的结论
     }
}


调试:

第一个100微妙延时函数运行前


第一个100微妙延时函数运行后



所花系统时钟周期8579-1379=7200个系统时钟,时间精确为0.00013293-0.0003293=0.0001秒,
也就是100微秒。延时函数通过软件模拟以及硬件调试同样精确,如果延时参数大于255微秒,调用
时会多耗两个时钟周期(0.028微秒)用于从代码段加载常数。可以修改代码修正误差。最大定时不能
超过(232-1) ÷  18 ≈ 238.6秒。

以上方法可以节约系统定时器资源,避免和其他代码争用定时器。通常用于微秒級延时。




版主的建议非常好,是该增加时钟参数以适应不同的时钟频率,改了一下代码,目前软件仿真测试没问题,等晚上再用JLink
测试一下(理论上应该没问题,已经考虑了闪存预取优化)。

#include "stm32f10x.h"
#include "core_cm3.h"

__asm void Dellayus(u32 usec,u8 freq)  //freq参数为系统时钟频率(SYSCLK),单位MHz,且必须能被4整除,且    等于16,常用的
{           //有24,36,48,56,72,如果一定要使用8MHz则必须满足延时时间大于2微秒,但freq一定不要
           //小于8MHz,否则函数将出现混乱。条件为 ((usec >= 1) && (freq >=16)) ||  ((usec >= 2) && (freq >= 8))
 ALIGN
 LSR r1,r1,#2  //1时钟周期,除以单次循环所用的时钟数(4个)即得到延时1微妙所需的循环数
 MUL r0,r1  //1时钟周期
 SUB r0,#3  //1时钟周期
 NOP    //用于匹配延时周期以及使loop循环处指令在8字节边界对齐,提高精度(因为指令预取单元一次预取8字节指令)
 NOP    //所以循环时都不用再从闪存内取指令,避免闪存延时影响延时精度
loop
 SUBS r0,#1   //1时钟周期
 BNE loop   //延时循环,每次4个时钟周期,最后一次只需两个时钟周期(如果跳转则为3个周期,不跳则只有1个周期)
 NOP
 BX lr    //3个时钟周期
      //本函数内总共所用周期为usec*(freq/4)-2 +9,调用此函数的消耗5个时钟周期(传参2时钟,BLX跳转3时钟)
}      //函数最低耗时11个时钟周期,上面usec*(freq/4) - 2为循环代码的耗时(此处减2是因为最后一次循环BNE没有跳转,只消耗1个时钟比跳转的3个时钟节约2个所以减去2才是最终循环的耗时),9就是其它代码的耗时

//比如频率为8MHz时延时2微秒所需延时周期数为2*8=16个时钟,将值带入上面的公式即为 2 * (8 / 4) - 2 + 9 =11            即为函数体耗时,再加上5个周期的调用开销最终消耗16个时钟周期,同时这也是最低延时周期数。

int main(void)
{
 while(1)
 {
  //运行到此处时32.93us,第1379时钟周期
  Dellayus(100,72);
  //运行到此处时132.93us,第8579时钟周期,运行上条指令共花8579-1379=7200时钟周期
  //因系统时钟为72MHz,所以每72时钟周期所花时间为1微妙,上条指令所花时间
  //等于7200 ÷ 72 = 100微妙,延时完全准确
  Dellayus(100,72);
  //运行到此处时232.93us,第15779时钟周期,同样验证上面的结论
 }
}




示例代码见附件

软件延时测试.rar

21.09 KB, 下载次数: 1358

软件延时测试增强版.rar

21.61 KB, 下载次数: 1744

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-9-8 01:18:41 | 显示全部楼层
顶,花了不少功夫!
不过在不同时钟条件下,应该就又要修改代码了吧?
比如36M?8M?
所以 建议加入一个时钟参数,这样比较通用一点.

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2012-8-31
在线时间
0 小时
发表于 2012-9-8 01:28:24 | 显示全部楼层
学习了,不错。楼主图标左边可以看时间,平时都没有注意,谢啦
回复 支持 反对

使用道具 举报

23

主题

143

帖子

1

精华

高级会员

Rank: 4

积分
933
金钱
933
注册时间
2012-4-23
在线时间
68 小时
发表于 2012-9-8 02:41:38 | 显示全部楼层
不错,添加进来,多个延时程序
回复 支持 反对

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2012-9-8 09:56:14 | 显示全部楼层
谢谢楼主!,我软件测试延时的时候并没有出现当参数大于255微妙的时候会多消耗2个时钟周期的情况,一样很准啊。还有我用JTAG仿真SW模式,单步,那个SEC没有变化,不知道是怎么回事。还有一个问题:为什么返回值要用int 不太懂汇编
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

5

主题

14

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
370
金钱
370
注册时间
2012-9-7
在线时间
3 小时
 楼主| 发表于 2012-9-8 10:39:23 | 显示全部楼层
回复【5楼】xiaoyan:
--------------------------回复【5楼】xiaoyan:
---------------------------------
需要将JTAG设为JTAG模式才能读出SEC值,另外返回值用int 当时主要是想以后增加函数功能
回复 支持 反对

使用道具 举报

5

主题

14

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
370
金钱
370
注册时间
2012-9-7
在线时间
3 小时
 楼主| 发表于 2012-9-8 11:37:02 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
这个建议非常好,马上上个增强版
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-9-8 13:56:04 | 显示全部楼层
所以是酷贴。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2010-12-14
在线时间
65 小时
发表于 2012-9-8 18:24:44 | 显示全部楼层
呵呵,还不如用C的

/*--------------------------------------------------------------------------------

* 延时函数
* input: t 延时 t*10us
* 例:延时100us
*    Delay_us(10)
*--------------------------------------------------------------------------------*/
void Delay_us(unsigned int t)
{
        int i;

         for(i=0; i<144*t; i++){
                    ;
          }
}

比上面汇编的要准: 同时1000个循环,
                          汇编用时为:       100.844ms
                          C及时:              100.139ms 
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-9-8 23:50:11 | 显示全部楼层
回复【9楼】aa2206:
---------------------------------
搞个-O2优化试试,还准不准.
另外换个时钟频率试试,还准不准?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2010-12-14
在线时间
65 小时
发表于 2012-9-9 01:24:06 | 显示全部楼层
//加个编译项就行了. 
/*-------------------------------------------------------------------------------- 
*  
* 延时函数 
* input: t 延时 t*10us 
* 例:延时100us 
*    Delay_us(10) 
*--------------------------------------------------------------------------------*/ 
#define OSC     (8)                                 //定义为8M  
#define OSC_D   ((OSC*144)/8) 
#pragma O3 
void Delay_us(unsigned int t) 
        
        int i; 

         for(i=0; i<OSC_D*t; i++){ 
                    ; 
          } 
}

//测试
//运行时间为100.014ms
/*--------------------------------------------------------------------------------
* for(i=0; i<1000; i++){
* Delay_us(10);
* }
*--------------------------------------------------------------------------------*/


呵呵,纯为游戏之作.在这种CPU,延时最好是用原子的方法了.

 

回复 支持 反对

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2012-9-11
在线时间
6 小时
发表于 2012-9-11 23:00:31 | 显示全部楼层
谢谢 楼主~学习了!!
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2012-12-6
在线时间
3 小时
发表于 2012-12-6 10:09:42 | 显示全部楼层
用原子的战舰开发板测试,用楼主这种方法,得到的延时总理理论时间的1.5倍,比如要延迟1秒,实际总是1.5秒。
怀疑CPU运行在48M,但是我设置的的确是72M,是不是哪里设置有问题?
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1863
金钱
1863
注册时间
2011-3-29
在线时间
139 小时
发表于 2012-12-6 19:42:24 | 显示全部楼层
要完全精确的话还得提前关掉中断哦……


不过一般也不需要这么精确的延时,献上我的,不占用定时器资源哦:

#define RT_TICK_PER_SECOND 100

void hw_tsc_init() // TSC-timestamp counter
{
unsigned int cnts;

cnts = (unsigned int)9000000 / RT_TICK_PER_SECOND;

SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟,也即HCLK/8
SysTick->LOAD=cnts-1;
SysTick->VAL = 0; // write to clean
SysTick->CTRL=0x01 ;          //开始倒数   不产生中断
}

void hw_tick_start()
{
unsigned int cnts;

cnts = (unsigned int)9000000 / RT_TICK_PER_SECOND;

SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟,也即HCLK/8
SysTick->LOAD=cnts-1;
SysTick->CTRL=0x01 ;          //开始倒数   不产生中断

SysTick->CTRL = 0x03; // 启动systick并产生中断
}


void hw_delay_us(unsigned int us)
{
unsigned int start ,target,cur;

while(us > 500)    // 防止us超过systick周期。(假设systick周期超过500us)
{
hw_delay_us(500);
us -= 500;
}

start = SysTick->VAL;
target = (start-us*9);

if(start<target) // 溢出,调整target的值
{
target += (9000000 / RT_TICK_PER_SECOND);
do
{
cur = SysTick->VAL;
}while(cur<=start || cur>target);  // target不能等于start,否则死循环。也即us不能等于systick周期
}
else   // target <= start
{
do
{
cur = SysTick->VAL;
}while(target<cur&&cur><=start);   // 假设target为一个很小的值,则cur有可能在循环周期内溢出而大于target,故须加上cur<=start的条件
}
}

void hw_delay_ms(unsigned int ms)
{
while(ms--)
{
hw_delay_us(500);
hw_delay_us(500);
}
}
业余程序玩家。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2012-12-6
在线时间
3 小时
发表于 2012-12-7 09:25:01 | 显示全部楼层
这种纯软件实现当然不可坑百分之百精准,但是在我的试验板上偏差50%有点不正常。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2012-12-6
在线时间
3 小时
发表于 2012-12-7 17:13:04 | 显示全部楼层
原子兄,帮忙看看啊,直接用你光盘中的例程试的,时钟那块应该没问题吧
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-12-7 21:18:01 | 显示全部楼层
我不用软件延时的...
我一直用systick延时。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-9-8
在线时间
2 小时
发表于 2013-9-26 17:51:21 | 显示全部楼层
回复【楼主位】cqzww:
---------------------------------
终于找到该贴了   GO.OD
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2013-9-27 09:22:18 | 显示全部楼层
楼主给力,不过不推荐用楼主这种笨办法,楼主大可以移植ucos,移植成功后,你想定多久有多久,要多精确有多精确。
同时,我觉得用定时器实现精确延时比这个方法靠谱得多。
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

5

主题

14

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
370
金钱
370
注册时间
2012-9-7
在线时间
3 小时
 楼主| 发表于 2013-9-27 11:00:21 | 显示全部楼层
回复【19楼】Tardis:
---------------------------------
ucos的定时是以系统时基为单位的,比如OS_CFG_TICK_RATE_HZ设为100时就只能精确到10ms,也就是说高于10ms并且步进为10ms(50ms,500ms能较精确,但55ms就不精确了)可以比较精确定时,那我说延时10us如何用ucos的定时器定时呢?
回复 支持 反对

使用道具 举报

46

主题

1579

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1970
金钱
1970
注册时间
2011-7-17
在线时间
4 小时
发表于 2013-9-27 11:27:43 | 显示全部楼层
回复【20楼】cqzww:
---------------------------------
你可以增大ucos的时钟节拍数,然后用OSTimeTick()来实现定时
Time?And?Relative?Dimension?In?Space.
回复 支持 反对

使用道具 举报

3

主题

222

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
355
金钱
355
注册时间
2012-8-13
在线时间
32 小时
发表于 2013-9-27 12:43:06 | 显示全部楼层
STM32的定时器多的是,基本都用不完吧
个人小店,弄了些大人玩具,希望各位老小玩童们喜欢。 http://autocute.taobao.com/
回复 支持 反对

使用道具 举报

9

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2013-9-24
在线时间
0 小时
发表于 2013-9-28 15:07:45 | 显示全部楼层
请教一下IAR中怎么写楼主这个汇编函数呢。。?
人需要沐浴阳光,也必将经历风雨
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2012-11-19
在线时间
4 小时
发表于 2013-9-29 16:16:56 | 显示全部楼层
本人经历:软件再好,晶振不准也是白搭.
回复 支持 反对

使用道具 举报

5

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2013-8-16
在线时间
2 小时
发表于 2013-10-1 21:04:52 | 显示全部楼层
回复【24楼】yao_2001:
---------------------------------
说到点子上了
心若在 梦就在
回复 支持 反对

使用道具 举报

8

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-8-5
在线时间
4 小时
发表于 2014-11-6 12:22:44 | 显示全部楼层
还是建议用定时器延时,毕竟stm32资源很多的
回复 支持 反对

使用道具 举报

66

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
943
金钱
943
注册时间
2013-5-17
在线时间
192 小时
发表于 2014-11-12 14:37:44 | 显示全部楼层
谢谢楼主
不过,我测试了下,可能有点BUG,或者是我没理解对,我调用Dellayus(u32 usec,u8 freq) 函数,使用8m晶振,倍频到72m时,参数传1,72时并不是1US,传 1,48时才是1US ,是有什么不对的地方么?
回复 支持 反对

使用道具 举报

头像被屏蔽

65

主题

277

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2013-8-11
在线时间
29 小时
发表于 2014-11-13 09:20:44 | 显示全部楼层
mark , 谢谢
回复 支持 反对

使用道具 举报

80

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
748
金钱
748
注册时间
2014-9-30
在线时间
128 小时
发表于 2014-11-19 16:31:54 | 显示全部楼层
回复【20楼】cqzww:
---------------------------------
说得 很 有道理。。操作系统的 定时 ,是给任务 驱动用的,

不可能做得太小。。。
回复 支持 反对

使用道具 举报

2

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2014-7-1
在线时间
11 小时
发表于 2015-2-27 16:19:54 | 显示全部楼层
换了一个型号的mcu,stm32L152VBT6,定时不正确了,是不是因为不同MCU的原因?我不懂32的汇编
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2015-2-27 16:35:32 | 显示全部楼层
http://www.openedv.com/posts/list/18279.htm
试试这个
回复 支持 反对

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
发表于 2016-1-14 12:33:15 | 显示全部楼层
楼主的汇编用的不错     我有个问题想问下    你这个汇编语言每个指令消耗的周期数在哪看到的   我怎么没找到相应的资料    用STC   51的时候是有介绍每个指令的周期 数         
回复 支持 反对

使用道具 举报

1

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2013-10-8
在线时间
24 小时
发表于 2016-1-14 20:35:08 | 显示全部楼层
jiaozhu 发表于 2016-1-14 12:33
楼主的汇编用的不错     我有个问题想问下    你这个汇编语言每个指令消耗的周期数在哪看到的   我怎么没找 ...

我也想问这个问题,好像可以看keil仿真时左边的states数,不知道对不对。
主要是同一指令不通用法周期也不一样,求教育~~
回复 支持 反对

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
发表于 2016-1-14 20:55:07 | 显示全部楼层
yao_2001 发表于 2013-9-29 16:16
本人经历:软件再好,晶振不准也是白搭.

总结的好啊
回复 支持 反对

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
发表于 2016-1-14 21:03:54 | 显示全部楼层
楼主的这个程序我用板子测了一下   不知道怎么回事  差距较大   100us的延迟  实际在150us左右     我用原子哥的延迟程序   基本都是相差在1.几us的差距    1us 和100ms的时候都是这个差距   
回复 支持 反对

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
发表于 2016-1-14 21:06:36 | 显示全部楼层
yutianxiang618 发表于 2016-1-14 20:35
我也想问这个问题,好像可以看keil仿真时左边的states数,不知道对不对。
主要是同一指令不通用法周期也 ...

这个states应该不对吧    我在仿真的时候看  sec的尾数的数字跟states的相同  
回复 支持 反对

使用道具 举报

1

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2013-10-8
在线时间
24 小时
发表于 2016-1-15 19:03:42 | 显示全部楼层
jiaozhu 发表于 2016-1-14 21:06
这个states应该不对吧    我在仿真的时候看  sec的尾数的数字跟states的相同

哦哦 ,求知道的教育教育啊
回复 支持 反对

使用道具 举报

20

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2012-12-22
在线时间
24 小时
发表于 2016-3-4 10:43:19 | 显示全部楼层
本帖最后由 whjambo 于 2016-3-4 10:45 编辑

我在IAR里面仿真发现 BNE 和 BEQ 执行跳转的时间        CM3、4 、7 是4个周期               
CM0是1个周期
似乎并不是楼主测得的 3个周期


回复 支持 反对

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2016-11-21 13:30:43 | 显示全部楼层
不用这种"死等"延时函数的飘过.
回复 支持 反对

使用道具 举报

74

主题

334

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-5-28
在线时间
144 小时
发表于 2017-1-10 11:22:33 | 显示全部楼层
延时mark
回复 支持 反对

使用道具 举报

23

主题

323

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-11-8
在线时间
233 小时
发表于 2017-1-10 13:21:59 | 显示全部楼层
当初也想到用软件周期定时了,但也是想到为止,佩服楼主,值得学习~
亦余心之所善,
虽九死其犹未悔。
回复 支持 反对

使用道具 举报

0

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
379
金钱
379
注册时间
2016-6-2
在线时间
59 小时
发表于 2019-12-23 15:02:38 | 显示全部楼层
好贴!顶起,想到用nop但是还是不能确定需要多少个nop,就找到楼主这篇文章了!
回复 支持 反对

使用道具 举报

2

主题

64

帖子

0

精华

高级会员

Rank: 4

积分
946
金钱
946
注册时间
2014-11-2
在线时间
367 小时
发表于 2019-12-23 15:48:32 来自手机 | 显示全部楼层
把时间和精力花在这儿不值得,现在的单片机定时器多到用不完,怎么也能腾一个出来,即使以后改系统时钟不不影响
回复 支持 反对

使用道具 举报

2

主题

64

帖子

0

精华

高级会员

Rank: 4

积分
946
金钱
946
注册时间
2014-11-2
在线时间
367 小时
发表于 2019-12-23 15:52:14 来自手机 | 显示全部楼层
这种延时考虑到中断了吗?如果延时时间长一点是不是要关中断?如果是的话,真是生不如死
回复 支持 反对

使用道具 举报

0

主题

81

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2014-9-18
在线时间
21 小时
发表于 2020-5-9 17:17:41 | 显示全部楼层
学习了,不错。佩服楼主
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 04:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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