OpenEdv-开源电子网

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

关于原子delay_ms()的疑问

[复制链接]

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4518
金钱
4518
注册时间
2018-5-11
在线时间
945 小时
发表于 2018-5-12 21:46:04 | 显示全部楼层 |阅读模式
本帖最后由 warship 于 2018-5-15 10:46 编辑

原子的例程中,  delay_ms()利用了系统的Systick来进行延时,
那么问题是: 系统的Systick中断服务还可以用吗?  
比如: 利用滴达中断服务, 周期性置位标志, 这可以与原子例程中的 delay_ms()或 delay_us()共存吗?
希望有老司机指点一下,谢谢.
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4518
金钱
4518
注册时间
2018-5-11
在线时间
945 小时
 楼主| 发表于 2018-5-12 22:30:33 | 显示全部楼层
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-5-12 23:01:45 | 显示全部楼层
本帖最后由 275891381 于 2018-5-12 23:02 编辑

可以的,开启Systick中断就可以了,例如中断1ms,就可以得到1ms的时钟,你可以参考freertos的delay,里面又有延时,有有中断
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4518
金钱
4518
注册时间
2018-5-11
在线时间
945 小时
 楼主| 发表于 2018-5-13 08:06:40 | 显示全部楼层
275891381 发表于 2018-5-12 23:01
可以的,开启Systick中断就可以了,例如中断1ms,就可以得到1ms的时钟,你可以参考freertos的delay,里面又 ...

现有的例程延时完成后关闭了计数器,
当然开启定时器并开启中断也是可以进中断的,
但是因为delay_ms()或者delay_us()改变了计数器参数,
想要用Systick必须重新设置,
不知我的理解是否正确?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4518
金钱
4518
注册时间
2018-5-11
在线时间
945 小时
 楼主| 发表于 2018-5-13 08:11:26 | 显示全部楼层
原子的delay_ms()例程如下:
void delay_ms(u16 nms)
{                                     
        u32 temp;                  
        SysTick->LOAD=(u32)nms*fac_ms;                                //时间加载(SysTick->LOAD为24bit)
        SysTick->VAL =0x00;                                                        //清空计数器
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;        //开始倒数  
        do
        {
                temp=SysTick->CTRL;
        }while((temp&0x01)&&!(temp&(1<<16)));                //等待时间到达   
        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;        //关闭计数器
        SysTick->VAL =0X00;                                               //清空计数器                      
}
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-5-13 08:48:39 | 显示全部楼层
warship 发表于 2018-5-13 08:11
原子的delay_ms()例程如下:
void delay_ms(u16 nms)
{                                     

static   u8  fac_us=0;                                                             //us延时倍乘数       
//SYSTICK的时钟固定为HCLK时钟的1/8
//中断时间time  =  ( SysTick->LOAD + 1 ) / f                        f = AHB或AHB/8            (9000-1+1)/9M=1ms
void delay_init(void)
{
        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);        //选择外部时钟  HCLK/8  9M 计数器减1为1/9000000秒
        fac_us=SystemCoreClock/8000000;                                      //9  
        SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;           //开启SYSTICK中断
        SysTick->LOAD=fac_us*1000-1;                                                     //每1/1000s中断一次       
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;           //开启SYSTICK          
}       

//nus:0~2^32=4294967296(最大值即2^32/fac_us@fac_us=1)                                                                            
void delay_us(u32 nus)
{               
        u32 ticks;
        u32 told,tnow,tcnt=0;
        u32 reload=SysTick->LOAD;                                        //LOAD的值                     
        ticks=nus*fac_us;                                                           //需要的节拍数                           
        tcnt=0;
        told=SysTick->VAL;                                                //刚进入时的计数器值
        while(1)
        {
                tnow=SysTick->VAL;       
                if(tnow!=told)
                {            
                        if(tnow<told)tcnt+=told-tnow;                //这里注意一下SYSTICK是一个递减的计数器就可以了.
                        else tcnt+=reload-tnow+told;            
                        told=tnow;
                        if(tcnt>=ticks)break;                                //时间超过/等于要延迟的时间,则退出.
                }  
        }       
}
//nms:0---2^32/1000=4294967.296
void delay_ms(u32 nms)
{                                     
         delay_us((u32)(nms*1000));                                        //普通方式延时  
}

void SysTick_Handler(void)
{       
     xitong_haomiao++;//毫秒时钟
}

回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4518
金钱
4518
注册时间
2018-5-11
在线时间
945 小时
 楼主| 发表于 2018-5-13 10:31:37 | 显示全部楼层
275891381 发表于 2018-5-13 08:48
static   u8  fac_us=0;                                                             //us延时倍乘数       
//SYSTICK的时钟固定为HCLK时钟的1/8
//中断时间t ...

感谢提供, 这个延时函数不错,
本函数仅反复读取SYSTICK的当前值,直到给定的延时时间到达,
不影响SYSTICK的自动重装,也不影响其中断
即使在延时过程中发生中断,
只要中断服务耗时不超出1ms,
都不会影响本函数的延时精度
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-5-13 15:15:40 | 显示全部楼层
warship 发表于 2018-5-13 10:31
感谢提供, 这个延时函数不错,
本函数仅反复读取SYSTICK的当前值,直到给定的延时时间到达,
不影响SYSTI ...

是的,主要是还能用1ms的中断,周期性执行的代码可以用下面的方式,减少cpu占用
if(xitong_haomiao-haomiao_old>=500)//delay_ms(500);
{
        haomiao_old=xitong_haomiao;
        //代码                                               
}
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2018-5-8
在线时间
7 小时
发表于 2018-5-13 16:12:45 | 显示全部楼层
一个延时的程序代码就那么多真的怀疑自己能不能学得会
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-5-13 17:18:50 | 显示全部楼层
coreda84 发表于 2018-5-13 16:12
一个延时的程序代码就那么多真的怀疑自己能不能学得会

谁让你写了呢,抄过去不就可以了,单片机就是个工具,难道买个汽车开还要研究车怎么造呀,会用这个延时就可以了呀,写代码不都是东抄抄西抄抄,写多了,自然就会优化代码了
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4518
金钱
4518
注册时间
2018-5-11
在线时间
945 小时
 楼主| 发表于 2018-5-13 19:00:57 | 显示全部楼层
275891381 发表于 2018-5-13 15:15
是的,主要是还能用1ms的中断,周期性执行的代码可以用下面的方式,减少cpu占用
if(xitong_haomiao-haom ...

刚才试了一下, 把从前的一些例程的delay.c 更成这个新的,
常会发生一些莫名的问题, 系统变得不太稳定.
我所知的可能情况有:
在其它中断服务程序中用延时可能会有问题, 原因是SYSTICK的中断优先级低?
上述例程没有设定SYSTICK的优先级, 默认是多少?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-5-13 19:30:43 | 显示全部楼层
本帖最后由 275891381 于 2018-5-13 19:33 编辑
warship 发表于 2018-5-13 19:00
刚才试了一下, 把从前的一些例程的delay.c 更成这个新的,
常会发生一些莫名的问题, 系统变得不太稳定.
...

中断服务函数能不用延时就不要用,这是一般规则,还有你说的不稳定不应该吧,一直用也没发现不稳定,
默认在core_cm3.h 里面设置了 NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); 是多少级要看怎么分组,反正是1111
你可以用这个函数在延时初始化里面改  NVIC_SetPriority (SysTick_IRQn, x);
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4518
金钱
4518
注册时间
2018-5-11
在线时间
945 小时
 楼主| 发表于 2018-5-13 20:08:59 | 显示全部楼层
275891381 发表于 2018-5-13 19:30
中断服务函数能不用延时就不要用,这是一般规则,还有你说的不稳定不应该吧,一直用也没发现不稳定,
默 ...

谢谢回复, 一般我也会注意这个问题的.
但有时候, 比如按键外部中断, 通常会延时10ms消除抖动的,
这往往就会出问题. 我尝试用这里用软延时试试吧.
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-5-13 20:10:57 | 显示全部楼层
warship 发表于 2018-5-13 20:08
谢谢回复, 一般我也会注意这个问题的.
但有时候, 比如按键外部中断, 通常会延时10ms消除抖动的,
这往往 ...

你要是按键消抖可以给你发个结合滴答定时器的消抖,不用延时,只要扫描就可以了
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-5-13 20:16:04 | 显示全部楼层
本帖最后由 275891381 于 2018-5-13 20:19 编辑
warship 发表于 2018-5-13 20:08
谢谢回复, 一般我也会注意这个问题的.
但有时候, 比如按键外部中断, 通常会延时10ms消除抖动的,
这往往 ...

把原子的KEY_Scan改造下:
u8 KEY_Scan(u8 mode)
{         
        static u8 flag=0;
        static s8 key_up=1;//按键按松开标志
        
        if(Key==KEY_NO_PRES)
        {
                  if(mode)key_up=1;  //支持连按
                        if(flag==0)
                        {
                                        if(key_up&&(KEY_UP==1||KEY_LEFT==0||KEY_DOWN==0||KEY_RIGHT==0))
                                                        flag=1;
                                        else if(KEY_UP==0&&KEY_LEFT==1&&KEY_DOWN==1&&KEY_RIGHT==1)
                                                 key_up=1;
                        }
                        else if(flag==1)
                        {
                                key_up=0;
                                flag=0;
                                if     (KEY_UP==1)    return KEY_UP_PRES;
                                else if(KEY_LEFT==0)  return KEY_LEFT_PRES;
                                else if(KEY_DOWN==0)  return KEY_DOWN_PRES;
                                else if(KEY_RIGHT==0) return KEY_RIGHT_PRES;
                        }        
                        return KEY_NO_PRES;// 无按键按下
  }        
return Key;
}
//滴答定时器中断里面这样写,就不用延时消抖了
void SysTick_Handler(void)
{        
     xitong_haomiao++;
    if(xitong_haomiao%20==0)//20ms扫描一下按键
          Key=KEY_Scan(0);
}
//main里面查询就可以了
while(1)
{
        if(Key!=KEY_NO_PRES)
        {
                if(Key==KEY_UP_PRES)
                {
                        LED1=~LED1;                                                
                }
                if(Key==KEY_DOWN_PRES)
                {
                        LED2=~LED2;                                                
                }
                //其他按键
                Key=KEY_NO_PRES;
        }
        //其他代码
         
}


回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4518
金钱
4518
注册时间
2018-5-11
在线时间
945 小时
 楼主| 发表于 2018-5-13 20:56:31 | 显示全部楼层
275891381 发表于 2018-5-13 20:16
把原子的KEY_Scan改造下:
u8 KEY_Scan(u8 mode)
{         

谢谢您的回复,真的是太感谢了.
初步看了一下, 这样好像改动有点儿大了.
既要动键扫, 还要在SYSTICK中断中扫键, KEY又成为全局变量.
回头好好研究一下.
我看正点原子的例程里, 好像没有一处用到SYSTICK中断,
甚至连通常有的SYSTICK中断试验都没有
不知是不是种种原因, 刻意回避了这个问题.
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2018-5-8
在线时间
7 小时
发表于 2018-5-14 08:42:18 | 显示全部楼层
275891381 发表于 2018-5-13 17:18
谁让你写了呢,抄过去不就可以了,单片机就是个工具,难道买个汽车开还要研究车怎么造呀,会用这个延时就 ...

谢谢你的支持,我觉得我还是有信心学好这门课程。
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2018-4-4
在线时间
21 小时
发表于 2018-5-14 10:41:22 | 显示全部楼层
你使用的是系统滴答来进行延迟处理的,是使用滴答的次数来进行计数产生中断,最后产生延迟的。在系统滴答里有LOAD和VAL两个寄存器用于中断和计数的控制,VAL进行加或者减计数,达到LOAD值,中断,产生一秒延迟。建议要学习好一些基本的寄存器知识,为将来的STM32的主流固件库HAL库打下基础。加油。
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-5-14 13:40:13 | 显示全部楼层
coreda84 发表于 2018-5-14 08:42
谢谢你的支持,我觉得我还是有信心学好这门课程。

肯定可以的,就是快慢的问题
回复 支持 反对

使用道具 举报

6

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-4-18
在线时间
10 小时
发表于 2018-5-14 13:47:14 | 显示全部楼层
帮楼主顶一下
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2018-5-8
在线时间
7 小时
发表于 2018-5-14 17:37:40 | 显示全部楼层
275891381 发表于 2018-5-14 13:40
肯定可以的,就是快慢的问题

我想咨询你一下,向我的这种初学者是先使用库函数调用,还是使用寄存器直接用,来得好点呢?
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-5-14 18:02:03 | 显示全部楼层
coreda84 发表于 2018-5-14 17:37
我想咨询你一下,向我的这种初学者是先使用库函数调用,还是使用寄存器直接用,来得好点呢?

没法回答,我没用过寄存器
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4518
金钱
4518
注册时间
2018-5-11
在线时间
945 小时
 楼主| 发表于 2018-5-14 21:12:18 | 显示全部楼层
coreda84 发表于 2018-5-14 17:37
我想咨询你一下,向我的这种初学者是先使用库函数调用,还是使用寄存器直接用,来得好点呢?

初学者肯定是库函数来得快了,
寄存器太多, 新学者会被搞得眼花缭乱的,
学习库函数时通过查库函数的原型
慢慢就知道寄存器是怎么回事了
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4518
金钱
4518
注册时间
2018-5-11
在线时间
945 小时
 楼主| 发表于 2018-5-14 21:26:10 | 显示全部楼层
275891381 发表于 2018-5-14 18:02
没法回答,我没用过寄存器

刚才想了一下, 使用您提供的延时函数.
觉得在中断函数中用延时应该也不会有太大的问题的.
我说的是通常的外部按键中断, 一般是这样的:
void EXTI3_IRQHandler(void)
{

        delay_ms(10); //延时消抖

        if(GET_K1())
        {
                Key1Interrupted=1;
        }
        EXTI_ClearITPendingBit(EXTI_Line3);

}

执行这10ms的延时时,SYSTICK会要求中断,
但因为系统将其优先级设为最低, 所以应该会被挂起不执行,直到上述按键中断执行完毕.
因为SYSTICK溢出后会自动重装载, 而延时函数的TICKS累计不会有问题,所以延时能够正常执行完成.
只不过,在这期间, 有多次溢出要求SYSTICK中断被挂起, 会对SYSTICK中断服务中的相关周期性处置会有迟滞, 如果可以容忍这点, 就不会有问题.
不知我的理解对否?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-5-14 22:08:40 | 显示全部楼层
warship 发表于 2018-5-14 21:26
刚才想了一下, 使用您提供的延时函数.
觉得在中断函数中用延时应该也不会有太大的问题的.
我说的是通常 ...

是这样子的,不过中断里面延时10ms,啥时候都是不能容忍的,尽量避免吧
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4518
金钱
4518
注册时间
2018-5-11
在线时间
945 小时
 楼主| 发表于 2018-5-14 22:23:06 | 显示全部楼层
275891381 发表于 2018-5-14 22:08
是这样子的,不过中断里面延时10ms,啥时候都是不能容忍的,尽量避免吧

好的, 谢谢.
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2018-5-8
在线时间
7 小时
发表于 2018-5-15 08:29:04 | 显示全部楼层
warship 发表于 2018-5-14 21:12
初学者肯定是库函数来得快了,
寄存器太多, 新学者会被搞得眼花缭乱的,
学习库函数时通过查库函数的原型 ...

谢谢,你的回答。
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4518
金钱
4518
注册时间
2018-5-11
在线时间
945 小时
 楼主| 发表于 2018-5-15 08:39:47 | 显示全部楼层
本帖最后由 warship 于 2018-5-15 08:47 编辑
275891381 发表于 2018-5-13 20:16
把原子的KEY_Scan改造下:
u8 KEY_Scan(u8 mode)
{         

又看了一下您提供的键扫代码, 理解加注释并改造了一下, 如有错误请指正:

u8 Key;  //设一个全局变量存放键值

u8 KEY_Scan_Stick(u8 mode)
{         
static u8 flag=0;  //再次检测到按键标志  
static s8 key_up=1;//按键松开标志

        if(Key) return Key; //现存键为非0键, 则直接返回现存键(有效按键必须被处理过后才能再扫描键盘)      

        //现存0键的情况下
        if(mode) key_up=1;  //支持连按则置按键松开标志
        if(!flag)  //非再次检测
                {
                        if(key_up && _HalPollingKey()) //如果在按键松开前提下,有键按下
                                        flag=1;   //置位再检标志
                        else if(!key_up && !_HalPollingKey()) //如果在按键未松标志的前提下,已无键按下
                                        key_up=1; //则置位按键已松开标志
                }
        else   //再次检测
         {
                        key_up=0;  //清 松开标志
                        flag=0;    //复位再检标志
                        return  _HalPollingKey(); //再扫键, 并返回键值(也有可能是0)
          }        
       return 0;// 无按键按下(或初次检测)
}
其中_HalPollingKey()为无延迟读键函数
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4518
金钱
4518
注册时间
2018-5-11
在线时间
945 小时
 楼主| 发表于 2018-5-15 09:03:16 | 显示全部楼层
本帖最后由 warship 于 2018-5-15 09:13 编辑
275891381 发表于 2018-5-14 22:08
是这样子的,不过中断里面延时10ms,啥时候都是不能容忍的,尽量避免吧

想了一下, 其实各有优缺点:
这种外部按键中断的方式, 是不占用CPU时间的, 毕竟99%以上的时间都不会有按键.那种每20ms必扫描一次键盘的方式, 其实99%都是在做无用功, 浪费CPU资源.
一旦有按键, 延时这10ms消抖感觉是可以容忍的
在这个外部线中断的服务程序中,也可以仿您提供的置flag先退出中断再检测的,
但这10ms期间, 可能会因为抖动多次进入中断, 可能没有必要.


我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-5-15 09:55:04 | 显示全部楼层
warship 发表于 2018-5-15 09:03
想了一下, 其实各有优缺点:
这种外部按键中断的方式, 是不占用CPU时间的, 毕竟99%以上的时间都不会有按 ...

对,弄个flag,退出中断扫描一下最好,不过我写的那个扫描函数,也没几行代码,微妙级别的吧,浪费不太大,看自己需要那种方式都可以
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-7 22:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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