STM32MP157(实验九)——SysTick定时器us延时
文章目录
- 设计需求
- 一、基础知识
- 二、硬件设计
- STM32CubeIDE开发
- MX设置
- 代码设置
- 项目目录结构
- 运行结果
设计需求
这里假设需求为使用SysTick定时器,得到一个us级别的延时
一、基础知识
SysTick相信大家在STM32F103中已经学习了,这里我们再来学习一次。SysTick定时器(又名滴答定时器)是存在于内核的一个定时器,只要是ARM Cotex-M系列内核的MCU都包含这个定时器。使用内核的SysTick定时器来实现延时,可以不占用系统的定时器,节约资源。由于和MCU外设无关,因此可以在不同厂家Cortex-M内核之间移植。
前面使用通用定时器,实现一个us级别延时,这里再用SysTick实现一次。注意SysTick用于了HAL库的毫秒级延时函数HAL_Delay(),不建议日常使用SysTick去做其他用途,这里只作为演示。
SysTick定时器是一个24位递减定时器,即计数器可以从最大值2^24开始每个时钟周期减1,当减到0时,会触发一次中断,同时自动重载定时初值,开始新的一轮计数。而这个定时初值,则是我们可以设置的,就可以实现得到指定时间。如下图所示,y为定时器的初值,然后随着时间的增加,值逐渐减小,直至为0,再重新载入这个初始值,如此往复x1,x2,x3这些时间段就是我们需要的
我们设置M4工作在209MHz,即209000000Hz,意味着1秒内,会计数209000000次。那么1us则计数209次。这个209就是滴答计数器的初始值,将这个值写入滴答定时器,定时器在每个时钟周期减1,减到0,就刚好就是1us,再次载入往复,就能实现我们想要的值。
二、硬件设计
SysTick定时器不涉及硬件,这里只需要一个LED灯去展示延时效果
STM32CubeIDE开发
MX设置
代码设置
driver_led.h
#ifndef DRIVER_LED_H_
#define DRIVER_LED_H_
#include "main.h"
#include "stm32mp1xx_hal.h"#define LED_GREEN_ON() HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin,GPIO_PIN_RESET);
#define LED_GREEN_OFF() HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin,GPIO_PIN_SET);#define LED_YELLOW_ON() HAL_GPIO_WritePin(LED_YELLOW_GPIO_Port,LED_YELLOW_Pin,GPIO_PIN_RESET);
#define LED_YELLOW_OFF() HAL_GPIO_WritePin(LED_YELLOW_GPIO_Port,LED_YELLOW_Pin,GPIO_PIN_SET);#endif /* DRIVER_LED_H_ */
driver_systick_us.h
#ifndef DRIVER_SYSTICK_US_H_
#define DRIVER_SYSTICK_US_H_#include "main.h"
#include "stm32mp1xx_hal.h"extern void systick_delay_us(uint32_t t);
extern void SysTickInit(void);
#endif /* DRIVER_SYSTICK_US_H_ */
driver_systick_us.c
#include "driver_systick_us.h"static volatile uint32_t tickend=0;//设置中断标志//初始化SysTick,使其初始值为209,
//再设置SysTick定时器中断优先级,最后使能SysTick定时器中断
void SysTickInit(void){uint32_t init_t=0;init_t=SystemCoreClock/1000000;//1us计数的次数if(HAL_SYSTICK_Config(init_t)!=HAL_OK){Error_Handler();}//设置滴答定时器中断优先级,最高HAL_NVIC_SetPriority(SysTick_IRQn,0,0);//使能滴答定时器中断HAL_NVIC_EnableIRQ(SysTick_IRQn);
}
//为了不影响HAL_Delay函数,这里设置一个自己的中断函数
void SysTick_Handler(void){HAL_IncTick();OwnSysTick_Handler();
}
//延时函数
void systick_delay_us(uint32_t t){tickend=t;while(tickend!=0);
}
//中断服务函数
void OwnSysTick_Handler(void){if(tickend!=0){tickend--;}
}
main.c
项目目录结构
运行结果
开发板显示也没有问题
STM32MP157(实验九)——SysTick定时器us延时相关推荐
- STM32延时函数的四种方法:普通延时(2种)、SysTick 定时器延时(2种)
STM32延时函数的三种方法:普通延时.SysTick 定时器延时(1.中断方式:2.非中断方式) 单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us( )和毫秒级delay_ ...
- systick定时器 延时计时
可以直接看定时器二代 systick定时器是属于cortex M内核的外设,专门为RTOS的系统时钟节拍设计的.systick是cortex M内核自带的,因此和debug调试接口一样,与单片机型号和 ...
- 嵌入式开发(7)系统定时器(SysTick)之延时函数运用
目录 一.系统定时器 1. 简介 2.工作原理 3.频率的概念 二.库函数SysTick定时器操作 系统定时器配置 三.寄存器SysTick定时器操作 1.系统定时器的用途 2.寄存器 3.官方示例 ...
- 【STM32F103】嘀嗒定时器(Systick)_延时函数
STM32嘀嗒定时器--延时函数 一 系统Systick定时器 Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值.只要不把它 ...
- SysTick定时器的一个简单应用
SysTick即为系统定时器,又称嘀嗒定时器,是Cortex-M3内核的一个外设,集成在NVIC中.SysTick是一个24bit的向下递减的计数器,每计数一次的时间为1/SYSCLK(SYSCLK一 ...
- 填坑-关于SysTick定时器
目录 01.坑的由来 02.填坑 03.修改代码验证 04.总结 本文主要来填坑,更正之前文章的错误.也进一步加深了我对SysTick定时器的理解,希望对你有帮助. 01.坑的由来 在之前的推文中&l ...
- SysTick 定时器
11.1关于 SysTick 定时器 SysTick定时器(又名系统滴答定时器)是存在于Cortex-M3的一个定时器,只要是ARM Cotex-M系列内核的MCU都包含这个定时器.使用内核的SysT ...
- STM32使用内部时钟HSI作为系统时钟及配置Systick定时器
参考:https://blog.csdn.net/huangyangquan/article/details/78790443 https://www.cnblogs.com/dustinzhu/p/ ...
- 【STM32】SysTick定时器
00. 目录 文章目录 00. 目录 01. SysTick定时器概述 02. SysTick定时器寄存器描述 03. 相关函数实现 04. 延时函数实现 05. 应用示例 06. 附录 07. 声明 ...
- STM32学习及应用笔记一:SysTick定时器学习及应用
这几年一直使用STM32的MCU,对ARM内核的SysTick计时器也经常使用,但几乎没有仔细了解过.最近正好要在移植一个新的操作系统时接触到了这块,据比较深入的了解了一下. 1.SysTick ...
最新文章
- 安卓setclicklistener函数没有_金主脚本按键精灵安卓按键初体验—乱斗西游2自动签到...
- 【BLE MIDI】开发 BLE MIDI 硬件电子乐器设备需要遵循的相关规范 ( 资料收集 )
- 查看程序占用内存_电脑内存不足怎么办
- 《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法1
- Qt使用OpenCV读取图片练习
- 字符串的比较相关方法
- Android QA
- jqGrid数据列表和表单的列隐藏/显示
- jenkins安装与自动部署详细说明
- php基于新浪ip库获取城市,WordPress-利用新浪IP库获取评论用户所在城市信息!
- java long 1 000_Java-基本数据类型
- 浅谈实时语音质量监控系统
- VirtualLab基础实验教程-6.闪耀光栅
- win10系统迁移后系统重装_Win10如何把系统迁移到固态硬盘上?Win10系统迁移到SSD上教程...
- java里的哈希值。
- 如何把电脑加上公司的域
- PDF 文件格式 基本结构
- Java服务端接入苹果内购。实现票据二次校验、自动续期订阅
- 项目一——电子通讯录
- 【基础知识】~ 分频器
热门文章
- 编译错误: error ‘gets’ was not declared in this scope gets(s)
- Latex文档中 插入符号和编号
- python3下载远程代码并执行
- 【聚来宝】创业 兼职 教程 资料
- 计算机基础表格制作教学设计,word中表格制作教学设计精选
- 使用python print打印函数返回值多一个None的问题探究
- Cobaltstrike Socks 代理隧道
- 系统集成(IBMS)软件的功能
- 网站使用微软雅黑需要版权吗
- python访问陌生人qq空间_自己的QQ空间怎么不让陌生人进入—设置访问权限