8. STM32——系统定时器SysTick_ZCY(Yinyuer1)的博客-程序员宅基地

技术标签: stm32  STM32  

SysTick 配置库函数

固件库函数 在 core_cm3.h 中

在这里插入图片描述

// 这个 固件库函数 在 core_cm3.h 中
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
    
	// reload 寄存器为 24bit,最大值为 2^24
	if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);
	
	// 配置 reload 寄存器的初始值
	SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
	
	// 配置中断优先级为 1<<4 -1 = 15,优先级为最低
	NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
	
	// 配置 counter 计数器的值
	SysTick->VAL = 0;

	// 配置 systick 的时钟为 72M
	// 使能中断
	// 使能 systick
	SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
	SysTick_CTRL_TICKINT_Msk |
	SysTick_CTRL_ENABLE_Msk;
	return (0);
}

SysTick 中断时间的计算

SysTick 定时器的计数器是向下递减计数的,计数一次的时间 TDEC=1/CLKAHB,当重装
载 寄 存 器 中 的 值 VALUELOAD 减 到 0 的 时 候 , 产 生 中 断 , 可 知 中 断 一 次 的 时 间
TINT=VALUELOAD * TDEC= VALUELOAD/CLKAHB ,其中 CLKAHB =72MHZ 。 如果设置
VALUELOAD为 72,那中断一次的时间 TINT=72/72M=1us。不过 1us 的中断没啥意义,整个
程序的重心都花在进出中断上了,根本没有时间处理其他的任务。

SysTick_Config(SystemCoreClock / 100000))

SysTick_Config()的形我们配置为 SystemCoreClock / 100000=72M/100000=720,从
刚刚分析我们知道这个形参的值最终是写到重装载寄存器 LOAD 中的,从而可知我们现在
把 SysTick 定时器中断一次的时间 TINT=720/72M=10us。

定时编程

我们知道,systick 的 counter 从 reload
值往下递减到 0 的时候,CTRL 寄存器的位 16: countflag 会置 1,且读取该位的值可清 0,
所以我们可以使用软件查询的方法来实现延时。

在这里插入图片描述

在这里插入图片描述

通俗来讲

计数器的值从72000 开始减 减到0就是代表计数1s 完成,然后我们需要去判断一下这个计数器有没有减到0,我们需要去判断 ctrl 寄存器,如果减到0 那就跳出while这个循环

没有就卡在里面 ,等到计数器减到0

因为减到0,16位置一 while 循环结束

systick 毫秒级(ms)延时

void delay_ms(uint32_t ms)
{
    
	uint32_t i;
	
	SysTick_Config(72000);
	
	for(i=0;i<ms;i++)
	{
    
		// 当计数器的值减小到 0 的时候,CRTL 寄存器的位 16 会置 1
		// 当置 1 时,读取该位会清 0
		while( !(SysTick->CTRL & (1<<16)) ) //不断判断SysTick->CTRL寄存器第16位是否置1,是则卡死,while 循环结束
	}
	SysTick->CTRL &=~ ysTick_CTRL_ENABLE_Msk; //关闭 SysTick 定时器
}

systick 微秒级延时

void delay_ms(uint32_t us)
{
    
	uint32_t i;
	
	SysTick_Config(72);
	
	for(i=0;i<us;i++)
	{
    
		// 当计数器的值减小到 0 的时候,CRTL 寄存器的位 16 会置 1
		// 当置 1 时,读取该位会清 0
		while( !(SysTick->CTRL & (1<<16)) )
	}
	SysTick->CTRL &=~ ysTick_CTRL_ENABLE_Msk;
}

代码整合

SysTick.c

#include "SysTick.h"
#include "stm32f10x.h"

void delay_ms(uint32_t ms)
{
    
		uint32_t i;
		
		SysTick_Config(72000);
		
		for(i=0;i<ms;i++)
		{
    
				while( !(SysTick->CTRL & (1<<16)) );
		}
		
		SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;
}

void delay_us(uint32_t us)
{
    
		uint32_t i;
		
		SysTick_Config(72);
		
		for(i=0;i<us;i++)
		{
    
				while( !(SysTick->CTRL & (1<<16)) );
		}
		
		SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;
}

SysTick.h

#include "stm32f10x.h"

void delay_ms(uint32_t ms);
void delay_us(uint32_t us);

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_46105931/article/details/120428370

智能推荐

java基本类型和包装器类【转】_call_from_dream的博客-程序员宅基地

简要讲述java基本类型和包装类型,为装箱和拆箱的学习做准备

android word解析,Android中解析读取复杂word,excel,ppt等的方法_weixin_39534002的博客-程序员宅基地

【实例简介】Android里通过POI包将word,excel等转换为html代码进行展示【实例截图】【核心代码】read└── readPOI├── AndroidManifest.xml├── assets│ └── example.docx├── bin│ ├── AndroidManifest.xml│ ├── classes│ │ └── com│ │ ...

Java maven学习笔记_凌空暗羽的博客-程序员宅基地_java maven学习

maven学习笔记1.引言2.什么是maven?3.maven环境配置4.maven项目创建与运行5.maven的附加概念介绍5.1maven仓库的种类5.2项目开发版本简称5.3maven 项目打包6maven项目的多模块开发参考文献1.引言    莫名其妙的自己就学上了全栈开发,其实说真的,自己也是有点小纠结的。害怕自己学多了多而不精,毕竟自己有点爱玩,学东西有些浮躁。以前学前端学到一般发现自己没有接口,后来学了那“传说中最美的语言——php”并且学习了相关的thinkPHP框架。但是随着php逐渐

中小企业如何实现ITIL_weixin_34162629的博客-程序员宅基地

什么是ITIL?ITIL(信息技术基础设施库)是Information Technology Infrastructure Library的缩写。ITIL是英国政府中央计算机与电信管理中心(CCTA)在20世纪90年代初期发布的一套IT服务管理最佳实践指南,旨在解决IT服务质量不佳的情况。在此之后,CCTA又在HP、IBM、BMC、CA、Peregr...

fufu笔记之多线程_一只java小白白的奋斗史的博客-程序员宅基地

1.多线程概述进程:App,一个类文件线程:App的功能,类里的一个方法2线程的核心概念线程就是独立的执行路径在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc线程;main()称之为主线程,为系统的入口用于执行整个程序在一个进程中,如果开辟了多个线程,线程的运行由调度器安排带调度,调度器是与操作系统紧密相关的,先后顺序是不能人为干预的对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制线程会带来额外的开销,如cpu调度时间,并发控制开销每个线程在自己的工作

Oracle数据库的备份与规复_weixin_30257433的博客-程序员宅基地

滥觞:网海拾贝 ---- 当我们运用一个数据库时,总渴望数据库的内容是牢靠的、切确的,但因为计较机零碎的偏差(包孕呆板偏差、介质偏差、误使用等),数据库无意也可以遭到破损,这时怎样尽快规单数据就成为燃眉之急。假如往常对数据库做了备份,那么此时规单数据就显得很轻易。由此可见,做好数据库的备份是何等的重要,下面笔者就以ORACLE7为例,来讲演一下数据库的备份和规复。OR...

随便推点

tensorflow生成deeplab v3+的tfrecord的时候报错:Failed to find all Cityscapes modules_古月光军001的博客-程序员宅基地

在网上照着大神的博客用CityScapes的数据集训练deeplab V3+的时候,一步一步照着别人的方法弄,弄到生成tfrecord的时候突然报错:Failed to find all Cityscapes modules。这个错误是从csHelpers.py里面报出来的就是因为from annotation import Annotation这个语句出错,才报的Failed to fi...

rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1179) [_csding11的博客-程序员宅基地

想把hadoop102机器上的环境变量分发给hadoop103和hadoop104,xsync /etc/profile.d/my_env.sh,这里的xsync是自己的分发脚本#!/bin/bash#1. 判断参数个数if [ $# -lt 1 ]then echo Not Enough Arguement! exit;fi#2. 遍历集群所有机器for host in hadoop102 hadoop103 hadoop104do echo =========== $host

mooc网站html CSS,HTML和CSS基础_悟无误的博客-程序员宅基地

课程概况HTML и CSS — языки, с помощью которых верстают страницы в интернете. Овладеть основами этих языков совсем нетрудно — это первый шаг к профессии веб-разработчика.Вначале вы узнаете, как работать со...

数据分析中的统计学基础知识_宋懵懵的数据生活的博客-程序员宅基地_数据分析统计知识

统计学在我们生活中其实运用面还挺广的,比如社会调查的结果分析都会运用到统计学的知识。我们今天就来分享一下统计学的一些基础的知识。大致而言,统计学由“描述统计”和“推论统计”两部分构成。描述统计就是从取得的数据中抽取其特征的技术。推论统计是将统计学与概率理论相结合。对“无法整体把握的大的对象”或“还未发生而未来会发生的事情”进行推测。一、描述统计1、平均值平均值就是用数据的合计除以数据的个数平均数还可以通过以下公式求得平均数=组值×相对频数的合计2 、方差.

python爬虫 提取豆瓣Top250电影信息_FouforPast的博客-程序员宅基地

思路很简单,先将原网页爬取出来,然后用正则表达式和BeautifulSoup两种方法提取想要的信息,这里暂时先只爬取电影名、导演、评分和标语。import reimport csvimport requestsfrom bs4 import BeautifulSoupfrom urllib.parse import urlencoderoot = 'https://movie.douban.com/top250'para = {'start': 0, 'filter': ''}header

todolist_qq_21696621的博客-程序员宅基地

最基本的一个todolist,涉及基本的组件通信。效果如下:index.jsimport React from 'react';import ReactDOM from 'react-dom';import './index.css';import TodoList from './TodoList';import * as serviceWorker from './serviceWorker';ReactDOM.render( &lt;React.StrictMode&gt

推荐文章

热门文章

相关标签