更多交流欢迎关注作者抖音号:81849645041

目标

了解 ARM Cortex-M 系列芯片的内部时钟及定时器使用,通过配置 STM32F407 芯片的内部定时器,实现流水灯效果。

原理

Systick定时器就是系统滴答定时器,是一个24位的递减数定时器,计数到0时,将从RELOAD寄存器中自动重装载定时器初值。只要不把它在SysTick控制及状态寄存器中使能位清除,就会一直工作计数,即使在睡眠模式下也能正常工作。

SysTick可以配置AHB系统时钟(处理器时钟)作为时钟源,还可以配置AHB系统时钟的8分频(参考时钟)作为时钟源。当定时器开始时,VAL当前数值寄存器从LOAD寄存器设置的初值开始递减,当计数到0时,将从LOAD寄存器再次获取定时器初值,重新向下递减计数,如此循环往复。如果开启SysTick中断的话,当定时器计数到0,将产生一个中断信号。系统定时器一般用于操作系统,用于产生时基,维持操作系统的“心跳”。

SysTick定时器有4个寄存器,在使用SysTick产生定时的时候,只需要配置CTRL、LOAD、VAL三个寄存器,CALIB校准寄存器不需要配置(出厂时已校准好),寄存器介绍如下:

寄存器名称

寄存器描述

CTRL

SysTick控制及状态寄存器

LOAD

SysTick重装载值寄存器

VAL

SysTick当前数值寄存器

CALIB

SysTick校准数值寄存器

  • CTRL控制及状态寄存器:

  • LOAD重装载数值寄存器:

  • VAL当前数值寄存器:

查看 STM32F407 参考手册了解定时器的时钟线,如下图:

准备

MDK5开发环境的成功安装。

STM32F4xx标准外设库。

STM32F407飞控板。

STMF4xx参考手册。

飞控板电路原理图。

步骤

  • 新建bsp_systick.c和bsp_systick.h文件。
  • 在bsp_systick.c文件中定义两个变量boot_time_ms和time_uint_ms,分别用来存储系统运行时间和定时器产生一次中断时间。
uint32_t boot_time_ms; // 系统运行时间
uint16_t time_uint_ms; // 定时器产生一次中断时间
  • 在bsp_systick.c文件中定义SysTick_Init()函数,用来初始化滴答定时器以及中断。
// systick : 0~ms   99 = 0xFFFFFF / (168M / 1000)
void SysTick_Init(uint16_t time_ms)
{time_uint_ms = time_ms;// 初始化系统定时器及中断 并打开定时器SysTick_Config(SystemCoreClock / 1000 * time_ms);/*** 1s计数 SystemCoreClock* 1ms计数 SystemCoreClock / 1000* 1us计数 SystemCoreClock / 1000000*/
}
  • 在bsp_systick.c中配置滴答定时器中断处理函数。
// 滴答定时器中断处理函数
void SysTick_Handler(void)
{boot_time_ms += time_uint_ms;
}
  • 在bsp_systick.c文件中配置获取当前时间毫秒数的函数。
// 获取当前时间毫秒数
uint32_t SYSTICK_GetTime_Ms(void)
{return boot_time_ms;
}
  • 在bsp_systick.c文件中配置获取当前时间微秒数的函数。
// 获取当前时间微秒数
uint32_t SYSTICK_GetTime_Us(void)
{return boot_time_ms * 1000 + SysTick->VAL / (SystemCoreClock / 1000000);
}
  • 在bsp_systick.c文件中配置延时微秒函数SysTick_DelayUS ()。
// 延迟n us
void SysTick_DelayUS(uint32_t n)
{uint32_t ticks;uint32_t told;uint32_t tnow;uint32_t tcnt = 0;uint32_t reload;reload = SysTick->LOAD;ticks = n * (SystemCoreClock / 1000000); /* 需要的节拍数 */tcnt = 0;told = SysTick->VAL; /* 刚进入时的计数器值 */while (1){tnow = SysTick->VAL;if (tnow != told){/* SYSTICK是一个递减的计数器 */if (tnow < told){tcnt += told - tnow;}/* 重新装载递减 */else{tcnt += reload - tnow + told;}told = tnow;/* 时间超过/等于要延迟的时间,则退出 */if (tcnt >= ticks){break;}}}
}
  • 在bsp_systick.c文件中配置延时好毫秒函数SysTick_DelayMS ()。
void SysTick_DelayMS(uint32_t n)
{SysTick_DelayUS(n*1000);
}
  • 在bsp_systick.h文件中分别声明各函数。
#ifndef __BSP_SYSTICK_H__
#define __BSP_SYSTICK_H__#include "stm32f4xx.h"void SysTick_Init(uint16_t time_ms);
void SysTick_Handler(void);
uint32_t SYSTICK_GetTime_Ms(void);
uint32_t SYSTICK_GetTime_Us(void);
void SysTick_DelayUS(uint32_t n);
void SysTick_DelayMS(uint32_t n);#endif
  • 在main.c文件中的main()函数中调用函数。

第一步:在main()函数中调用SysTick_Init和LED_Init函数,分别初始化滴答定时器和LED灯。

第二步:在while循环中,调用SysTick_DelayMS()函数,实现LED灯闪烁效果。

#include "bsp_led.h"
#include "bsp_systick.h"int main(void)
{SysTick_Init(1); // 初始化滴答定时LED_Init(); // 调用LED初始化函数while(1){LED1_ON; //LED灯亮SysTick_DelayMS(500);LED1_OFF; //LED灯灭SysTick_DelayMS(500);}
}

现象

可以看到飞控板的LED1灯500ms亮一次、500ms灭一次,说明该Systick滴答定时器实验配置成功。

STM32F4无人机Systick滴答定时器相关推荐

  1. [学习笔记]STM32F1 SYSTICK 滴答定时器(寄存器、标准库、HAL库)

    目录 0. 博主理解: 1. 实验内容及步骤: 2. 硬件说明 3. 寄存器说明 3.1 SysTick的时钟和使能: 3.2 SysTick重装载数值寄存器: 3.3 SysTick的中断优先级: ...

  2. STM32 SysTick 滴答定时器原理及应用

    SysTick滴答定时器 一.功能 SysTick定时器是一个简单的定时器,CM3\CM4内核芯片都具备此定时器.SysTick定时器常用来做延时,采用实时系统时则用来做系统时钟. 无论用作延时还是用 ...

  3. Systick滴答定时器解析

    Systick滴答定时器 Systick定时器是什么 Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器. Systick定时器常用来做延时,或者时系统的心 ...

  4. 滴答定时器的计数模式_Cortex-M4 Systick滴答定时器

    Tickclock可以实现精确延时,在K60的datasheet中没有详细将,现在我把我找到资料分享一下,关于systick在Cortex-M4中有讲到我们大家平常在单片机开发中经常会使用到延时函数, ...

  5. Systick滴答定时器寄存器、delay()延时函数、SysTick_Config函数

    SysTick定时器 SysTick定时器,是一个简单的定时器,对于CM3.CM4内核的芯片都有SysTick定时器.SysTick 是一个 24 位的倒计数定时器,当计数到 0 时,将从RELOAD ...

  6. Systick滴答定时器讲解

    Systick定时器基础知识讲解: Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有- Systick定时器. Systick定时器常用来做延时,或者实时系统的心跳时钟.这样 ...

  7. STM32F103五分钟入门系列(八)SysTick滴答定时器+SysTick中断实现跑马灯

    学习板:STM32F103ZET6 往期博客: STM32F103五分钟入门系列(一)跑马灯(库函数+寄存器)+加编程模板+GPIO总结 STM32F103五分钟入门系列(二)GPIO的七大寄存器+G ...

  8. Systick滴答定时器

  9. FreeRTOS实时操作系统(七)时间片调度及RTOS的滴答定时器

    系列文章目录 FreeRTOS实时操作系统(一)RTOS的基本概念 FreeRTOS实时操作系统(二)任务创建与任务删除(HAL库) FreeRTOS实时操作系统(三)任务挂起与恢复 FreeRTOS ...

最新文章

  1. BK资本管理公司创始人阐述BCH接下来的三种“催化剂”
  2. 华北赛区,我们来啦!
  3. Float浮点数的使用和条件
  4. 操作系统(Linux与Windows)的进程管理
  5. Ubuntu中root用户和user用户的相互切换
  6. 计算机应用基础word说课,全国“XX杯”说课大赛计算机应用基础类优秀作品:Word图文混排教案.doc...
  7. hbase 单机连接hadoop_Hadoop、Hbase单机环境安装
  8. tomcat加白名单_超详细的tomcat管理页面各类型配置总结
  9. 【数据库】mysql常用的数据类型
  10. activiti5第二弹----使用activiti5提供的测试类进行测试
  11. 5种全局ID生成方式、优缺点及改进方案
  12. LeetCode(811)——子域名访问计数(JavaScript)
  13. day7--pandas
  14. iSCSI客户端登陆认证失败
  15. NCCL配置多卡运行
  16. 史上最全的大数据开发八股文【自己的吐血总结】
  17. Word控件Spire.Doc 【图像形状】教程(4) 用 C# 中的文本替换 Word 中的图像
  18. 【PCB软件技巧】OrCAD与PADS相互搭配使用的相关要点
  19. 如何理解混淆矩阵,以及预测少数类的评估指标?
  20. 77、自动喷水灭火系统的巡查内容

热门文章

  1. IT技术岗的面试技巧分享
  2. html table cellspacing css,table的cellpadding=0,cellspacing=0属性CSS定义
  3. [npm]安装n模块报错notsup Unsupported platform
  4. 从12个球中找出唯一一个质量不同的球,并说明轻重
  5. 电脑(win10)连接小爱同学音箱
  6. 清风数学建模学习笔记——应用matlab实现分段三次埃尔米特(Hermite)插值与三次样条插值
  7. 如何使输入框input只能输入数字
  8. 【C++编程题】斯诺克台球
  9. 什么叫序数_什么是基数?什么是序数?
  10. 解决linux根目录磁盘空间不足问题