第7课【SysTick定时器】中断 系统定时器 寄存器

2023-05-16

目录

  • 基本知识框架
  • 课堂笔记
    • SysTick定时器简介
      • 什么是SysTick定时器
      • SysTick定时器的作用
    • SysTick寄存器
      • CTRL控制及状态寄存器
      • LOAD重装载数值寄存器
      • VALUE当前数值寄存器
      • CALIB校准数值寄存器
    • SysTick实战
      • 需求
      • 硬件设计和软件设计
      • 要点
      • 函数实战
        • SysTick配置函数
        • SysTick的优先级设置
        • SysTick的初始化
        • 定时函数的实现
        • SysTick中断服务函数的实现
        • 总结SysTick定时器使用流程
      • 主函数实现
  • 基本知识框架Xmind文件下载

基本知识框架

在这里插入图片描述

课堂笔记

SysTick定时器简介

什么是SysTick定时器

SysTick:系统定时器,和普通定时器类似,它也可以定时,但是却是有特殊用途。它有24bits,定时器最大数值是2^24,并且计数时是向下递减计数,每次递减1,递减一次的时间是1/SYSCLK,一般来说SYSCLK为72MHz。当寄存器中的值减少到0时,会产生一个中断信号,进而执行相应的中断服务函数

SysTick定时器的作用

基于CM3内核的单片机,都会有SysTick定时器。这使得使用SysTick的软件都很容易移植。SysTick除了可以做正常的定时器使用以外,还有一个最重要的特殊作用:给操作系统提供时基,为操作系统提供必要的时钟节拍,从而为操作系统的任务调度提供一个稳定的心跳

SysTick寄存器

与SysTick相关的寄存器有4个:

  • CTRL控制及状态寄存器
  • LOAD重装载数值寄存器
  • VALUE当前数值寄存器
  • CALIB校准数值寄存器

但是一般使用情况下,只使用到前三个寄存器。最后一个校准数值寄存器不经常使用

CTRL控制及状态寄存器

在这里插入图片描述

LOAD重装载数值寄存器

在这里插入图片描述

VALUE当前数值寄存器

在这里插入图片描述

CALIB校准数值寄存器

在这里插入图片描述

SysTick实战

需求

使用SysTick产生1s的定时,并设计程序让LED每1s闪烁一次

硬件设计和软件设计

硬件上只需要LED以及自带的SysTick定时器

软件需要依赖于标准库函数中的core_m3.c和core_m3.h,这两个文件中有用于设置SysTick的函数。
同时需要建立两个文件bsp_systick.c和bsp_systick.h,用于编写函数

要点

使用SysTick定时器的简要流程:

  1. 设置RELOAD重载数值寄存器
  2. 设置VALUE当前数值寄存器
  3. 设置CTRL控制及状态寄存器

函数实战

SysTick配置函数

库文件 core_cm3.h 中的SysTick配置库函数代码主体部分

__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
	// 判断ticks有没有超过定时器的2^24最大值
	if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
	{
		return (1UL);
	}

	// 设置重装载寄存器
	SysTick->LOAD = (uint32_t)(ticks - 1UL);

	// 设置中断优先级
	NVIC_Setriority(SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);
	
	// 设置当前数值寄存器
	SysTick->VAL = 0UL;

	// 设置SysTick定时器的时钟源为AHBCLK 72MHz
	// 使能SysTick定时器中断
	// 使能SysTick定时器
	SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
					SysTick_CTRL_TICKINT_Msk   |
					SysTick_CTRL_ENABLE_Msk;

	return (0UL);
}

SysTick的优先级设置

其中有一个用于设置优先级的函数NVIC_Setriority(),这个函数也是在core_m3.h中定义的
NVIC_Setriority()代码主体部分

__STATIC_INLINE void NVIC_SetPririty(IRQn_Type IRQn, uint32_t priority)
{
	if ((int32_t)IRQn < 0)
	{
		SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = 
		(uint8_t)((priority << (8 - __NVIC_PRIO_BITS)) & (uiny32_t)0xFFUL);
	}
	else
	{
		NVIC->IP[((uint32_t)(int32_t)IRQn)] = 
		(uint8_t)((priority << (8 - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
	}
}

函数解析
判断IRQn的大小,如果小于0,则此中断为系统中断,大于0,则此中断为外设中断。系统中断的优先级是由内核外设SCB的寄存器SHPRx(x=1~3)控制,而外设中断是由内核外设NVIC中的寄存器IPx控制


系统中断的优先级和外设中断的优先级比较
对于SysTick定时器,由于它是系统级的外设,那么在优先级设置方面会有特殊优待吗?
没有的
对于SysTick定时器产生的中断,它的优先级由内核外设SCB中的寄存器SHPRx控制,SHPRx是32位的寄存器,并且只能按字节进行访问,同时在STM32F103中只使用到寄存器单个字节的前4位,这就意味着SysTick定时器的中断优先级仅能设置为0~15,转换为二进制也就0000~1111
无论是系统中断还是外设中断,统一都是由NVIC进行管理,所以说,在进行优先级比较时,可以将寄存器SHPRx和寄存器IPRx中前四位进行比较,数值越小的中断优先级越高,也遵循之前讨论的优先级比较逻辑

SysTick的初始化

在了解完 SysTick_Config()函数之后,可以通过调用它来配置定时器达到想要的效果

但在此之前要了解SysTick时间的相关计算:
AHBCLK时钟频率为72MHz
SysTick定时器减1所用的时间Tsys = 1 / SYSCLK = 1 / 72 000 000 (s)
所以当重装载数值为720时,产生一次中断信号的时间就为720 * Tsys = 720 / 72 000 000 = 1 / 100 000 (s) = 10us

所以首先,要先给SysTick定时器,赋上重装载数值SystemCoreClock/100000,SystemCoreClock的值通过宏定义定义为72M,即72 000 000
代码实现如下

// SysTick定时器初始化
void SysTick_Init(void)
{
	if (SysTick_Config(SystemCoreClock/100000))
	{
		// ERROR
		while (1);
	}
}

定时函数的实现

编写定时函数,输入参数为定时的时间,只有指定时间过后,代码才会继续执行
代码实现如下

// 定时函数
void Delay_nTime_10us(__IO u32 nTime)
{
	if (nTime < 0)
	{
		return;
	}

	DelayTime = nTime; // DelayTime是一个全局变量,并且和SysTick中断服务函数相关联

	while (DelayTime > 0);
}

SysTick中断服务函数的实现

编写SysTick中断服务函数,用于联系SysTick中断信号和定时函数
代码实现如下

// 中断服务函数
void SysTick_Handler(void)
{
	DelayTime_Decrement(); // 用于计算中断产生次数的,每产生一次中断,DelayTime递减1
}
// DelayTime_Decrement()函数
void DelayTime_Decrement(void)
{
	if (DelayTime > 0)
	{
		DeylayTime--;
	}
}

总结SysTick定时器使用流程

  • 通过SysTick_Config()函数,配置产生中断的时间Tsys
  • 通过定时函数,输入参数nTime,使得代码在nTime * Tsys后执行
  • 通过中断服务函数中的DelayTime_Decrement函数,联系输入参数nTime和中断产生时间Tsys

最后通过调用Delay_nTime_10us()函数可以实现定时指定时间后执行代码,例如Delay_nTime_10us(100000)),那么100000* 10us (1s)后,代码会继续执行

主函数实现

main.c中的代码实现如下

int main (void)
{
	// 配置LED引脚
	LED_GPIO_Config();
	
	// SysTick定时器初始化
	SysTick_Init();

	// 业务代码
	while (1)
	{
		// 红绿蓝三色灯,间隔1s换颜色
		LED_RED;
		Delay_nTime_10us(100000));
		LED_GREEN;
		Delay_nTime_10us(100000));
		LED_BLUE;
		Delay_nTime_10us(100000));
	}
}

基本知识框架Xmind文件下载

链接:资源下载

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

第7课【SysTick定时器】中断 系统定时器 寄存器 的相关文章

  • 轻量级接口自动化测试工具

    相信所有公司在起步自动化的时候做的都是接口自动化 xff0c 为什么呢 xff1f 理由很简单 xff0c 接口自动化复用性强 xff0c 易维护 xff0c 他的产出效率要远远高于UI自动化 xff0c 想想如果你的公司有成百上千的接口
  • JAVA实现HTTPS协议POST请求JSON报文

    HTTPS和HTTP的区别 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息 HTTP协议以明文方式发送内容 xff0c 不提供任何方式的数据加密 xff0c 如果攻击者截取了Web浏览器和网站服务器之间的传输报文 x
  • Jmeter之JAVA Request的应用

    当我们使用Jmeter进行接口测试的时候 xff0c 我们一定会遇到一个问题 xff0c 那就是如果这些接口不是http协议的 xff0c 是经过封装以后的接口 xff0c 用Jmeter该怎么解决呢 xff1f 当你想到这个问题 xff0
  • FreeRTOS例程3-串口中断接收不定长的数据与二值信号量的使用

    FreeRTOS例程3 串口中断接收不定长的数据与二值信号量的使用 知乎 zhihu com
  • 使用airtest实现UI自动化之环境搭建

    1 xff0c 安装python python版本为3 7 1 2 xff0c 安装airtest xff0c pocoui模块 在安装时碰到的问题 xff1a 1 xff09 使用pip命令报错 xff0c 报SSL证书无法识别错误 解决
  • HTTP Digest Authentication在实际应用中的问题

    作者 xff1a 老王 Basic认证实际上是明文传递密码 xff0c 所以 RFC2617里定义了Digest认证以取代它 xff0c 其计算方法如下 xff1a 其中HA1计算方法为 xff1a 如果qop选项的值为auth xff0c
  • 1天精通Apipost--全网最全gRPC调试和智能Mock讲解!

    gRPC 接口调试 grpc 作为一个老程序员 xff0c 最近公司技术架构用到了gPRC xff0c 但国内很少有支持这个的工具 xff0c 大部分都只是支持http 由于我同时也是Apipost骨灰级用户 xff0c 于是就在他们官网的
  • CAN总线波特率的设定——以STM32为例

    波特率的设定 首先是几个名词的含义 xff0c CAN里面1个位的构成如下 注意采样点的位置在PBS1和PBS2的中间 根据这个位时序就可以计算波特率了 最小时间单位 xff08 Tq xff0c Time Quantum xff09 同步
  • 2021电赛备赛心路历程(含代码例程)

    作为一个电子学院学生 xff0c 大二暑假才开始自学单片机知识 xff08 还是因为报名了电赛而不得不去学 xff09 xff0c 深感愧疚 从今年7月至8 4的将近四周时间内哩哩啦啦学了一些基础模块 xff08 其中光是练习点灯和其他基础
  • 20201114-三轴云台storm32 BGC HAKRC调试+

    storm32 BGC HAKRC 2轴云台支持俯仰 xff08 抬头低头 xff09 以及横滚 xff1b 三轴多了一个航向 支持锁头模式 xff0c 拍摄更方便 可以控制俯仰通过接收机或者其他单独PWM通道 可以设置跟随模式或者锁定模式
  • KEIL5中头文件路劲包含问题

    方式1 xff1a 1 Keil中添加头文件相对路劲的方法 在c c 43 43 配置中添加路劲 xff0c 最终是将添加的绝对路径转化为相对路径 xff1b 注意 xff1a 相对路径的当前位置指 uvproj文件所在位置 在C C 43
  • php curl函数应用方法之模拟浏览器

    curl 是使用URL语法的传送文件工具 xff0c 支持FTP FTPS HTTP HTPPS SCP SFTP TFTP TELNET DICT FILE和LDAP curl 支持SSL证书 HTTP POST HTTP PUT FTP
  • WireShark基本抓包数据分析

    WireShark抓包数据分析 xff1a 1 TCP报文格式 源端口 目的端口 xff1a 16位长 标识出远端和本地的端口号 顺序号 xff1a 32位长 表明了发送的数据报的顺序 确认号 xff1a 32位长 希望收到的下一个数据报的
  • VScode下运行调试C++文件

    1 下载vscode 这个可以直接去官网下载 2 下载mingw64 下载mingw64就是下载C 43 43 的编译器g 43 43 和调试器gdb 这个也可以去官网下载 xff0c 下载安装完成后去配置环境变量 我将mingw64安装在
  • c++模板的优点和缺点

    作为C 43 43 语言的新组成部分 xff0c 模板引入了基于通用编程的概念 通用编程是一种无须考虑特定对象的描述和发展算法的方法 xff0c 因此它与具体数据结构无关 但在决定使用C 43 43 模板之前 xff0c 让我们分析一下使用
  • 基于导航网格的A星寻路(Navigation mesh)

    最近花了几个月的时间实现了导航网格寻路和导航网格自动生成 导航网格数据结构定义 由于数据之间有着层级关系 xff0c 所以采用XML进行定义 navmesh基本元素 xff1a 顶点 Verts 43 可走边 Edges 43 凸多边形 P
  • cmake 引入 动态库、静态库

    动态库 xff1a link directories PROJECT SOURCE DIR lib 添加动态连接库的路径 target link libraries project name lMNN 添加libMNN so 静态库 xff
  • 利用JSP内置对象Request和Application实现用户名密码登录注册进入首页显示

    学习目标 xff1a 实验名称 xff1a JSP内置对象目的 xff1a 掌握JSP页面的全部语法 能够编写基本的JSP网页 学习内容 xff1a 1 实验 地点 周三2单元 xff0c 10617综合一实验室 自带电脑 目的 掌握各种内
  • 【如何写CMake】一个解决方案,多个工程

    文章目录 代码参考 一个解决方案 xff0c 多个工程 xff0c 即多个exe dll lib等 代码 多加几个ADD EXECUTABLE即可 1 cmake verson xff0c 指定cmake版本 cmake minimum r
  • 指针、寄存器、位操作

    定义寄存器的绝对地址 xff0c 并转换为指针进行位操作 1 位操作示例一 define PERIPH BASE unsigned int 0x40000000 define APB2PERIPH BASE PERIPH BASE 43 0

随机推荐

  • 详解TCP连接的建立

    TCP首部格式 TCP报文段首部的前20个字节是固定的 xff0c 后面有4N字节是根据需要而增加的选项 xff0c 因此TCP报文段的最小长度为20字节 首部固定部分的各字段的意义如下 xff1a 1 源端口和目的端口 xff1a 加上I
  • printf打印函数的原理浅析

    printf的底层原理浅析 目录 printf的底层原理浅析前言函数变参格式解析一个简单的printf示例结语 补充 前言 最近在学习linux内核的时候用到了自定义实现的printf xff0c 学习了一下 xff0c 在此记录 xff0
  • 基于公开网站挖掘敏感信息的研究与分析- Fofa 搜索

    基于公开公开网站挖掘敏感信息的研究与分析 Fofa 搜索 一 引言 1 1项目概述 基于公开网站的敏感信息挖掘研究与分析 xff1a 针对目前网络安全整体的趋势我们从google等搜索引擎 Github等代码库 FOFA等空间搜索这三个方面
  • HTTP报文

    一 HTTP报文的结构 用于HTTP协议交互的信息 xff0c 称为HTTP报文 客户端的HTTP报文称为请求报文 xff0c 服务端的称为响应报文 HTTP报文结构如下图 xff1a 下面是请求报文的一个实例 xff1a 请求行 xff1
  • 用C++写一个UDP发送和接收程序

    发送程序Sender cpp include lt stdio h gt include lt string gt include lt iostream gt include lt winsock h gt using namespace
  • STM32自学笔记(五)串口通信

    xff08 想要深入理解就把前面的看下 xff0c 否则直接看使用总结即可 xff09 usart文件夹 usart 文件夹内包含了 usart c和usart h两个文件 这两个文件用于串口的初始化和中断接收 代码只针对了串口1 xff0
  • sockaddr_in详解

    struct sockaddr in short sin family Address family一般来说AF INET xff08 地址族 xff09 PF INET xff08 协议族 xff09 unsigned short sin
  • ubuntu下好用的TCP/UDP调试工具

    github官方链接 GitHub s kyo mNetAssist mNetAssist A UDP TCP Assistant 编译好的安装包 ubuntu下好用的TCP UDP调试工具 网络设备文档类资源 CSDN下载 1 解压dpk
  • Linux网络编程之connect函数分析

    在一个 CLIENT SERVER模型的网络应用中 xff0c 客户端的调用序列大致如下 xff1a socket gt connect gt recv send gt close 其中socket没有什么可疑问的 xff0c 主要是创建一
  • linux route 命令

    显示现在所有路由 route n root 64 Ubuntu route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10
  • 大量LAST_ACK 分析过程

    记录一下自己的思想过程 现象 在netstat的时候发现大量处于LAST ACK状态的TCP连接 xff0c 达到在ESTABLISHED状态的90 以上 root 64 ccsafe netstat ant fgrep 34 34 cut
  • const 与重载

    const到底是不是一个重载的参考对象 xff0c 请看下面的例子 class A public void f int i std cout lt lt 34 1 34 函数1 void f int i const std cout lt
  • 指向成员函数的指针

    指向成员函数的指针 取一个非静态成员函数的地址 xff0c 如果该函数是nonvirtual xff0c 则得到的结果是它在内存中真正的地址 然而这个值也不是完全的 xff0c 它也需要被绑定于某个class object的地址上 xff0
  • rviz 远程显示及控制移动机器人的导航

    环境 xff1a xff08 1 xff09 虚拟机本地端IP 192 168 10 30 xff08 虚拟机需要通过桥接的形式与PC本地机连接 xff0c PC 机IP 192 168 10 21 xff09 xff08 2 xff09
  • iptables - administration tools for packet filtering and NAT

    2 iptables administration tools for packet filtering and NAT Linux Iptables Manual Incoming Traffic V 43 43 PREROUTING 4
  • C++ 内部类、嵌套类

    1 嵌套类 nested class 一个类可以定义在另一个类的内部 xff0c 前者称为嵌套类 xff0c 嵌套类时一个独立的类 xff0c 和外层类基本没什么关系 它通过提供新的类型类作用域来避免名称混乱 嵌套类必须声明在类的内部 xf
  • SONY VAIO P VPCP118KJ索尼酷袋本 鸡肋上网本初体验

    随着消费者市场需求的不断多样化和个性化 xff0c 个人电脑厂家开始不断突破创新 xff0c 在产品线拼装出各种各样的个人电脑 xff0c 主打性能的游戏本 xff0c 主打便携轻薄本 xff0c 2009年的CES上索大法推出了一款与众不
  • 第2课【CMSIS和标准库开发】标准库 CMSIS 分层

    目录 基本知识框架课堂笔记CMSISCMSIS的分层关系和作用CMSIS层文件结构内核函数层文件外设函数访问层文件 标准库开发标准库开发 LED GPIO标准库开发 KEY GPIO标准库开发 位带操作位带位带位带别名区位带区和位带别名区的
  • 第4课【STM32的时钟】时钟 时钟源 内外部时钟 高低速时钟

    目录 基本知识框架课堂笔记时钟什么是时钟 xff1f 时钟有什么作用 时钟源HSE 外部高速时钟HSI 内部高速时钟LSE 外部低速时钟LSI 内部低速时钟PLL锁相环 主要时钟和其他时钟主要时钟其他时钟 配置系统时钟实验 基本知识框架Xm
  • 第7课【SysTick定时器】中断 系统定时器 寄存器

    目录 基本知识框架课堂笔记SysTick定时器简介什么是SysTick定时器SysTick定时器的作用 SysTick寄存器CTRL控制及状态寄存器LOAD重装载数值寄存器VALUE当前数值寄存器CALIB校准数值寄存器 SysTick实战