你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

(有代码)systick->load的值怎么确定可以精准延时?

[复制链接]
beary 提问时间:2015-10-24 16:18 /

网上找了不少帖子和代码,这个看上去比较靠谱 不过有点看不太懂,问题就是题目说的,麻烦了!!!谢谢

static __INLINE uint32_t
SysTick_Config(uint32_tticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);         /*Reload value impossible */
   
/* set reload register */                                                           
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) -1;
/* set Priority for Cortex-M0System Interrupts */
  NVIC_SetPriority (SysTick_IRQn,(1<<__NVIC_PRIO_BITS) - 1);
  SysTick->VAL   = 0;                                        /* Loadthe SysTickCounter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;     /* Enable SysTickIRQ and SysTickTimer */
return (0);                                                 /* Function successful */
}


static __IO uint32_t TimingDelay;
void Delay(__IO uint32_t nTime)
{
   TimingDelay = nTime;
  while(TimingDelay !=0);
}
void SysTick_Handler(void)
{
   if (TimingDelay !=0x00)
    {
      TimingDelay--;
    }
}
intmain(void)
{  …
   if (SysTick_Config(SystemCoreClock /1000)) //systick时钟为HCLK,中断时间间隔1ms
    {
    while (1);
    }
   while(1)
    { Delay(200);//200ms
    …
    }
}

收藏 2 评论10 发布时间:2015-10-24 16:18

举报

10个回答
adersonl 回答时间:2015-10-24 17:08:10
小白不懂帮顶
samsamhoo 回答时间:2015-10-24 17:36:38
是不是要找这个

/* delay.c file

功能:
提供精确的延时API  有微秒级 和毫秒级延时
------------------------------------
*/
#include "z_delay_um.h"
         
static uint8_t  fac_us=0;//us延时倍乘数
static uint16_t fac_ms=0;//ms延时倍乘数

//初始化延迟函数
//SYSTICK的时钟固定为HCLK时钟的1/8
//SYSCLK:系统时钟
/**************************实现函数********************************************
*函数原型:                void delay_init(u8 SYSCLK)
*功  能:                初始化延迟系统,使延时程序进入可用状态
*******************************************************************************/
void delay_init(uint8_t SYSCLK)
{
        SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟  HCLK/8
        fac_us=SYSCLK/8;                    
        fac_ms=(uint16_t)fac_us*1000;
}                               
                                    
//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
/**************************实现函数********************************************
*函数原型:                void delay_ms(u16 nms)
*功  能:                毫秒级延时  延时nms  nms<=1864
*******************************************************************************/
void delay_ms(uint16_t nms)
{                                     
        uint32_t temp;                  
        SysTick->LOAD=(uint32_t)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)
*功  能:                微秒级延时  延时nus  nms<=1864
*******************************************************************************/                                                                                      
void delay_us(uint32_t nus)
{               
        uint32_t 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;       //清空计数器         
}

//------------------End of File----------------------------
creep 回答时间:2015-10-24 17:44:56
下面这个函数可以将要延时1ms的时间根据SYSTICK的时钟换算成相应的TICKS值装载到load中,这样SYSTICK每次中断就是1ms,除此之外为了达到精确的延时还要将SYSTICK的中断优先级设置为最高,否则可能不准确。
  1. __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
  2. {
  3.   if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
  4.   {
  5.     return (1UL);                                                   /* Reload value impossible */
  6.   }

  7.   SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */
  8.   NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
  9.   SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */
  10.   SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
  11.                    SysTick_CTRL_TICKINT_Msk   |
  12.                    SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */
  13.   return (0UL);                                                     /* Function successful */
  14. }
复制代码
moyanming2013 回答时间:2015-10-24 18:40:49
精确度这个总是会有个极限的。
limale 回答时间:2015-10-24 19:24:31
这个和定时器延时差不多吧。
你好我好大家好! 回答时间:2015-10-24 20:14:22
帮顶                                 
disheng4688 回答时间:2015-10-25 09:11:46
帮顶                    
qiu-368230 回答时间:2015-10-25 09:27:51
应该是 软定时,这样用是可以的
肽宰1 回答时间:2015-10-25 10:36:03
谢谢分享
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版