This repository has been archived on 2024-12-31. You can view files and clone it, but cannot push or open issues or pull requests.
mfps/App/Src/delay.c

99 lines
2.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "delay.h"
#include "main.h"
#include "tim.h"
#include "app.h"
static uint8_t fac_us=0; //us延时倍乘数
//static uint16_t fac_ms=0; //ms延时倍乘数,在ucos下,代表每个节拍的ms数
#define SysTick_CLKSource_HCLK_Div8 ((uint32_t)0xFFFFFFFB)
#define SysTick_CLKSource_HCLK ((uint32_t)0x00000004)
//#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SysTick_CLKSource_HCLK) || \
// ((SOURCE) == SysTick_CLKSource_HCLK_Div8))
extern void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource);
//初始化延迟函数
//当使用OS的时候,此函数会初始化OS的时钟节拍
//SYSTICK的时钟固定为HCLK时钟的1/8
//SYSCLK:系统时钟
void delay_init()
{
#if SYSTEM_SUPPORT_OS //如果需要支持OS.
u32 reload;
#endif
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK/8
fac_us=SystemCoreClock/8000000; //为系统时钟的1/8
#if SYSTEM_SUPPORT_OS //如果需要支持OS.
reload=SystemCoreClock/8000000; //每秒钟的计数次数 单位为M
reload*=1000000/delay_ostickspersec; //根据delay_ostickspersec设定溢出时间
//reload为24位寄存器,最大值:16777216,在72M下,约合1.86s左右
fac_ms=1000/delay_ostickspersec; //代表OS可以延时的最少单位
SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //开启SYSTICK中断
SysTick->LOAD=reload; //每1/delay_ostickspersec秒中断一次
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK
#else
// fac_ms=(uint16_t)fac_us*1000; //非OS下,代表每个ms需要的systick时钟数
#endif
}
void delay_10ms(int tm)//延时tm*10 ms
{
it_10ms_flag = 0;
while( tm > 0 )
{
if(it_10ms_flag == 1)
{
it_10ms_flag = 0;
tm--;
}
}
}
//int ts = 33;
//void delay_us(int tm) //stm32 72MHz 执行一条指令所需时间为 11~100ns按照30ns算
//{
// int i = 0,j = 0;
// for(i = 0;i < tm;i++)
// {
// for(j = 0;j < ts;j++);
// }
//}
void delay_us(uint32_t nus)
{
uint32_t temp;
SysTick->LOAD=nus*fac_us; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
void delay_ns(int tm)
{
int i = 0;
for(i = 0;i < tm;i++)
{
}
}
void delay(unsigned long count)
{
while(count--)
__NOP();
}