| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- #include <stm32f10x.h>
- #include "delay.h"
- //使用SysTick的普通计数模式对延迟进行管理
- //2010/5/27
- #if 0
- static u8 fac_us = 0; //us延时倍乘数
- static u16 fac_ms = 0; //ms延时倍乘数
- //初始化延迟函数
- //SYSTICK的时钟固定为HCLK时钟的1/8
- //SYSCLK:系统时钟
- void delay_init ( u8 SYSCLK )
- {
- SysTick->CTRL &= 0xfffffffb; //bit2清空,选择外部时钟 HCLK/8
- fac_us = SYSCLK / 8;
- fac_ms = ( u16 ) fac_us * 1000;
- }
- //延时nms
- //注意nms的范围
- //SysTick->LOAD为24位寄存器,所以,最大延时为:
- //nms<=0xffffff*8*1000/SYSCLK
- //SYSCLK单位为Hz,nms单位为ms
- //对72M条件下,nms<=1864
- void delay_ms ( u16 nms )
- {
- u32 temp;
- SysTick->LOAD = ( u32 ) nms * fac_ms; //时间加载(SysTick->LOAD为24bit)
- SysTick->VAL = 0x00; //清空计数器
- SysTick->CTRL = 0x01 ; //开始倒数
- do
- {
- temp = SysTick->CTRL;
- }
- while ( temp & 0x01 && ! ( temp & ( 1 << 16 ) ) ); //等待时间到达
- SysTick->CTRL = 0x00; //关闭计数器
- SysTick->VAL = 0X00; //清空计数器
- }
- //延时nus
- //nus为要延时的us数.
- void delay_us ( u32 nus )
- {
- u32 temp;
- SysTick->LOAD = nus * fac_us; //时间加载
- SysTick->VAL = 0x00; //清空计数器
- SysTick->CTRL = 0x01 ; //开始倒数
- do
- {
- temp = SysTick->CTRL;
- }
- while ( temp & 0x01 && ! ( temp & ( 1 << 16 ) ) ); //等待时间到达
- SysTick->CTRL = 0x00; //关闭计数器
- SysTick->VAL = 0X00; //清空计数器
- }
- #if 1
- void Delay ( vu32 nCount )
- {
- for ( ; nCount != 0; nCount-- );
- }
- #endif
- #endif
- #define DLY_LOOP_CONST (8500000)
- #define DLY_LOOP_CONST1 (8500)
- void Dly1us ( unsigned int DelayVal )
- {
- while ( DelayVal-- )
- {
- for ( unsigned int i = SystemClockFreq / DLY_LOOP_CONST; i; --i );
- }
- }
- void Dly1ms ( unsigned int DelayVal )
- {
- while ( DelayVal-- )
- {
- for ( unsigned int i = SystemClockFreq / DLY_LOOP_CONST1; i; --i );
- }
- }
|