STM32的精确延时

Posted liguangsunls

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32的精确延时相关的知识,希望对你有一定的参考价值。

/*----------------------------------------------------------
文件名:systick.c
文件描写叙述:sysTick 系统滴答时钟1us中断函数库。中断时间可自由配置
备注:程序默认使用72M时钟,无分频
-----------------------------------------------------------------*/
#include "delay.h"
static __IO u32 TimingDelay;
/*-----------------------------------------------------------------------
程序名称:systick Init
程序描写叙述:启动系统滴答定时器 systick
输入參数:无
返回參数:无
备注: 使用此功能之前须要调用此函数。初始化寄存器等參数
----------------------------------------------------------*/
void SysTick_Init(void)
{
	//SystemFrequency /1000 1ms中断一次
	//SystemFrequency /100000 10us中断一次
	//SystemFrequency /1000000 1us中断一次
	if(SysTick_Config(SystemCoreClock /1000000))  //1us
	{
		/*Caputure error*/
		while(1);
	}
}


/*---------------------------------------------
程序名称:Delay_us
程序描写叙述:延时nTime us
输入參数:nTime
返回參数:无
备注:  无
-----------------------------------------------*/
void Delay_us(__IO u32 nTime)
{
	TimingDelay = nTime;
	while(TimingDelay != 0);
}

/*--------------------------------------------------
程序名称:TimingDelay_Decrement
程序描写叙述:数字递减到0
输入參数:无
返回參数:无
备注: 须要中断函数SysTick_Handle()中调用
---------------------------------------------------------*/
void TimingDelay_Decrement(void)
{
	if(TimingDelay != 0x00)
	{
		TimingDelay--;
	}
}
在学习的时候发现,延时是错误的,由于这里的要是要依赖于系统的时钟所以在中断函数中要增加
<pre name="code" class="cpp">SysTick_Handle()


/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
void SysTick_Handler(void)
{
<span style="white-space:pre">	</span>TimingDelay_Decrement();
}

以上是关于STM32的精确延时的主要内容,如果未能解决你的问题,请参考以下文章

STM32 不占用定时器(包括SysTick)实现精确延时(巧用DWT)

FSMC是不是会使STM32工作效率降低

stm32左转延时

STM32 FreeRTOS中延时可以用vTaskDelay,但是计时,定时该如何实现?

STM8S系列基于STVD开发,自定义printf函数+TIM5精确延时函数模块化工程示例

stm32 微秒定延时问题