STM32F4无人机Systick滴答定时器
更多交流欢迎关注作者抖音号: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滴答定时器相关推荐
- [学习笔记]STM32F1 SYSTICK 滴答定时器(寄存器、标准库、HAL库)
目录 0. 博主理解: 1. 实验内容及步骤: 2. 硬件说明 3. 寄存器说明 3.1 SysTick的时钟和使能: 3.2 SysTick重装载数值寄存器: 3.3 SysTick的中断优先级: ...
- STM32 SysTick 滴答定时器原理及应用
SysTick滴答定时器 一.功能 SysTick定时器是一个简单的定时器,CM3\CM4内核芯片都具备此定时器.SysTick定时器常用来做延时,采用实时系统时则用来做系统时钟. 无论用作延时还是用 ...
- Systick滴答定时器解析
Systick滴答定时器 Systick定时器是什么 Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器. Systick定时器常用来做延时,或者时系统的心 ...
- 滴答定时器的计数模式_Cortex-M4 Systick滴答定时器
Tickclock可以实现精确延时,在K60的datasheet中没有详细将,现在我把我找到资料分享一下,关于systick在Cortex-M4中有讲到我们大家平常在单片机开发中经常会使用到延时函数, ...
- Systick滴答定时器寄存器、delay()延时函数、SysTick_Config函数
SysTick定时器 SysTick定时器,是一个简单的定时器,对于CM3.CM4内核的芯片都有SysTick定时器.SysTick 是一个 24 位的倒计数定时器,当计数到 0 时,将从RELOAD ...
- Systick滴答定时器讲解
Systick定时器基础知识讲解: Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有- Systick定时器. Systick定时器常用来做延时,或者实时系统的心跳时钟.这样 ...
- STM32F103五分钟入门系列(八)SysTick滴答定时器+SysTick中断实现跑马灯
学习板:STM32F103ZET6 往期博客: STM32F103五分钟入门系列(一)跑马灯(库函数+寄存器)+加编程模板+GPIO总结 STM32F103五分钟入门系列(二)GPIO的七大寄存器+G ...
- Systick滴答定时器
- FreeRTOS实时操作系统(七)时间片调度及RTOS的滴答定时器
系列文章目录 FreeRTOS实时操作系统(一)RTOS的基本概念 FreeRTOS实时操作系统(二)任务创建与任务删除(HAL库) FreeRTOS实时操作系统(三)任务挂起与恢复 FreeRTOS ...
最新文章
- BK资本管理公司创始人阐述BCH接下来的三种“催化剂”
- 华北赛区,我们来啦!
- Float浮点数的使用和条件
- 操作系统(Linux与Windows)的进程管理
- Ubuntu中root用户和user用户的相互切换
- 计算机应用基础word说课,全国“XX杯”说课大赛计算机应用基础类优秀作品:Word图文混排教案.doc...
- hbase 单机连接hadoop_Hadoop、Hbase单机环境安装
- tomcat加白名单_超详细的tomcat管理页面各类型配置总结
- 【数据库】mysql常用的数据类型
- activiti5第二弹----使用activiti5提供的测试类进行测试
- 5种全局ID生成方式、优缺点及改进方案
- LeetCode(811)——子域名访问计数(JavaScript)
- day7--pandas
- iSCSI客户端登陆认证失败
- NCCL配置多卡运行
- 史上最全的大数据开发八股文【自己的吐血总结】
- Word控件Spire.Doc 【图像形状】教程(4) 用 C# 中的文本替换 Word 中的图像
- 【PCB软件技巧】OrCAD与PADS相互搭配使用的相关要点
- 如何理解混淆矩阵,以及预测少数类的评估指标?
- 77、自动喷水灭火系统的巡查内容
热门文章
- IT技术岗的面试技巧分享
- html table cellspacing css,table的cellpadding=0,cellspacing=0属性CSS定义
- [npm]安装n模块报错notsup Unsupported platform
- 从12个球中找出唯一一个质量不同的球,并说明轻重
- 电脑(win10)连接小爱同学音箱
- 清风数学建模学习笔记——应用matlab实现分段三次埃尔米特(Hermite)插值与三次样条插值
- 如何使输入框input只能输入数字
- 【C++编程题】斯诺克台球
- 什么叫序数_什么是基数?什么是序数?
- 解决linux根目录磁盘空间不足问题