OpenEdv-开源电子网

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

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

[复制链接]

25

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2016-12-6
在线时间
40 小时
发表于 2017-3-26 12:46:16 | 显示全部楼层 |阅读模式
5金钱
下面两种延时都是用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]

最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

25

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2016-12-6
在线时间
40 小时
 楼主| 发表于 2017-3-26 12:46:17 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-22 22:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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