第11章_瑞萨MCU零基础入门系列教程之SysTick
本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id=728461040949
配套资料获取:https://renesas-docs.100ask.net
瑞萨MCU零基础入门系列教程汇总: https://blog.csdn.net/qq_35181236/article/details/132779862
第11章 SysTick
本章目标
- 了解滴答定时器的概念
- 学会配置滴答定时器和扩展驱动应用
11.1 认识滴答定时器
SysTick定时器也被称为滴答定时器。在Cortex架构的处理器里,有一个24bit的向下计数定时器,它就是滴答定时器。它不是处理器之外的、跟GPIO等设备同等地位的设备,而是位于处理器内部的定时器。
对于Cortex-M33内核而言,它拥有2个滴答定时器:一个用于非安全系的滴答定时器,另一个用于安全系的滴答定时器。如果开发者不使用Cortex-M33的TrustZone的程序安全功能,那么只能使用一个非安全系的滴答定时器。
滴答定时器有4个寄存器用于控制和获取状态:
a) 控制和状态寄存器:SYST_CSR
b) 重载值寄存器:SYST_RVR
c) 当前计数值寄存器:SYST_CVR
d) 校验值寄存器:SYST_CALIB
使用滴答定时器就是对这几个寄存器进行配置让它按照指定的频率进行计数,本章会实现几个驱动函数为后续章节的外设驱动使用。
11.2 滴答定时器的配置
在配置滴答定时器前,首先应该要熟悉其工作机制,其工作机制有如下几条:
① 当使能了滴答定时器的计数后,滴答定时器将会从重载值向下计数到零,然后在下一个时钟周期从重载值寄存器读取重载值,在紧随的下一个时钟周期又开始向下计数。
② 如果给重载值寄存器RVR写入了一个‘0’,那么本次计数循环(也就是本次向下计数到0)后就会停止计数。
③ 当计数到0使,控制状态寄存器CSR的计数标志COUNTFLAG位会被置1.,当读取CSR寄存器时会将这一位清零。
④ 如果给当前计数值寄存器CVR写入一个值时,会更新CVR的值且会将COUNTFLAG清零;
⑤ 如果程序处于调试状态,当开发者暂停调试时,滴答定时器也会暂停计数;
可以看到,这几个机制中使用到的寄存器只有3个:CSR(Control and Status Register,控制和状态寄存器)、RVR(Reload Value Register,重载值寄存器)和CVR(Current Value Register,当前值寄存器)。接下来就着重认识下这3个寄存器,并且学会如何配置他们。
11.2.1 控制和状态寄存器SYST_CSR
控制状态寄存器各个位的描述如下图:
- Bit0-ENABLE:计数器使能位;0-不使能计数器;1-使能计数器;
- Bit1-TICKINT:滴答定时器中断请求位;0-计数到0不产生中断请求;1-产生中断请求;
- Bit2-CLKSOURCE:滴答定时器的时钟选择位;0-使用外部基准时钟;1-使用处理器时钟;
- Bit16-COUONTFLAG:滴答定时器技术标志位,当计数到0时置1,如果没有读取CSR的话将会一直为1;
CSR寄存器上电复位默认值是0x00000000,一般情况下,程序是需要滴答定时器产生中断请求来判定滴答定时器计数到0的,所以TICKINT通常被设置为1;而时钟源的选择,惯用的是选择处理器时钟。所以在初始化的时候,一般将CSR的值设置为0x07。
11.2.2 重载值寄存器SYST_RVR
重载值寄存器虽然是一个32bit的寄存器,但是鉴于滴答定时器的设计只有24位的计数值,因而此寄存器只有低24bit有效,高8bit保留,如下图所示:
所谓重载值,就是指滴答定时器计数到0时,又重新从这个值开始向下计数。例如程序中需要滴答定时器从100开始向下计数,那么这里就将RVR的低24bit设置为‘100-1’,也就是十六进制的0x63,二进制的0110 0011,那么RVR寄存器的值就是下图这样:
11.2.3 当前计数值寄存器SYST_CVR
当前计数值寄存器CVR也是低24bit有效,用来表示滴答定时器当前的计数值,如图所示:
无论程序给此寄存器写入什么值,都会将此寄存器清零,并且会将计数标志位COUNTFLAG清零。
11.2.4 滴答定时器的初始化配置
滴答定时器还有一个校准寄存器CALIB,它是只读寄存器,无需操作。从Cortex-M33的调试手册中其对滴答定时器的各个寄存器总结如下图:
那么开发者配置滴答定时器时,步骤如下:
① 选择抵达定时器的时钟源;
② 使能滴答定时器的中断请求;
③ 设置重载值;
④ 清零当前计数值;
⑤ 使能滴答定时器计数;
- 初始化滴答定时器
在Cortex内核源文件的core_cmXX.h,比如core_cm33.h定义滴答定时器的初始化函数,代码如下:
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk){return (1UL); /* Reload value impossible */}SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */SysTick->VAL = 0UL; /* Load the SysTick Counter Value */SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |SysTick_CTRL_TICKINT_Msk |SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */return (0UL); /* Function successful */
}
开发者只需要在自己的代码中调用此函数,传入一个指定的重载值即可,例如下面这个代码:
fsp_err_t SystickInit(void)
{/* 获取处理器时钟uwSysclk */uint32_t uwSysclk= R_BSP_SourceClockHzGet(FSP_PRIV_CLOCK_PLL);/* 技术周期为uwSysclk/1000 */if(SysTick_Config(uwSysclk/1000) != 0){return FSP_ERR_ASSERTION;}/* Return function status */return FSP_SUCCESS;
}
如上初始化滴答定时器后,它的计数时钟频率就是处理器的系统主频
在此频率下向下计数
个数后触发中断,也就是每秒钟触发1000次中断,换算公式如下:
假如
那么传入给SysTick_Config函数的值就是200K,滴答定时器就会以200MHz的频率从200K往0开始递减,递减为0时触发一次中断,中断触发频率就是
。
- 实现滴答定时器的中断服务函数
当滴答定时器计数到0时,会触发中断,中断服务函数SysTick_Handler被调用,这个函数需要开发者实现,比如给一个全局变量递增1,参考如下代码:
volatile uint32_t dwTick = 0;
void SysTick_Handler(void)
{dwTick += 1;
}
11.3 基于SysTick的扩展应用
本实验会用到板载LED外设和printf功能,请读者参考本书《第5章 GPIO输入输出》和《第7章 UART》来配置LED的GPIO和UART模块,并且移植drv_uart.c和drv_config.h到本节实验的工程“1101_systick_delay”中。
在上一小节已经初始化了滴答定时器、实现了中断服务函数。本节在此基础上实现一个ms级别的延时函数(因为初始化设置的滴答定时器是1KHz的中断触发频率)。参考如下代码:
#define HAL_MAX_DELAY 0xFFFFFFU
void HAL_Delay(uint32_t dwTime)
{uint32_t dwStart = dwTick;uint32_t dwWait = dwTime;/* Add a freq to guarantee minimum wait */if (dwWait < HAL_MAX_DELAY){dwWait += (uint32_t)(1);}while((dwTick - dwStart) < dwWait){}
}
- 第10行:在延时值基础上加1;
- 第13行:滴答定时器中断服务函数中的递增变量dwTick减去此延时函数调用时刻的dwStart,即滴答定时器触发“dwTick- dwStart”次后大于等于延时时长后才退出函数;
为什么dwWait要先加1?这是因为执行HAL_Delay函数时必定是在2次滴答定时器中断之间,距离下一次中断的时间必定小于1ms。比如传入的dwTime等于2时,实际延时的时间是大于1ms、小于2ms。第10行里让dwWait值加1,目的是使得延时能满足下限:“至少延时dwWait毫秒”。
还可以读取dwTick获取系统运行时间/时刻,例如以下代码:
uint32_t HAL_GetTick(void)
{return dwTick;
}
11.4 测试程序
本书测试滴答定时器的方法是:使用基于滴答定时器的延时函数来闪烁LED,并且打印延时前后的tick值。代码如下:
void SystickAppTest(void)
{uint8_t ucCount = 5;uint32_t dwLastTick = 0, dwCurtick = 0;bsp_io_level_t nLevel = false;while(ucCount--){dwLastTick = HAL_GetTick();HAL_Delay(1000);dwCurtick = HAL_GetTick();
11.5 上机实验
本实验将滴答定时器的驱动在hal_systick.c中实现,在hal_systick.h中声明;测试函数在app_systick.c中实现,在app.h中声明;最后在hal_entry.c中调用初始化函数和测试函数,代码如下:
#include "app.h"
#include "hal_systick.h"
#include "drv_uart.h"
#include "hal_data.h"void hal_entry(void)
{/* TODO: add your own code here */SystickInit();UARTDrvInit();SystickAppTest();
}
将程序编译出来的二进制可执行文件烧录到处理器中运行可以得到如下图的结果:
开发板上LED间隔1s改变状态。
相关文章:
第11章_瑞萨MCU零基础入门系列教程之SysTick
本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id728461040949 配套资料获取:https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总: ht…...
【面试题精讲】如何使用Stream的聚合功能
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 系列文章地址 求和(Sum): List<Integer> numbers Arrays.asList(1, 2, 3, 4, 5);int sum n…...
Linux 中的 chmod 命令及示例
在 Unix 操作系统中,chmod命令用于更改文件的访问模式。该名称是change mode的缩写。其中规定每个文件和目录都有一组权限来控制权限,例如谁可以读取、写入或执行该文件。其中权限分为三类:同时读、写和执行,用“r”、“w”和“x”表示。这些字母组合在一起形成一组用户的特…...
sannaing i14 pro max使用体验
体验了一把山寨机,不明真相的人会以为这是三星的英文标志,又是pro又是max的,价格600,进系统去看了配置,cpu写的是snapdragon 888,运存12g,内存500g。下了个安兔兔也是被忽悠了,它也以…...
Shazam音乐检索算法原理及实现
算法基本流程如下: 1. 采集音乐库 2. 音乐指纹采集 3. 采用局部最大值作为特征点 4. 将临近的特征点进行组合形成特征点对 5. 对每个特征点对进行hash编码 编码过程:将f1和f2进行10bit量化,其余bit用来存储时间偏移合集形成32bit的hash码 …...
vue递归组件
父组件: <template><div><treeVue :treeData"treeData"></treeVue></div> </template><script setup lang"ts"> import { reactive } from "vue"; import treeVue from "./tree.vue…...
软件测试/测试开发丨测试用例自动录入 学习笔记
点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/27139 测试用例自动录入 测试用例自动录入的价值 省略人工同步的步骤,节省时间 兼容代码版本的自动化测试用例 用例的执行与调度统一化管理…...
来学Python啦,大话字符串
To be a happy man, reading, travel, hard work, care for the body and mind。做一个幸福的人,读书,旅行,努力工作,关心身体和心境。 前面我们讲解过关于用Python写温度转换器&…...
pyqt5设置背景图片
PyQt5设置背景图片 1、打开QTDesigner 创建一个UI,camera.ui。 2、创建一个pictures.qrc文件 在ui文件同级目录下先创建一个pictures.txt,填写内容: <RCC><qresource prefix"media"><file>1.jpg</file>…...
C# WPF 自己写的一个模拟病毒传播的程序,有可视化
源代码: https://github.com/t39q/VirusSpread 主要代码 using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks;namespace VirusSpread.Bu…...
stable diffusion实践操作-大模型介绍-SDXL1大模型
系列文章目录 大家移步下面链接中,里面详细介绍了stable diffusion的原理,操作等(本文只是下面系列文章的一个写作模板)。 stable diffusion实践操作 提示:写完文章后,目录可以自动生成,如何生…...
软考高级系统架构设计师系列案例考点专题四:嵌入式系统
软考高级系统架构设计师系列案例考点专题四:嵌入式系统 一、相关概念二、软件可靠性和硬件可靠性的区别三、可靠性指标四、可靠性设计五、冗余技术六、软件容错七、双机容错技术八、集群技术九、负载均衡十、可维护性的评价指标十一、软件维护的分类嵌入式每年必考一题,但是属…...
Django Form实现表单使用及应用场景
首先需要定义一个使用场景: 音乐网站的前端部分可以添加上传歌手的单曲, 这个添加页面就使用django form表单来实现。 目录 数据表内容 歌手表及表模型 单曲表及表模型 演示表单使用 设置路由 创建form.py 视图实例化表单类 模板使用表单对象 表…...
golang面试题:json包变量不加tag会怎么样?
问题 json包里使用的时候,结构体里的变量不加tag能不能正常转成json里的字段? 怎么答 如果变量首字母小写,则为private。无论如何不能转,因为取不到反射信息。如果变量首字母大写,则为public。 不加tag,…...
国内项目管理中级证书CSPM-3正在报名!
CSPM-3中级项目管理专业人员认证,是中国标准化协会(全国项目管理标准化技术委员会秘书处),面向社会开展项目管理专业人员能力的等级证书。旨在构建多层次从业人员培养培训体系,建立健全人才职业能力评价和激励机制的要…...
vue表格不显示列号123456
我在网上找了半天,都是如何添加列号123456的,没有找到不显示列号的参考,现在把这个解决了,特此记录一下。 没有加右边的就会显示,加上右边的就隐藏了...
【大数据】Kafka 入门指南
Kafka 入门指南 1.Kafka 简介2.Kafka 架构3.分区与副本4.偏移量5.消费者组6.总结 1.Kafka 简介 Apache Kafka 是一种高吞吐、分布式的流处理平台,由 LinkedIn 开发并于 2011 年开源。它具有 高伸缩性、高可靠性 和 低延迟 等特点,因此在大型数据处理场景…...
Qt 5.15集成Crypto++ 8.8.0(MSVC 2019)笔记
一、背景 笔者已介绍过在Qt 5.15.x中使用MinGW(8.10版本)编译并集成Crypto 8.8.0。 但是该编译出来的库(.a和.dll)不适用MSVC(2019版本)构建环境,需要重新编译(.lib或和.dll…...
前端面试的话术集锦第 9 篇:高频考点(webpack性能优化)
这是记录前端面试的话术集锦第九篇博文——高频考点(webpack性能优化),我会不断更新该博文。❗❗❗ 在此章节中,我不会浪费篇幅给大家讲如何写配置文件。如果你想学习这方面的内容,那么完全可以去官网学习。在这部分的内容中,我们会聚焦于以下两个知识点,并且每一个知识…...
程序员,你真热爱编程吗?
程序员的热爱与演变 我发现,程序员这个行业不像其他行业那样,很多人是因为热爱编程才去做程序员,不会被逼无奈去做程序员(要是真有就太惨了)。 热爱编程的漫长过程 热爱过、⼜不爱了、⼜爱了,这是个过程…...
算法通关村-----海量数据的处理方法
从40亿中产生一个不存在的数 问题描述 给定一个文件,包含40亿个非负整数,请你设计一个算法,产生一个不在该文件中的数字。假设你只有1GB内存。 问题分析 40亿整数,在java中,用int存储的话,大概需要40亿✖️4B,大约…...
Pytorch 多卡并行(1)—— 原理简介和 DDP 并行实践
近年来,深度学习模型的规模越来越大,需要处理的数据也越来越多,单卡训练的显存空间和计算效率都越来越难以满足需求。因此,多卡并行训练成为了一个必要的解决方案本文主要介绍使用 Pytorch 的 DistributedDataParallel(…...
快速排序(重点)
前言 快排是一种比较重要的排序算法,他的思想有时候会作用到个别算法提上,公司招聘的笔试上有时候也有他的过程推导题,所以搞懂快排势在必行!!! 快速排序 基本思想: 根据基准,将数…...
python高级内置函数介绍及应用举例
目录 1. 概述2. 举例 1. 概述 Python中有许多高级内置函数,它们提供了丰富的功能和便利性,可以大大简化代码并提高效率。以下是一些常用的高级内置函数: map(): 用于将一个函数应用于一个可迭代对象的所有项,返回一…...
人体呼吸存在传感器成品,毫米波雷达探测感知技术,引领智能家居新潮流
随着科技的不断进步和人们生活质量的提高,智能化家居逐渐成为一种时尚和生活方式。 人体存在传感器作为智能家居中的重要组成部分,能够实时监测环境中人体是否存在,为智能家居系统提供更加精准的控制和联动。 在这个充满创新的时代…...
软件设计模式(三):责任链模式
前言 前面荔枝梳理了有关单例模式、策略模式的相关知识,这篇文章荔枝将沿用之前的写法根据示例demo来体会这种责任链设计模式,希望对有需要的小伙伴有帮助吧哈哈哈哈哈哈~~~ 文章目录 前言 责任链模式 1 简单场景 2 责任链模式理解 3 Java下servl…...
开发者的商业智慧:产品立项策划你知道多少?
文章目录 想法的萌芽🌟初步评估产品可行性🍊分析核心功能和特点以及竞争对手📝大健康监测📝时尚新科技产品📝准确性📝多功能📝品牌口碑📝数据分析与个性化建议📝社交互动…...
Linux 6.6 初步支持AMD 新一代 Zen 5 处理器
AMD 下一代 Zen 5 CPU 现已开始为 Linux 6.6 支持提交相关代码,最新补丁包括提供温度监控和 EDAC 报告等。 最新的 Linux 6.6 代码中已经加入了包括支持硬件监视器温度监控和 EDAC 报告的补丁。此外,新版本还加入了 x86 / misc 补丁,Phoronix…...
第五章 Linux常用应用软件
第五章 Linux常用应用软件 Ubuntu包含了日常所需的常用程序,集成了跨平台的办公套件LibreOffice和Mozila Firefox浏览器等。还提供了文本处理工具、图片处理工具等。 1.LibreOffice LibreOffice免费开源,遵照GPL分发源代码,与OpenOf…...
连接云-边-端,构建火山引擎边缘云网技术体系
近日,火山引擎边缘云网络产品研发负责人韩伟在LiveVideoStack Con 2023上海站围绕边缘云海量分布式节点和上百T的网络规模,结合边缘云快速发展期间遇到的各种问题和挑战,分享了火山引擎边缘云网的全球基础设施,融合开放的云网技术…...
邵阳网站建设公司/营销型企业网站的功能
ListIterator由JDK1.2开始添加,继承自Iterator。ListIterator是列表的迭代器,允许在任一方向上遍历列表,在迭代期间修改列表,并获取迭代器在列表中的当前位置。 接口中的方法: boolean hasNext();如果在正向遍历时&am…...
网站建设的功能定位/怎么从网上找客户
在LotusScript程序中如何计算程序所用的时间? 环境 产品: Lotus Domino Designer平台: Windows / PC软件: 5.x , 6.x 问题 在程序设计过程中,特别是在调试性能的时候,有时候需要计算某些操作所使用的时间,如何得到程序消耗的时间呢? 解答 可以通过NotesDateTime的TimeDiffer…...
网站免费云主机/网站推广的方法有哪些?
本博客已搬家 地址:www.czhphp.com 所有更新都会在新博客进行 谢谢大家的支持! (一). Asp.net Ajax框架教程http://blog.csdn.net/ChengKing/archive/2008/01/09/2032497.aspx(二).Silverlight入门教程(基于Asp.net运行环境示例)http://blog.csdn.net/C…...
网店代运营的公司有哪些/百度搜索怎么优化
Fiksu是一家帮助移动开发者有效找寻新用户的公司,公司总部位于波士顿。该公司刚刚获得了新一轮由高通风险投资公司领投的1000万美元融资。 “对于我们来说,高通公司可以提供强大的战略帮助。”Fiksu公司业务发展副总裁Craig Palli说,“高通和…...
国外电商网站如何建立/站长seo软件
我正在尝试使用python构建一个简单的加密。在这是加密:from Crypto.Cipher import AESfrom Crypto.Util.Padding import padfrom Crypto.Util.Padding import unpadBLOCK_SIZE 32def encrypt(message):obj AES.new(bThis is a key123, AES.MODE_CBC, bThis is an …...
wordpress更新之后字体发生变化/杭州seo关键字优化
如何截取视频片段,只截取视频中间的一部分.我们从网上下载了一些视频,想要进行编辑,剪切之类的,往往会在选择软件上眼花缭乱。现在市面上有很多视频编辑的软件,有共享的,免费的,po解版的&#x…...