注册 登录
查看: 1000|回复: 12

【求助,提高延时精度的delay】

[复制链接]
发表于 2013-5-10 19:16:19 | 显示全部楼层 |阅读模式
本帖最后由 vistaplay 于 2013-5-10 20:12 编辑

求IAR环境下,延时精度更高的delay.c,谢谢
比如Keil环境下的,如何移植过来???
static uint8_t  fac_us=0;//us延时倍乘数
static uint32_t fac_ms=0;//ms延时倍乘数

//函数名:DELAY_Init
//功  能:延时初始化
//说  明:对延时模块进行配置,SYSCLK表示系统内核时钟频率

void DELAY_Init(uint8_t SYSCLK)      //SYSCLK默认等于核心频率 频率在MDK启动文件中设置 CLOCK_SETUP 宏
{
SysTick->CTRL|=0x04;                //设置系统滴答时钟源为系统内核频率
fac_us=SYSCLK;
fac_ms=(uint32_t)fac_us*1000;
}
//延时us
void DELAY_Us(uint32_t us)
{  uint32_t temp;
   SysTick->LOAD=us*fac_us;    //时间加载
   SysTick->VAL=0x00;          //清空计数器
   SysTick->CTRL|=0x01 ;      //开始倒数   
do
{
  temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));   //等待时间到达   
SysTick->CTRL&=~0x01;                //关闭计数器
}
//延时ms
void DELAY_Ms(uint32_t ms)   
{
     uint32_t temp;
  uint16_t i;
     for(i=0;i<ms;i++) //延时 MS
     {
      SysTick->LOAD=fac_ms; //时间加载1ms
      SysTick->VAL=0x00;   //清空计数器
      SysTick->CTRL|=0x01 ; //开始倒数   
   do
   {
  temp=SysTick->CTRL;
      }
   while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
   SysTick->CTRL&=~0x01;       //关闭计数器
     }
}

回复

使用道具 举报

 楼主| 发表于 2013-5-10 20:12:23 | 显示全部楼层
求助~~~~~~~~~~~~~~~~~
回复 支持 反对

使用道具 举报

发表于 2013-5-10 20:25:58 | 显示全部楼层
本帖最后由 山外メ雲ジ 于 2013-5-10 20:43 编辑

可以用 pit 来做延时啊,例如延时 ns 秒为单位的
  1. #define   pit_init_ms(PITn,ms)  pit_init(PITn,ms * bus_clk_khz);         //初始化PITn,并设置定时时间(单位为 ms)
  2. #define   pit_init_us(PITn,us)    pit_init(PITn,us * bus_clk_khz/1000);    //初始化PITn,并设置定时时间(单位为 us)
  3. #define   pit_init_ns(PITn,ns)    pit_init(PITn,ns * bus_clk_khz/1000000); //初始化PITn,并设置定时时间(单位为 ns)
假设 bus == 100M ,即100*1000k, pit_init_ns(PITn,ns)  的 ns 自起码 ns * bus_clk_khz/1000000 >=1 ,即 ns * 100*1000/1000000  >=1 。

所以 ns >= 10


回复 支持 反对

使用道具 举报

发表于 2013-5-10 20:28:21 | 显示全部楼层
在 IAR 模式下,你只需要 把 SysTick 的定义都复制过来就可以在 IAR 上使用啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-10 20:49:03 | 显示全部楼层
山外メ雲ジ 发表于 2013-5-10 20:28
在 IAR 模式下,你只需要 把 SysTick 的定义都复制过来就可以在 IAR 上使用啊

我四个pit都用了,不然怎么想到用delay了。。。只在vectors.h里看到看到
#define VECTOR_015      default_isr   
  // 0x0000_003C 15 -         ARM core         System tick timer (SysTick)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-10 20:50:09 | 显示全部楼层
山外メ雲ジ 发表于 2013-5-10 20:28
在 IAR 模式下,你只需要 把 SysTick 的定义都复制过来就可以在 IAR 上使用啊

他整个Keil工程文件夹都木有systick的定义
回复 支持 反对

使用道具 举报

发表于 2013-5-10 23:06:25 | 显示全部楼层
vistaplay 发表于 2013-5-10 20:50
他整个Keil工程文件夹都木有systick的定义

可能是用 keil 自带的,你右键,跳到定义处就知道从哪里定义
回复 支持 反对

使用道具 举报

发表于 2013-5-10 23:07:33 | 显示全部楼层
vistaplay 发表于 2013-5-10 20:49
我四个pit都用了,不然怎么想到用delay了。。。只在vectors.h里看到看到
#define VECTOR_015      defau ...

哇塞,能用得了4个pit ,程序也挺复杂了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-11 00:50:58 | 显示全部楼层
山外メ雲ジ 发表于 2013-5-10 23:07
哇塞,能用得了4个pit ,程序也挺复杂了

请问如何去disable 一个pit,比如PIT0的话,这样写可以吗?
PIT_TCTRL(pit0) &= ~( PIT_TCTRL_TEN_MASK | PIT_TCTRL_TIE_MASK );  
回复 支持 反对

使用道具 举报

发表于 2013-5-11 09:35:23 | 显示全部楼层
vistaplay 发表于 2013-5-11 00:50
请问如何去disable 一个pit,比如PIT0的话,这样写可以吗?
PIT_TCTRL(pit0) &= ~( PIT_TCTRL_TEN_MASK  ...

用disabled_irq
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-11 13:05:08 | 显示全部楼层
山外メ雲ジ 发表于 2013-5-11 09:35
用disabled_irq

具体要怎么写?能举个例子吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-11 13:16:53 | 显示全部楼层
山外メ雲ジ 发表于 2013-5-11 09:35
用disabled_irq


是disabled_irq(num),然后num就是vectors.h里的那个序号吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2013-5-11 13:21:32 | 显示全部楼层
vistaplay 发表于 2013-5-11 13:05
具体要怎么写?能举个例子吗?

就是禁止中断,参量就是 中断号
回复 支持 反对

使用道具 举报

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

本版积分规则

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