OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6513|回复: 2

请教 关于正点原子的SYSTEM文件夹

[复制链接]

8

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2014-8-21
在线时间
1 小时
发表于 2014-8-22 14:55:15 | 显示全部楼层 |阅读模式
5金钱
其中有三个文件   我想问关于delay.c的        这个文件下有两个 void delay_us(u32 nus)   以及两个void delay_ms(u16 nms)      到底哪个才是真正的延时函数     同时为什么会有两个呢 ?
#include "delay.h"
#include "sys.h"
//////////////////////////////////////////////////////////////////////////////////  
#if SYSTEM_SUPPORT_UCOS
#include "includes.h" 
#endif
//////////////////////////////////////////////////////////////////////////////////  
//ALIENTEK STM32

static u8  fac_us=0; 
static u16 fac_ms=0;

#ifdef OS_CRITICAL_METHOD /
void SysTick_Handler(void)
{   
    OSIntEnter(); 
    OSTimeTick();                    
    OSIntExit();        
}
#endif
  

void delay_init(u8 SYSCLK)
{
     #ifdef OS_CRITICAL_METHOD 
     u32 reload;
#endif
     SysTick->CTRL&=~(1<<2);  
    fac_us=SYSCLK/8; 
   
#ifdef OS_CRITICAL_METHOD 
reload=SYSCLK/8; 
reload*=1000000/OS_TICKS_PER_SEC;

fac_ms=1000/OS_TICKS_PER_SEC;
SysTick->CTRL|=1<<1;  
SysTick->LOAD=reload; 
SysTick->CTRL|=1<<0; 
#else
fac_ms=(u16)fac_us*1000;
#endif
}    

#ifdef OS_CRITICAL_METHOD //????OS_CRITICAL_METHOD?¨????,???÷????ucosII??.
              
void delay_us(u32 nus)
{
u32 ticks;
u32 told,tnow,tcnt=0;
u32 reload=SysTick->LOAD;   
ticks=nus*fac_us; 
tcnt=0;
OSSchedLock();
told=SysTick->VAL;         
while(1)
{
tnow=SysTick->VAL;
if(tnow!=told)
{    
if(tnow<told)tcnt+=told-tnow;/
else tcnt+=reload-tnow+told;    
told=tnow;
if(tcnt>=ticks)break;
}  
};
OSSchedUnlock();
}

void delay_ms(u16 nms)
{
if(OSRunning==TRUE)
{  
if(nms>=fac_ms)
{
    OSTimeDly(nms/fac_ms);
}
nms%=fac_ms; 
}
delay_us((u32)(nms*1000)); 
}
#else
 
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;       
}

void delay_ms(u16 nms)
{    
u32 temp;   
SysTick->LOAD=(u32)nms*fac_ms;
SysTick->VAL =0x00;          
SysTick->CTRL=0x01 ;          
do
{
temp=SysTick->CTRL;
}
while((temp&0x01)&&!(temp&(1<<16)));
SysTick->CTRL=0x00;       
SysTick->VAL =0X00;         

#endif

最佳答案

查看完整内容[请看2#楼]

回复【2楼】STM32VBT6: --------------------------------- 尽管你回答的不是我所问的   还是谢谢你了    我已经搞懂了     看了手册后明白了     一个是使用ucos    一个不使用ucos
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2014-8-21
在线时间
1 小时
 楼主| 发表于 2014-8-22 14:55:16 | 显示全部楼层
回复【2楼】STM32VBT6:
---------------------------------
尽管你回答的不是我所问的   还是谢谢你了    我已经搞懂了     看了手册后明白了     一个是使用ucos    一个不使用ucos
回复

使用道具 举报

17

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
发表于 2014-8-22 15:21:19 | 显示全部楼层
。。。。。。。。。。。。
一个是短时间延时的微秒延时函数;
一个是较长时间延时的毫秒延时函数。
前者精确到us,后者到ms。但二者的最长延时都一样。大概1.8s。
做两个方便用户选择。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-4 11:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表