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