打印

GD32软件延时,精确到0.2us

[复制链接]
7784|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
listentoenglish|  楼主 | 2013-7-21 16:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 listentoenglish 于 2013-7-29 08:03 编辑
        
        
        //延时,一般是(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
#ifndef __GD32F10X_DELAY_H__
#define __GD32F10X_DELAY_H__

#ifdef __cplusplus
extern "C" {
#endif
  
void __delay_loops(uint32 n);
void __delay_loops_0(void);

#ifdef __cplusplus
}
#endif

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

#define  _CYCLES_PER_LOOP  3

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

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

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

#endif
int main(void)
{  
  SystemInit();
  
  GPIO_InitTypeDef GPIO_InitStructure;
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  while(1)
  {            
    GPIOA->ODR ^= GPIO_Pin_8;
    //_delay_us(0);       //实测120ns   
    //_delay_us(0.1);     //实测150ns   
    //_delay_us(0.5);     //实测560ns
    //_delay_us(1);       //实测1.02us
    //_delay_us(5);       //实测5.10us
    //_delay_us(10);      //实测10us
    //_delay_us(100);     //实测100us
    //_delay_us(1000);    //实测1000us
    //_delay_us(10000);   //实测10ms
    //_delay_us(100000);  //实测100ms
    _delay_us(1000000); //实测1s
  }
}

以上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

沙发
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。

使用特权

评论回复
5
miaoguoqiang| | 2013-7-22 09:37 | 只看该作者
主频改变了呢

使用特权

评论回复
6
周立功GD32| | 2013-7-22 09:50 | 只看该作者
延时最好还是利用硬件定时器来做,应用程序是要讲究可读性、可移植性、可维护性的

使用特权

评论回复
7
listentoenglish|  楼主 | 2013-7-22 09:51 | 只看该作者
miaoguoqiang 发表于 2013-7-22 09:37
主频改变了呢

定义宏 F_CPU 为实际MCU的频率就行了。
如:
#define F_CPU 108000000UL

使用特权

评论回复
8
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,实验实测决定。

使用特权

评论回复
9
tergy2012| | 2013-7-22 12:00 | 只看该作者
路过学习的

使用特权

评论回复
10
listentoenglish|  楼主 | 2013-7-27 09:47 | 只看该作者
在FLASH运行延时1ms的函数,在RAM运行,延时为3ms。

使用特权

评论回复
11
kangxuebin| | 2013-7-28 20:50 | 只看该作者
listentoenglish 发表于 2013-7-21 17:27
已上传。

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

谢谢

使用特权

评论回复
12
worldsing| | 2013-8-5 13:00 | 只看该作者
傻等的方法有点浪费吧

使用特权

评论回复
13
wangdezhi| | 2013-8-27 15:56 | 只看该作者
跟msp430很相似了。

使用特权

评论回复
14
make8419247| | 2013-11-14 08:43 | 只看该作者
这个真不错!

使用特权

评论回复
15
3htech| | 2013-12-21 15:48 | 只看该作者
worldsing 发表于 2013-8-5 13:00
傻等的方法有点浪费吧

模拟个总线的时候,就1、2us的等待,用定时器反而不合适吧?

使用特权

评论回复
16
lixiang1729| | 2013-12-21 20:25 | 只看该作者
直接搞汇编,佩服

使用特权

评论回复
17
喵小棋| | 2013-12-22 09:37 | 只看该作者
下载研究一下

使用特权

评论回复
18
luoxiaobing| | 2013-12-22 10:18 | 只看该作者
汇编伤不起

使用特权

评论回复
19
fengshuo123| | 2013-12-22 10:30 | 只看该作者
看不明白汇编

使用特权

评论回复
20
fangxingyi| | 2013-12-22 10:53 | 只看该作者
谢谢楼主

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

16

帖子

0

粉丝