第一章 介绍滴答定时器的章节
滴答定时器和普通的定时器功能其实差不多,都是定时器;滴答定时器是24位的,单次计时的时间更加长,平时滴答定时器主要作为系统心跳使用。 比如:RTOS、UCOS实时操作系统的心跳值、LWIP、UIP网络协议栈的心跳值等等。 如果项目里没有操作系统这些系统库,可以将滴答定时器用来作为延时函数的时间基准,方便给项目提供精确的延时;下面介绍了滴答定时器的基本使用之后,也会介绍滴答定时器作为延时函数的封装方法,提供高精度的延时函数。
STM32F407参考手册中第10章介绍了滴答定时器的校准值。
M4 权威指南介绍滴答定时器的章节,M3 权威指南中与M4 权威指南中的介绍一样。

第二章 滴答定时器的示例代码
在sys.c文件中增加滴答定时器的代码,测试定时效果
下面的例子代码是演示滴答定时器的使用效果,直接设置了一个固定的超时时间,时间到达之后就会进入到中断,改变LED状态。
/*
函数功能:滴答时钟初始化配置
注意:SysTick->LOAD是一个24位的寄存器,单次最大延时时间为894.7848ms
*/
void SysTickInit(void)
{
SysTick->CTRL&=~(1<<2); //选择外部时钟源
SysTick->CTRL|=1<<1; //开启中断
SysTick->LOAD=18750*800;//重装载寄存器,最大24位,最大值:16777215
SysTick->VAL=0; //清除CNT计数值
SysTick->CTRL|=1<<0; //SysTick 定时器的使能位
}
/*
函数功能:滴答时钟中断服务函数
*/
void SysTick_Handler(void)
{
LED0=!LED0;
LED1=!LED1;
}
复制代码
第三章 使用滴答定时器编写延时函数
3.1 在delay.c文件增加以下代码
/*
函数功能:延时函数初始化
*/
void DelayInit(void)
{
SysTick->CTRL&=~(1<<2); //选择外部时钟源
SysTick->CTRL&=~(1<<1); //关闭中断
}
/*
函数功能:延时毫秒的函数
函数参数:毫秒的时间
*/
void DelayMs(u32 time)
{
u32 stat;
SysTick->LOAD=18750*time; //重装载寄存器,最大24位,最大值:16777215
SysTick->VAL=0; //清除CNT计数值
SysTick->CTRL|=1<<0; //SysTick 定时器的使能位
do
{
stat=SysTick->CTRL; //获取状态位
}while((!(stat&1<<16))&&(stat&1<<0));
SysTick->CTRL=0x0;
}
/*
函数功能:延时微秒的函数
函数参数:毫秒的时间
*/
void DelayUs(u32 time)
{
u32 stat;
SysTick->LOAD=18.750*time; //重装载寄存器,最大24位,最大值:16777215
SysTick->VAL=0; //清除CNT计数值
SysTick->CTRL|=1<<0; //SysTick 定时器的使能位
do
{
stat=SysTick->CTRL; //获取状态位
}while((!(stat&1<<16))&&(stat&1<<0));
SysTick->CTRL=0x0;
}
复制代码
3.2 闪光灯示例
在主函数里加上逻辑代码,使用刚才编写的延时函数完成延时,实现闪光灯效果。
#include "stm32f4xx.h" // Device header
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include "sys.h"
#include "exti.h"
int main(void)
{
LED_Init();
KEY_Init();
USART1_Init(84,115200);
KEY_EXTI_Init();
while(1)
{
DelayUs(100);
LED0=!LED0;
LED1=!LED1;
}
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
单片机
+关注
关注
6078文章
45602浏览量
674225 -
STM32
+关注
关注
2313文章
11197浏览量
374817 -
定时器
+关注
关注
23文章
3376浏览量
124765 -
STM32F407
+关注
关注
15文章
189浏览量
31779
发布评论请先 登录
相关推荐
热点推荐
国产MCU开发工具不输STM32Cube:教你玩转PY32F072高级定时器
高级定时器一般是芯片中最复杂的定时器,在使用高级定时器输出PWM波时,波形的配置是比较麻烦的,得到想要的波形,需要计算时钟,分频,加载值,对于互补的功能,还要计算死区时间,输出极性等。
发表于 01-26 10:15
CW32系统滴答SysTick定时器详解
存放10mS校准值,该值和MCU相关。
3.操控SysTick定时器
在MDK开发环境中,我们不必要非得去操作每一个寄存器,可以通过调用CW函数库中的函数来进行相关的操作。
void
发表于 01-21 07:20
LAT1173高精度定时器的同步功能应用笔记
STM32G474 所含的高精度定时器(HRTIMER)其实包含了多个定时器,多个定时器之间可以单独工作,也可以进行同步,且高精度定时器还能
发表于 01-11 17:32
•0次下载
LAT1183+高精度定时器中 single-shot 计数模式不工作应用笔记
客户使用 STM32G474 的高精度定时器,基于 CubeMX 进行外设配置与代码生成,将某个子定时器的计数方式设置为 retriggerable single shot 方式,发现
发表于 01-11 17:28
•0次下载
硬件定时器如何配置固定频率?
需求是:以25.6kHz操作引脚电平,系统主频为160MHZ,STM32F429
按照文档里“HWTIMER 设备”开启了硬件定时器,但只能配置时间,按时间换算我要的这个频率为 39.0625us
发表于 09-26 07:12
SysTick系统滴答定时器简介
SysTick—系统定时器是属于CM33内核中的一个外设,内嵌在NVIC中。系统定时器是一个24bit的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时
定时器同步之并行模式
板
1.2 软件资源
该 Demo 以 AT32F403A 为例,BSP 版本 AT32F403A_407_Firmware_Library_V2.x.x。
TMR2 作为主定时器,以溢出
发表于 09-22 09:56
在rt-thread4.0.2版本stm32f407硬件平台上,使用reboot命令无法重启,会让系统死机的原因?
我在rt-thread4.0.2版本stm32f407硬件平台上,使用reboot命令无法重启,会让系统死机。
reboot命令默认是调用rt_hw_cpu_reset()
发表于 09-12 06:08
用STM32H750定时器抓最高30M信息源,定时器能不能配置成100M?
你好,我们要用 STM32H750 定时器抓最高30M 信息源,定时器能不能配置成100M?超过1M用适波器无法看到波形,不知道是哪的问题
发表于 08-08 06:23
STM32入门篇之通用定时器彻底研究
新手教程,含11个例程,全面剖析TIMER
STM32的定时器功能很强大,学习起来也很费劲儿,本人在这卡了5天才算看明白。写下下面的文字送给后来者,希望能带给你点启发。在此声明,本人也是刚入门
发表于 08-01 16:51
stm32f407无法配置定时器2为全部dma怎么解决?
本人使用定时器2配置为4个通道的dma捕获时,出现stream6和stream7这两个对应的通道无法同时存在,在都配置的情况下,只要这两个对应的通道一接入外部信号,就会出现所有dma无法产生中
发表于 06-11 06:49
STM32F407入门开发: 滴答定时器配置
评论