本帖最后由 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运行,上述的延时函数会延时更长的时间。
|