STM32学习笔记 -系统时钟Systick

2023-11-04

一、SysTick系统时钟滴答定时器的相关概念。

1.SysTick的两大作用。

1.1 可以产生精确延时。(节省定时器)

1.2 可以提供给操作系统一个单独的心跳(时钟)节拍。(主要!)

2.SysTick的定义。

systick定时器是 24位 的,永不停息 的, 递减计数器
(2^24 =16M ,永不停息是指:只要不清除 systick 控制及状态寄存器中的 使能位 ,systick定时器永不停息,睡眠模式下也工作.)

3.SysTick运行机制。

运行机制:
SysTick设定处置并使能后,每经过一个系统时钟周期,计数值就减1.计数到0时,SysTick计数器自动重装初值并继续计数,同时内部的COUNTFLAG标志会置位,若中断使能就会触发中断。

系统时钟周期:外部晶振为8MHz,9倍频,系统时钟为72MHz,SysTick的最高频率为9MHz(最大为HCLK/8)。
SysTick时钟设置为最大值9MHz(9 000 000),
把SysTick计数值设置为9000,就能够产生1ms的时间基值,即SysTick产生1ms的计数。
把SysTick计数值设置为9,就能够产生1us的时间基值,即SysTick产生1ms的计数.
在这里插入图片描述
选择外部时钟时:滴答定时器时钟为9M (意味着 一个us ,值减少9)
要延时1us, 往val装9就可以了

4.SysTick相关寄存器。

下表中的四个寄存器管理了SysTick的运行。
在这里插入图片描述

SysTick 重装载数值寄存器->LOAD。(24bit)

这个寄存器是用来装载我们需计数的次数的寄存器。(它给VAL寄存器装作数值)
在这里插入图片描述

SysTick 当前值寄存器->VAL。(24bit)

每一个时钟周期,VAL的值自减1。
当VAL值为0时,会重新加载LOAD中的值,并且产生COUNTFLAG标志。(COUNTFLA标志在CTRL寄存器)
在这里插入图片描述

SysTick控制和状态寄存器->CTRL。

下表解释的十分详细。
在这里插入图片描述
第0位 是定时器使能位。
第1位 是中断使能位,用于决定自减为0后是否执行中断。
第2位 是时钟源选择位 ,可以选择内部时钟外部时钟作为时钟源。
第16位是计数标志位 ,SysTick自减到0时,该位置1。读取该位后,该位自动清零。
注意点:
COUNTFLAG为计数完毕标志,读取后会自动清零
TICKINT产生SysTick异常请求意思是产生中断。

SysTick->CALIB。(略)

用来校准计数器的,不常用。

二、Systick初始化。

1.思路:

先失能,关闭中断,再装载值,最后再开启。(固件库的直接调用配置函数SysTick_Config()即可)

2.库函数版代码

3.5固件库版本中库函数与中文手册的有所差异。
配置代码

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
SysTick_Config(72);

使用到的库函数

void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
static __INLINE uint32_t SysTick_Config(uint32_t ticks)

SysTick_CLKSourceConfig():

功能:选择时钟源
操作:改变SysTick 控制和状态寄存器- CTRL 中 第2位段(0,1,2 即第三个位置)的值
入口参数:1 SysTick_CLKSource_HCLK 内部时钟 HCLK 72M
2 SysTick_CLKSource_HCLK_Div8 外部时钟 HCLK/8 9M
返回值:无

`void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
  /* Check the parameters */
  assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));

  if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
  {
    SysTick->CTRL |= SysTick_CLKSource_HCLK;
  }
  else
  {
    SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
  }
}

//SysTick_CLKSource_HCLK_Div8,SysTick_CLKSource_HCLK 的宏定义如下
//#define SysTick_CLKSource_HCLK_Div8    ((uint32_t)0xFFFFFFFB)
//#define SysTick_CLKSource_HCLK         ((uint32_t)0x00000004)
SysTick_Config():

功能:1、初始化systick 2、打开systick 3、打开systick的中断并设置优先级
操作:略
入口参数:Uint32_t ticks 即为重装值,
返回值:返回一个0代表成功或1代表失败

//此函数在core_cm3.h定义
//如果参数ticks是 72 的话,1us计数完毕,即1us置COUNTFLAG为1一次。
//如果参数ticks是 72000 的话,1ms计数完毕,即1ms置COUNTFLAG为1一次。
static __INLINE uint32_t SysTick_Config(uint32_t ticks)//static 表示只能在此头文件中实验
{ 
	//判断tick的值是否大于 2^24 ,如果大于,则不符合规则
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
   
   //配置 reload 寄存器的初始值
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
  
  	 //配置中断优先值,1<<4-1 = 15 v 配置为15,默认为最低的优先级
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
  
  //配置 counter 计数器的值
  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
  
//配置systick时钟为72M
//使能中断
//使能systick
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
                   SysTick_CTRL_TICKINT_Msk   | 
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                  /* Function successful */
}

3.寄存器版代码

void Systick_us_Config(u16 delay_us)
{
	SysTick->CTRL &= ~(0x3);//失能Systick,关闭Systick中断
	SysTick->CTRL &= ~(1<<2);//选择时钟,选用外部时钟,HCLK/8
	//systemClock*1000/8 = 9000000 = 9MHz;1s 9M,1us 9K
	SysTick->LOAD = 9000*delay_us;//装载值
	SysTick->VAL = 0x00;
	SysTick->CTRL |= 0x1;//使能Systick
}

void Systick_ms_Config(u16 delay_ms)
{
	SysTick->CTRL &= ~(0x3);//失能Systick,关闭Systick中断
	SysTick->CTRL &= ~(1<<2);//选择时钟,选用外部时钟,HCLK/8
	//systemClock*1000/8 = 9000000 = 9MHz;1s 9M,1us 9K
	SysTick->LOAD = 9000*delay_us;//装载值
	SysTick->VAL = 0x00;
	SysTick->CTRL |= 0x1;//使能Systick
}

三、Systick写延迟函数。

1. 回顾:通常实现延时函数的方法。

通常实现延迟函数的方法为:

void delay_ms(int x )
{
	int i;
	while(x--)
		for(i=0;i<x;i++);
}

x - - 对应于N毫秒的循环值。
缺陷:1占用cpu,浪费cpu资源.2中断会打断即时,易出错。

2.Systick定时器延时实现代码。

该代码还是占用了cpu资源。。。待续

//bsp_systick.h文件
#ifndef BSP_SYSTICK_H
#define BSP_SYSTICK_H

#include "stm32f10x.h"//stm32f10x.h定义了 core_cm3.h 中的IRQn_Type
#include "core_cm3.h"//systick在内核,stm32f10x.h是外设的库,core_cm3.h是定义内核中的外设


void SysTick_Delay_us(uint32_t us);
void SysTick_Delay_ms(uint32_t ms);

#endif
//bsp_systick.c文件
#include "bsp_systick.h"

void SysTick_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;
}

void SysTick_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;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32学习笔记 -系统时钟Systick 的相关文章

随机推荐

  • [计算机网络]HTTP、UDP、TCP协议

    个人主页 你帅你先说 欢迎点赞 关注 收藏 既选择了远方 便只顾风雨兼程 欢迎大家有问题随时私信我 版权 本文由 你帅你先说 原创 CSDN首发 侵权必究 为您导航 1 HTTP协议 1 1URL 1 2HTTP协议格式 1 2 1HTTP
  • 正则表达式与Regex函数

    影响使用正则表达式的因素 C语言中使用strstr或strcmp函数 需要确定字符串中含有此子串 进行字符串匹配 匹配效率较低 且两个函数均为绝对匹配 灵活性较差 正则表达式通过数据的规则 匹配提取数据 正则表达式的匹配方式 工作流程 正则
  • 【DL】第 9 章:新兴的神经网络设计

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • TypeScript基本类型的了解

    数据类型 number string boolean跟js类同 字面量 它就是值本身及值本身的类型 let a 10 a 10 a 125 a 123 any表示任何类型 可以任意赋值 一个变量赋值为any后相当于对该变量关闭了ts的类型检
  • 用cmake将源代码编译成可运行的工程项目

    网上下载的完整源代码 比如 深入理解OpenCV 实用计算机视觉项目解析 想要用来学习 首先得把源码编译到自己使用的平台上 比如我的是VS2010 一般源代码给出的是 C Source C C Header 文件 以及CmakeLists
  • JS之对象-对象增强语法(ES6)

    ES6对JS的对象提供一些封装的语法糖 用来简化某些操作 1 属性值简写 给对象添加变量时 同名属性可以简写 let name zhangsan let Obj name test lalala console log name zhang
  • AI时代带来的图片造假危机,该如何解决

    一 前言 当今 图片造假问题非常泛滥 已经成为现代社会中一个严峻的问题 随着AI技术不断的发展 人们可以轻松地通过图像编辑和AI智能生成来篡改和伪造图片 使其看起来真实而难以辨别 之前就看到过一对硕士夫妻为了骗保竟篡改结婚证 离婚证等信息
  • 常用的maven命令

    常用maven命令总结 mvn v 查看版本 mvn archetype create 创建 Maven 项目 mvn compile 编译源代码 mvn test compile 编译测试代码 mvn test 运行应用程序中的单元测试
  • C++ 自带Sort(快速排序)所需的头文件和操作方法

    需要的头文件 include
  • Promise实现串行执行

    第二种写法 const arr 1 2 3 4 5 6 arr reduce async prs cur idx gt const t await prs const time idx 0 0 1000 idx 1 500 return n
  • 脚本重启电信天翼网关

    背景 家里光猫经常断网 重启才能恢复 光猫位置拔电源不方便 telnet登录重启需破解有风险 因此采用curl模拟登录web重启 最后通过其他脚本监测 实现断网时自动执行重启 bin sh a 1 loginfo curl s L http
  • MySQL与Oracle主键冲突解决方式

    1 MySQL主键冲突 当主键冲突时 可以选择更新或替换 1 1 主键冲突 主键冲突 mysql gt desc my class Field Type Null Key
  • Windows子系统安装

    Windows子系统安装 1 Windows配置修改 1 开启开发者模式 在设置中找到更新与安全 选择开发者选项将开发者模式打开 2 开启子系统 打开控制面板选择程序 按图依次点击勾选适用于Linux的Windows子系统 然后进行重启电脑
  • 四叉树在MMO中的应用

    四叉树是一种树状数据结构 在每一个节点上会有四个子区块 四叉树常应用于二维空间数据的分析与分类 它将数据区分成为四个象限 数据范围可以是方形或矩形或其他任意形状 四叉树在游戏中常常用于减少遍历的次数 1 比如 地图上有N个怪 玩家砍了一刀
  • 【毕设选题】基于stm32的智能扫地机器人设计与实现

    文章目录 0 简介 1 课题背景 2 硬件系统总体框架 2 1 电机驱动 2 2 红外线传感器 2 3 超声波传感器 2 4 MPU6050 2 5 ATK ESP8266 WI FI 模块 2 6 电源管理模块 3 软件系统设计 3 1
  • Could not acquire change log lock. Currently locked by XXX

    Could not acquire change log lock Currently locked by XXX 在项目执行liquibase时 发现超过5分钟依然执行不完成 最后报错显示被被锁了 于是找公司的网络 结果被告知该ip不是公
  • 【RPA入门教程】数据抓取功能使用教学(一)

    UiBot 0 7 版新增加了 数据抓取 功能 这项功能可以方便获取网页中的相似元素 将相似元素的数据采集到数组中 比如各种电商网站 淘宝 京东 拼多多等 的商品分类 商品列表信息 商品名 价格等 或者网页中的各种列表 表格的数据 本期教学
  • 怎样入门嵌入式嵌入式未来的发展方向

    概述 很多工程师要往嵌入式方向发展 特别是ARM得到应用后 这个趋势更是有增无减 但你真的知道怎样入门嵌入式么 你知道嵌入式未来的发展方向么 怎样入门嵌入式嵌入式未来的发展方向 在很多学生或者初级工程师都关注嵌入式 尤其在ARM大红大紫以后
  • 用js写一个简单的定时器

  • STM32学习笔记 -系统时钟Systick

    文章目录 一 SysTick系统时钟滴答定时器的相关概念 1 SysTick的两大作用 1 1 可以产生精确延时 节省定时器 1 2 可以提供给操作系统一个单独的心跳 时钟 节拍 主要 2 SysTick的定义 3 SysTick运行机制