使用SysTick来编写延时的两种不同方法的区别

2019-08-23 17:03发布

下面两种延时都是用SysTick来编写的,但是用于某些程序当中第一种方法的延时往往会卡在延时处进行不下去。例如USART通信程序和LCD显示实验中。
有没有哪位大神也遇到过这种情况,可以告诉我一声。感觉都已经快纠结屎了。@正点原子

[mw_shl_code=applescript,true]#include "delay.h"
#include "stm32f10x.h"

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

void delay_init(void)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);

fac_us = SystemCoreClock/8000000;

fac_ms = (u16)fac_us*1000;
}

void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD =(u32)nms*fac_ms;
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_us(u32 nus)
{
  u32 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;
}
[/mw_shl_code][mw_shl_code=applescript,true]uint32_t TimingDelay = 0;


void Delay_Ms(uint32_t nTime)
{
    TimingDelay = nTime;
    while(TimingDelay != 0);
}


void SysTick_Handler(void)
{
        TimingDelay--;
}
[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。