历史上的今天
返回首页

历史上的今天

今天是:2025年04月01日(星期二)

正在发生

2020年04月01日 | STM32F407ZGT6用滴答定时器实现精确延时(寄存器版)

2020-04-01 来源:eefocus

1.滴答定时器介绍


SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号: 15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。


滴答定时器是ARM公司设计架构是已经集成到内核中,也就是说只要采用ARM公司设计芯片滴答定时器是通用的,写好的滴答定时器在其他的采用ARM公司设计的芯片直接可以拿来使用。


滴答定时器的时钟频率是21MHZ,采用的是递减计数的计数方式,一次定时的最长时间=1/21000000   *(2^24-1) = 799ms


2.编写滴答定时器驱动程序的思路:


①选择时钟源

选择外部的时钟源 21MHZ

通过SysTick控制及状态寄存器 第2位控制

②写入自动重装载值

写入到自动重装载寄存器中(计数器的初值) 

③清空当前数值寄存器

直接对该寄存器写入0

④使能定时器

通过控制和状态寄存器的第0位实现  写1使能

⑤等待计数时间到达

隐含条件 当前数值寄存器里的值从 1--->0 这一瞬间

控制及状态寄存器的第16位就会立即变为1 读取该寄存器的

16 位清空当前的标志位

while((SysTick->CTRL & (1<<16))==0);

⑥关闭定时器


通过控制和状态寄存器的第0位实现 写0关闭


3.驱动程序头文件


#ifndef  _DELAY_H


#define  _DELAY_H


#include "stm32f4xx.h"


//宏定义


//函数声明

void delay_ms(u16 ms);

void delay_us(u32 us);

void delay_xms(u32 xms);


#endif


4.驱动程序源文件

#include "delay.h"


/********************

函数名:    delay_ms

函数参数:  u16 ms :需要延时时间 以ms为单位

函数返回值:无

函数功能:  实现滴答定时器的ms级别的延时

函数描述:

*********************/


void delay_ms(u16 ms)

{

//选择时钟(外部的时钟)

SysTick->CTRL &=~(0x1<<2);

//写入自动重装载值

SysTick->LOAD = 21000*ms;

//清空当前数值寄存器

SysTick->VAL=0;

//打开定时器开始递减计数

SysTick->CTRL |=(0x1<<0);

//等待当前数值计数器递减到0

while((SysTick->CTRL & (1<<16))==0);

//等待完成以后一次滴答计时结束关闭定时器

SysTick->CTRL &=(0x1<<0);

}


/********************

函数名:    delay_us

函数参数:  u32 us :需要延时时间 以us为单位

函数返回值:无

函数功能:  实现滴答定时器的us级别的延时

函数描述:

*********************/


void delay_us(u32 us)

{

//选择时钟(外部的时钟)

SysTick->CTRL &=~(0x1<<2);

//写入自动重装载值

SysTick->LOAD = 21*us;  /*    21/21000000 = 1us   */

//清空当前数值寄存器

SysTick->VAL=0;

//打开定时器开始递减计数

SysTick->CTRL |=(0x1<<0);

//等待当前数值计数器递减到0

while((SysTick->CTRL & (1<<16))==0);

//等待完成以后一次滴答计时结束关闭定时器

SysTick->CTRL &=(0x1<<0);

}



//实现任意ms级别的延时

//以500ms的延时为基准延时


void delay_xms(u32 xms)

{

u16 i =0;//延时的倍数循环变量

//计算整数个基准延时

for(i=0; i {

delay_ms(500);

}

//如果不是整数倍 有剩余的延时

if(xms%500!=0)  //有余数

{

delay_ms(xms%500);

}

}

推荐阅读

史海拾趣

台湾双羽公司的发展小趣事

在成为全球领先的电子企业之后,富士通并没有停下脚步。公司开始积极拓展海外市场,将先进的技术和产品带到世界各地。通过在全球各地设立分支机构、与当地企业建立合作关系等方式,富士通成功地将自己的业务版图扩展到了全球60多个国家和地区。这一过程中,富士通不仅为当地市场带来了先进的技术和产品,也促进了全球电子产业的交流与合作。

科通(COMTEK)公司的发展小趣事

科通技术股份有限公司(简称科通技术)成立于1995年,总部位于深圳,是中国早期知名的IC元器件分销商。公司创始人凭借对电子行业的敏锐洞察力和对市场需求的深刻理解,迅速在市场中站稳脚跟。初期,科通技术主要专注于为国内外客户提供高质量的电子元器件和专业的技术支持,凭借其卓越的产品质量和服务水平,赢得了客户的广泛认可。

Emerging Display Technolgies公司的发展小趣事

某新兴显示技术公司,专注于柔性显示技术的研发。随着市场对可折叠、可卷曲电子设备需求的增加,该公司投入巨资研发新一代柔性屏幕。经过数年的努力,他们成功开发出了具有超高柔韧性、清晰度和耐用性的显示屏。这一技术的突破,不仅为智能手机、平板电脑等移动设备带来了全新的形态设计,也为可穿戴设备、车载显示等领域提供了更多可能性。

Green Power Solutions公司的发展小趣事
可能是由于取样电路、放大电路或磁放大器故障导致。
BK Precision公司的发展小趣事

BK Precision公司的历史可以追溯到1951年,当时它由创始人Carl Korn在美国加利福尼亚州的约巴琳达创立。起初,公司主要关注于电视维修服务,很快就因在电视配件测试设备方面的创新而获得了市场认可。Korn先生对于简易测试电视配件设备的追求,使得映像管再生器和真空管测试器等产品迅速在电子服务行业中赢得了口碑。这一阶段的成功为BK Precision日后的发展奠定了坚实的基础。

成都振芯/国腾(CORPRO)公司的发展小趣事

2003年,成都国腾微电子有限公司(后更名为成都振芯科技股份有限公司)正式成立,标志着CORPRO的起点。公司由成都国腾电子集团投资设立,创始人团队汇聚了来自中国物资储运集团、电子科技大学等单位的精英。在成立之初,CORPRO就致力于集成电路、微波组件及相关电子器件的设计、开发与销售,奠定了其在电子行业的基础。

问答坊 | AI 解惑

关与MAP文件的一点认识

近来有很多朋友问及MAP文件,下面我就对MAP文件的一点理解和大家分享。 MAP文件是CCS软件编译后产生的有关DSP用到所有程序、数据及IO空间的一种映射文件。 一、生成方法     MAP文件主要有两种生成方法,一种是由系统自动生成,默认文 ...…

查看全部问答>

求立宇泰2440的原理图

请问哪位兄弟有立宇泰2440的原理图,能否分享一下,谢谢。 Email:chinajszcw@163.com…

查看全部问答>

8259A芯片中有那些寄存器?各寄存器有什么作用?

8259A芯片中有寄存器总数有多少?各寄存器名称和作用?…

查看全部问答>

在windows mobile下写输入法,那位大哥能给点资料?

在windows mobile下写输入法,那位大哥能给点资料? SIP IME输入法都可以,还想问下大家,sip能切换ime输入法吗?…

查看全部问答>

EVC编程出现LINK 错误 我不能解决 希望有高人能帮我看看 谢谢了。。

         error LNK2019: unresolved external symbol \"int __cdecl registerwnd(struct HINSTANCE__ *)\" (?registerwnd@@YAHPAUHINSTANCE__@@@Z) referenced in function WinMain ARMV4Rel/mytimetable.exe : fa ...…

查看全部问答>

arduino /maple 驱动sht11库

内含例程。另附一个不使用库的sht1x例程。 [ 本帖最后由 ssawee 于 2011-1-29 12:21 编辑 ]…

查看全部问答>

给内存里一个u32的变量赋值的操作能够被中断么?

给内存里一个u32的变量赋值的操作能够被中断么?我在中断的外面对一个u32的变量赋值,会不会在外面赋值一部分的时候,进了中断。这样,我在中断里面读到的这个变量值就不准了恳请高手指教…

查看全部问答>

MDK调试时串口接收数据,可以实时显示出数据是多少么?

MDK调试时串口接收数据,调试时,可以实时显示出数据么? 比如串口收到0x12  0x34 。 那么MDK的watches栏里面可以看到么? 很着急啊  多谢!!…

查看全部问答>

sw笨笨的STM32笔记之十:工作工作,PWM输出

a)        目的:基础PWM输出,以及中断配合应用。输出选用PB1,配置为TIM3_CH4,是目标板的LED6控制脚。b)        对于简单的PWM输出应用,暂时无需考虑TI ...…

查看全部问答>