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();
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-29 15:51:22

STM32的精确延时的相关文章

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

/** ****************************************************************** * file core_delay.c * author fire * version V1.0 * date 2018-xx-xx * [url=home.php?mod=space&uid=247401]@brief[/url] 使用内核寄存器精确延时 **************************************************

Keil C51程序设计中几种精确延时方法

单片机因具有体积小.功能强.成本低以及便于实现分布式控制而有非常广泛的应用领域[1].单片机开发者在编制各种应用程序时经常会遇到实现精确延时的问题,比如按键去抖.数据传输等操作都要在程序中插入一段或几段延时,时间从几十微秒到几秒.有时还要求有很高的精度,如使用单总线芯片DS18B20时,允许误差范围在十几微秒以内[2],否则,芯片无法工作.用51汇编语言写程序时,这种问题很容易得到解决,而目前开发嵌入式系统软件的主流工具为C语言,用C51写延时程序时需要一些技巧[3].因此,在多年单片机开发经验

对MSP430单片机__delay_cycles精确延时的说明及改正

在这里, 我来讨论一下关于MSP430单片机使用__delay_cycles延时的问题. IAR for MSP430编译器提供了一个编译器内联的精确延时函数(并非真正的函数)以提供用户精确延时使用, 该函数原型是: __intrinsic void __delay_cycles(unsigned long __cycles);该内部函数实现__cycles个CPU周期的延时,但对于该参数的设置,我要陈述一下: __cycles需要我们传递的是CPU运行的周期个数 网上普遍的用法是: #defi

8051单片机软件精确延时研究(一)

前言 最近自学51单片机,编程中如流水灯等非精确延时多用软件延时实现,写了几个类似DelayX10us(unsigned char x)的函数方便调用,函数内部的语句多是用官方延时程序再自己套一个for或者do..while循环改造而成,像这样: //非精确延时10*Xus//@12.000MHz 12T模式 void DelayX10us(unsigned char x) { unsigned char i; for (; x > 0; x--) { _nop_(); i = 2; while

关于51精确延时及keil仿真延时时间

转自:http://blog.sina.com.cn/s/blog_980e19e00101b5dh.html 有时候需要精确的延时,比如18B20温度传感器对时序要求非常严格,必须精确到微秒级别 一.用NOP函数 在keil C51中,直接调用库函数: #include // 声明了void _nop_(void); _nop_(); // 产生一条NOP指令 作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒.NOP指令为单周期指令,可由晶振

织女星开发板RISC-V内核实现微秒级精确延时

前言 收到VEGA织女星开发板也有一段时间了,好久没玩了,想驱动个OLED屏,但是首先要实现IIC协议,而实现IIC协议,最基本的就是需要一个精确的延时函数,所以研究了一下如何来写一个精确的延时函数.众所周知,ARM Cortex-M内核都有一个24位的SysTick系统节拍定时器,它是一个简易的周期定时器,用于提供时基,多为操作系统所使用.RV32M1的RISC-V内核也有一个SysTick定时器,只不过它不属于内核,而是使用的一个外部通用定时器,即LPIT0( low power perio

使用系统定时器SysTick实现精确延时微秒和毫秒函数

SysTick定时器简介 SysTick定时器是存在于系统内核的一个滴答定时器,只要是ARM Cortex-M0/M3/M4/M7内核的MCU都包含这个定时器,它是一个24位的递减定时器,当计数到 0 时,将从RELOAD 寄存器中自动重装载定时初值,开始新一轮计数.使用内核的SysTick定时器来实现延时,可以不占用系统定时器,由于和MCU外设无关,所以代码的移植,在不同厂家的Cortex-M内核MCU之间,可以很方便的实现.而东芝的这款TT_M3HQ开发板使用的TMPM3HQFDFG芯片,正

stm32中的延时函数

//粗延时函数,微秒 void delay_nus(u16 time) { u16 i=0; while(time--) { i=10;  //自己定义 while(i--) ; } } //毫秒级的延时 void delay_nms(u16 time) { u16 i=0; while(time--) { i=12000;  //自己定义 while(i--) ; } } 运用SysTick来实现准确定时: SysTick_Config(SystemCoreClock / 10)   函数的形

stm32用SysTick延时

SysTick是内核的一个外设,内嵌在NVIC中,它是一个24位向下递减的定时器,每计数一次的事件位1/SYSCLK(一般为72M),当重装载寄存器的值递减到0时,系统定时器就产生一次中断,循环往复,这个定时器一般用于操作系统来产生时基以维持心跳. CTRL:控制及状态寄存器 LOAD:重装载数值寄存器 VAL:当前数值寄存器 CALIB:校准数值寄存器:暂不讨论 bsp_systick.h: #ifndef __SYSTICK_H #define __SYSTICK_H #include"st