GD32软件延时,精确到0.2us

[复制链接]
 楼主| listentoenglish 发表于 2013-7-21 16:25 | 显示全部楼层 |阅读模式
本帖最后由 listentoenglish 于 2013-7-29 08:03 编辑
  1.         
  2.         
  3.         //延时,一般是(3-5)*n个周期(n!=0)         
  4.         PUBLIC   __delay_loops
  5.         PUBLIC   __delay_loops_0
  6.         
  7.         SECTION `.text`:CODE:NOROOT(4)
  8.         THUMB
  9. __delay_loops:
  10.         SUBS     R0,R0,#+1               
  11.         BNE      __delay_loops

  12. __delay_loops_0:
  13.         BX       LR               ;; return
  14.         
  15.         END
  1. #ifndef __GD32F10X_DELAY_H__
  2. #define __GD32F10X_DELAY_H__

  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6.   
  7. void __delay_loops(uint32 n);
  8. void __delay_loops_0(void);

  9. #ifdef __cplusplus
  10. }
  11. #endif

  12. #define _delay_loops(n)    do{if(n>2){__delay_loops((n)-2);}else{__delay_loops_0();}}while(0)

  13. #define  _CYCLES_PER_LOOP  3

  14. #define _delay_us(A)\
  15.   _delay_loops( (uint32) (( (double)(F_CPU) *((A)/1000000.0))/_CYCLES_PER_LOOP+0.5))

  16. #define _delay_ms(A)\
  17.   _delay_loops( (uint32) (( (double)(F_CPU) *((A)/1000.0))/_CYCLES_PER_LOOP+0.5))

  18. #define _delay_s(A)\
  19.   _delay_loops( (uint32) (( (double)(F_CPU) *((A)/1.0))/_CYCLES_PER_LOOP+0.5))

  20. #endif
  1. int main(void)
  2. {  
  3.   SystemInit();
  4.   
  5.   GPIO_InitTypeDef GPIO_InitStructure;
  6.   
  7.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  8.   
  9.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  10.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  11.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  12.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  13.   
  14.   while(1)
  15.   {            
  16.     GPIOA->ODR ^= GPIO_Pin_8;
  17.     //_delay_us(0);       //实测120ns   
  18.     //_delay_us(0.1);     //实测150ns   
  19.     //_delay_us(0.5);     //实测560ns
  20.     //_delay_us(1);       //实测1.02us
  21.     //_delay_us(5);       //实测5.10us
  22.     //_delay_us(10);      //实测10us
  23.     //_delay_us(100);     //实测100us
  24.     //_delay_us(1000);    //实测1000us
  25.     //_delay_us(10000);   //实测10ms
  26.     //_delay_us(100000);  //实测100ms
  27.     _delay_us(1000000); //实测1s
  28.   }
  29. }

以上GD32 主频100M测试。

适用所有Cortex-M3,Cortex-M0.
不同主频,定义 F_CPU 为实际MCU的频率;
不同MCU,定义_CYCLES_PER_LOOP,3到5之间,一般FLASH不等待为3,FLASH两等待为5,实验实测决定。


注意:以上延时函数都是针对代码在FLASH运行的情况,Cortex-M3如果代码在RAM运行,不考虑FLASH等待的情况下,运行速度反而会比在FLASH里运行慢。
因此,GD32在RAM运行,上述的延时函数会延时更长的时间。





gd32_delay.rar

628 Bytes, 下载次数: 180

miniko 发表于 2013-7-21 16:32 | 显示全部楼层
沙发
kangxuebin 发表于 2013-7-21 17:00 | 显示全部楼层
很强大,        
        
        //延时,一般是(3-5)*n个周期(n!=0)         
        PUBLIC   __delay_loops
        PUBLIC   __delay_loops_0
        
        SECTION `.text`:CODE:NOROOT(4)
        THUMB
__delay_loops:
        SUBS     R0,R0,#+1               
        BNE      __delay_loops

__delay_loops_0:
        BX       LR               ;; return
        
        END
直接用到工程中吗?
 楼主| listentoenglish 发表于 2013-7-21 17:27 | 显示全部楼层
kangxuebin 发表于 2013-7-21 17:00
很强大,        
        
        //延时,一般是(3-5)*n个周期(n!=0)         

已上传。

可以直接把文件加入到工程里。
编译器IAR。
miaoguoqiang 发表于 2013-7-22 09:37 | 显示全部楼层
主频改变了呢
周立功GD32 发表于 2013-7-22 09:50 | 显示全部楼层
延时最好还是利用硬件定时器来做,应用程序是要讲究可读性、可移植性、可维护性的
 楼主| listentoenglish 发表于 2013-7-22 09:51 | 显示全部楼层
miaoguoqiang 发表于 2013-7-22 09:37
主频改变了呢

定义宏 F_CPU 为实际MCU的频率就行了。
如:
#define F_CPU 108000000UL
 楼主| listentoenglish 发表于 2013-7-22 09:53 | 显示全部楼层
本帖最后由 listentoenglish 于 2013-7-22 09:55 编辑
周立功GD32 发表于 2013-7-22 09:50
延时最好还是利用硬件定时器来做,应用程序是要讲究可读性、可移植性、可维护性的 ...

浪费定时器。

此延时适合适合我用过的所有Cortex-M3.Cortex-M0.
不同MCU只需要更改一下_CYCLES_PER_LOOP,3到5之间,
一般FLASH不等待为3,FLASH两等待为5,实验实测决定。
tergy2012 发表于 2013-7-22 12:00 | 显示全部楼层
路过学习的
 楼主| listentoenglish 发表于 2013-7-27 09:47 | 显示全部楼层
在FLASH运行延时1ms的函数,在RAM运行,延时为3ms。
kangxuebin 发表于 2013-7-28 20:50 | 显示全部楼层
listentoenglish 发表于 2013-7-21 17:27
已上传。

可以直接把文件加入到工程里。

谢谢
worldsing 发表于 2013-8-5 13:00 | 显示全部楼层
傻等的方法有点浪费吧
wangdezhi 发表于 2013-8-27 15:56 | 显示全部楼层
跟msp430很相似了。
make8419247 发表于 2013-11-14 08:43 | 显示全部楼层
这个真不错!
3htech 发表于 2013-12-21 15:48 | 显示全部楼层
worldsing 发表于 2013-8-5 13:00
傻等的方法有点浪费吧

模拟个总线的时候,就1、2us的等待,用定时器反而不合适吧?
lixiang1729 发表于 2013-12-21 20:25 | 显示全部楼层
直接搞汇编,佩服
喵小棋 发表于 2013-12-22 09:37 | 显示全部楼层
下载研究一下
luoxiaobing 发表于 2013-12-22 10:18 | 显示全部楼层
汇编伤不起
fengshuo123 发表于 2013-12-22 10:30 | 显示全部楼层
看不明白汇编
fangxingyi 发表于 2013-12-22 10:53 | 显示全部楼层
谢谢楼主
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

16

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部