【致敬未来的攻城狮计划】— 连续打卡第十六天:FSP固件库系统定时器(滴答定时器SysTick)每2秒LED闪烁一次

news2025/1/11 11:59:50

系列文章目录

1.连续打卡第一天:提前对CPK_RA2E1是瑞萨RA系列开发板的初体验,了解一下

2.开发环境的选择和调试(从零开始,加油)

3.欲速则不达,今天是对RA2E1 基础知识的补充学习。

4.e2 studio 使用教程

5.Keil配置使用(使用 RASC 生成 Keil 工程)

6.Keil配置使用(使用 RASC 生成 Keil 工程)

7.(电脑重装系统)学习RA产品家族选型手册

8.问题解决、学习RA寄存器、用寄存器的方式点亮第一个LED灯。

9.继续学习RA寄存器

10.FSP固件库开发及FSP配置详解。

11.FSP固件库开发点亮第一个灯。

12.FSP固件库开发按键输入检测控制LED灯闪烁

13.FSP固件库开发启动文件详解

14.FSP固件库开发延时函数(时钟详解)

15.FSP固件库外部中断处理编程(外部中断检测按键控制LED闪烁)


文章目录

系列文章目录

前言

一、SysTick系统定时器是什么?

二、RA2E1系统定时器寄存器

1.寄存器解释

2.定时计算解释

三、实操:SysTick系统定时器定时2s  LED闪烁

1.新建工程    RA_SysTick

2.程序编写

总结

朦胧月色


前言

        继外部中断之后,我们可以根据外部中断来控制检测按键输入的高低电平,然后进入回调函数从而控制LED闪烁,接上次我们继续讲解最基础的定时器,滴答定时器(SysTick系统定时器)。


一、SysTick系统定时器是什么?

       SysTick系统定时器是一种硬件组件,它产生对处理器的周期性中断。SysTick定时器是存在于ARM Cortex-M处理器(包括RA2E1)上的系统定时器。

        SysTick定时器是一个24位下行计数器,可用于产生周期性中断。可以将其配置为以固定间隔生成中断,这可以用于诸如调度、计时和生成延迟之类的任务。

        SysTick是属于CM33内核的外设,所以所有基于CM33内核的单片机都具有这个系统定时器, 使得软件在CM33单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。

        SysTick是一个24bit的向下递减的计数器,计数器每计数一次的时间为1/SYSCLK,一般我们设置系统时钟SYSCLK等于200MHz。 当重装载数值寄存器的值递减到0的时候,系统定时器就产生一次中断,以此循环。


二、RA2E1系统定时器寄存器

1.寄存器解释

寄存器名称

寄存器描述

CTRL

SysTick控制及状态寄存器

LOAD

SysTick重装载数值寄存器

VAL

SysTick当前数值寄存器

CALIB

SysTick校准数值寄存器

位段

名称

类型

复位值

描述

16

COUNTFLAG

R/W

0

如果在上次读取本寄存器后,

SysTick 已经计到了 0,则该位为 1。

2

CLKSOURCE

R/W

0

时钟源选择位为0时:时钟源为LOCO=32768Hz;

时钟源选择位为1时:时钟源为处理器时钟ICLK=200MHz

1

TICKINT

R/W

0

1:SysTick递减计数到 0时产生 SysTick异常请求; 0:计数到 0 时无动作。 也可以通过读取COUNTFLAG标志位来确定计数器是否递减到0。

0

ENABLE

R/W

0

SysTick 定时器的使能位

重载寄存器:

位段

名称

类型

复位值

描述

23:0

RELOAD

R/W

0

当倒数计数至零时,将被重加载的值

当前值寄存器:

位段

名称

类型

复位值

描述

23:0

CURRENT

R/W

0

读取时返回当前倒计数的值,写它则使之清零,

同时还会清除在SysTick控制及状态寄存器中的

COUNTFLAG 标志

校准时间寄存器:

位段

名称

类型

复位值

描述

31

NOREF

R

0

NOREF 标志. 读取时值为0。用于指示已经提

供了一个独立的参考时钟,本时钟频率为HCLK/8

30

SKEW

R

1

读取时值为1.因为TENMS是未知的,1ms的校准值

未知。这会影响SysTick作为一个软件实时时钟的稳定性


2.定时计算解释

        SysTick定时器的计数器是向下递减计数的,计数一次的时间TDEC=1/CLKICLK, 当重装载寄存器中的值VALUELOAD减到0的时候,产生中断,可知中断一次的时间T INT=VALUELOAD * TDEC= VALUE LOAD/CLKICLK,其中CLKICLK =200MHZ。如果设置VALUELOAD为200,那中断一次的时间 TINT=200/200M=1us。 

IT_Period = SystemCoreClock / IT_frequency; //IT_frequency为中断的频率(单位为Hz)
SysTick_Config(IT_Period) //IT_Period为中断一次的时间(单位为时钟节拍数)

SysTick_Config()的形参我们配置为IT_Period。例如,当IT_frequency为1000,IT_Period = SystemCoreClock / IT_frequency= 200M/1000=200K, 从刚刚分析我们知道这个形参的值最终是写到重装载寄存器LOAD中的, 从而可知我们现在把SysTick定时器中断一次的时间TINT=200k/200M=1ms。


三、实操:SysTick系统定时器定时2s  LED闪烁

1.新建工程    RA_SysTick


2.程序编写

#include "hal_data.h"

FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER


typedef enum
{
    SYS_DELAY_UNITS_SECONDS      = 200000000, ///< Requested delay amount is in seconds
    SYS_DELAY_UNITS_MILLISECONDS = 200000,    ///< Requested delay amount is in milliseconds
    SYS_DELAY_UNITS_MICROSECONDS = 200        ///< Requested delay amount is in microseconds
} sys_delay_units_t;


/* 定义变量 */
uint32_t IT_Period;
uint32_t IT_nums;

/**
* @brief  延时程序
* @param  delay: 延时的单位时间
* @param  unit: 延时的单位
* @retval 无
*/

void SysTick_Delay(uint32_t delay, sys_delay_units_t unit)
{
    uint32_t SumTime = delay * unit; //计算总延时时间(单位为时钟节拍数)
    IT_nums = SumTime/IT_Period;
    while (IT_nums != 0);
}


/**
* @brief  SysTick的中断服务函数
* @param  无
* @retval 无
*/
extern void SysTick_Handler(void); //需要先extern声明一下避免编译器警告
void SysTick_Handler(void)
{
	IT_nums++;
    if (IT_nums == 2000)
    {
		 IT_nums = 0;
	     R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_HIGH); //LED1亮
    }
	else
	{
		 R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_LOW); //LED1亮
		
	}
}

 /**
  * @brief  启动系统滴答计时器 SysTick
  * @param  IT_frequency: 滴答计时器每秒的中断次数
  * @retval 无
  */
 void SysTick_Init(uint32_t IT_frequency)
 {
     /* SystemCoreClock在这里默认为200M
      * SystemCoreClock / 1000    1ms中断一次
      * SystemCoreClock / 100000  10us中断一次
      * SystemCoreClock / 1000000 1us中断一次
      */
     IT_Period = SystemCoreClock / IT_frequency;
     uint32_t err = SysTick_Config (IT_Period);
     assert(err==0); //capture error
 }


/*******************************************************************************************************************//**
 * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function
 * is called by main() when no RTOS is used.
 **********************************************************************************************************************/
void hal_entry(void)   //相当于主函数  函数最终执行的地方
{
	
	R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_LOW); //LED1亮
	R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_LOW); //LED1亮
	
    R_BSP_PinAccessEnable ();  //启用对PFS寄存器的访问,因为后面写IO口都用BSP内联函数
	SysTick_Init(1000);//初始化系统时钟
	while(1){
	

	}
	
	
	
	
    /* TODO: add your own code here */

#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}

 视频效果:

RA2E1 SysTick定时器 定时2s led闪一次


总结

        

        RA2E1是一款由瑞萨电子推出的微控制器系列,其内部集成了多个定时器模块,包括SysTick定时器、GPT定时器、WDT定时器等。这些定时器模块可以用来实现各种定时器功能,例如周期性中断、延时等。

        其中,SysTick定时器是一个24位计数器,可以用来实现基于时间的定时器。SysTick定时器可以通过设置重载值和使能定时器来实现定时器功能。每当SysTick计数器减到0时,就会触发SysTick中断,可以在中断处理函数中实现定时器功能。SysTick定时器的时钟源可以是系统时钟或者处理器时钟。

        除了SysTick定时器,RA2E1还集成了多个通用定时器(GPT),每个通用定时器包含多个定时器通道,可以用来实现多路定时器。通用定时器可以用于计时、延时、PWM等应用场景。此外,RA2E1还集成了看门狗定时器(WDT),可以用来实现系统监控和复位功能。

总的来说,RA2E1提供了多个定时器模块,可以满足各种应用场景下的定时器需求。开发者可以根据具体的应用需求选择合适的定时器模块,并使用相应的定时器API进行开发。


朦胧月色

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/475728.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跟着杰哥学强化学习:多臂老虎机问题

多臂老虎机问题 现在有3台外观一模一样的老虎机,每个老虎机的赔率是不同的,摇动一次需要1块钱,现在给你100块钱,如何获取最大的收益。 如果我们知道了每个老虎的赔率,那么只要选择收益最高的那个老虎机就可以了,但现在问题是并不知道每个老虎机的收益。为了简单,我们假…

linux 安装rocketmq

首先准备虚拟机一台 下载linux 64位 jdk1.8(自行百度资源) 下载 | RocketMQ (apache.org) cd /usr/local/ #这是我的本机的现有目录 mkdir rocketmq mkdir jdk 1.借助linux客户端工具,上传刚下载好的jdk安装包到java文件夹 2.借助linux客户端工具,上传刚下载好的二进制安装包…

「C/C++」C/C++软件跨平台思维

博客主页&#xff1a;何曾参静谧的博客 文章专栏&#xff1a;「C/C」C/C学习 目录 相关术语一、编写可移植的代码&#xff1a;二、使用跨平台的C库和框架&#xff1a;三、进行兼容性测试&#xff1a;四、用户界面设计&#xff1a; 相关术语 跨平台思维&#xff1a;是指在软件开…

D-Link DSL-2888A 远程命令执行漏洞(CVE-2020-24581/24579)

漏洞描述 D-Link DSL-2888A AU_2.31_V1.1.47ae55之前版本存在安全漏洞&#xff0c;该漏洞源于包含一个execute cmd.cgi特性(不能通过web用户界面访问)&#xff0c;该特性允许经过身份验证的用户执行操作系统命令。 在该版本固件中同时存在着一个不安全认证漏洞&#xff08;CVE…

【软考网络管理员】2023年软考网管初级常见知识考点(2)- 数据通信技术

【写在前面】也是趁着五一假期前再写几篇分享类的文章给大家&#xff0c;希望看到我文章能给软考网络管理员备考的您带来一些帮助&#xff0c;5月27号也是全国计算机软件考试统一时间&#xff0c;也就不用去各个地方找资料和代码了。紧接着我就把我整理的一些资料分享给大家哈&…

04 KVM虚拟化网络概述

文章目录 04 KVM虚拟化网络概述4.1 Linux Bridge4.2 Open vSwitch 04 KVM虚拟化网络概述 为了使虚拟机可以与外部进行网络通信&#xff0c;需要为虚拟机配置网络环境。KVM虚拟化支持Linux Bridge、Open vSwitch网桥等多种类型的网桥。如图1所示&#xff0c;数据传输路径为“虚…

InstructGPT 论文阅读笔记

目录 简介 数据集 详细实现 实验结果 参考资料 简介 InstructGPT 模型是在论文《Training language models to follow instructions with human feedback》被提出的&#xff0c;OpenAI在2022年1月发布了这篇文章。 论文摘要翻译&#x…

AttributeError: ‘Document‘ object has no attribute ‘pageCount‘ PyMuPDF库

这可能是由于PyMuPDF库更新导致的&#xff0c;里面的一些函数名发生了变化 1. AttributeError: Document object has no attribute pageCount 将 pageCount改为 page_count 2. AttributeError: Matrix object has no attribute preRotate 将preRotate改为prerotate 3.Attribut…

关于FFMPEG中的filter滤镜的简单介绍

滤镜的作用主要是对原始的音视频数据进行处理以实现各种各样的效果。比如叠加水印&#xff0c;翻转缩放视频等。 下图表示的正常转码流程&#xff0c;滤镜在解码和编码中间&#xff0c;虚线表示可有可无。 使用命令查看ffmpeg支持的滤镜 ffmpeg -filters 查看某个滤镜的详细参…

k210点亮LED灯

开发板上自带的3个led灯接线如图。 点亮led灯主要使用两个模块&#xff0c;如下&#xff1a; fm.register(pin,function,forceFalse) 【pin】芯片外部 IO 【function】芯片功能 【force】True 则强制注册&#xff0c;清除之前的注册记录 例&#xff1a;fm.register(12, fm.f…

真题详解(有向图)-软件设计(六十二)

真题详解&#xff08;极限编程&#xff09;-软件设计&#xff08;六十一)https://blog.csdn.net/ke1ying/article/details/130435971 CMM指软件成熟度模型&#xff0c;一般1级成熟度最低&#xff0c;5级成熟度最高&#xff0c;采用更高级的CMM模型可以提高软件质量。 初始&am…

RepVGG学习笔记

RepVGG 0 前言1 结构重参数化1.1 结构重参数化第一步&#xff08;将 C o n v 2 D Conv2D Conv2D算子和 B N BN BN算子融合以及将只有 B N BN BN的分支转换成一个 C o n v 2 D Conv2D Conv2D算子&#xff09;1.2 结构重参数化第二步&#xff08;多分支的 3 3 3\times3 33卷积融…

安全运营 ldap监控域控信息

0x00 背景 公司有多个主域&#xff0c;子域&#xff0c;有的子域因为境外数据安全的问题无法把日志传输到境内。那么如何在没有日志的情况下监控子域或者互信域的组织单元(OU)信息呢。 由于访问互信域要在域控上进行&#xff0c;本文根据最小权限原则监控普通用户也可以访问的…

Packet Tracer - 配置和验证小型网络

Packet Tracer - 配置和验证小型网络 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 RTA G0/0 10.10.10.1 255.255.255.0 不适用 G0/1 10.10.20.1 255.255.255.0 不适用 SW1 VLAN1 10.10.10.2 255.255.255.0 10.10.10.1 SW2 VLAN1 10.10.20.2 255.25…

【C++】set和map的使用

对于STL容器来说&#xff0c;有很多相似的功能&#xff0c;所以这里主要将与之前不同的功能说清楚 文章目录 1.对于set与set的简单理解2. setinsert迭代器遍历countmultisetinsertfindcount 3. mapinsert与迭代器的使用统计水果次数 operator []operator[]的实现理解对整体的拆…

Nginx:常见的面试题和答案

1. 什么是Nginx&#xff1f; 答&#xff1a;Nginx是一款高性能的Web服务器和反向代理服务器,用于HTTP、HTTPS、SMTP、POP3和IMAP协议&#xff0c;同时用于处理高并发的请求&#xff0c;提供快速、可靠的服务。 2. Nginx的优点是什么&#xff1f; Nginx的优点包括&#xff1a…

【BeautifulSoup上】——05全栈开发——如桃花来

目录索引 介绍&#xff1a;解析库&#xff1a; 安装&#xff1a;pip install BeautifulSoup4pip install lxml 标签选择器&#xff1a;1.string属性&#xff1a;.name属性&#xff1a;获取标签中的属性值&#xff1a; 实用——标准选择器&#xff1a;使用find_all()根据标签名查…

五、C++内存管理机制 —— primitives(侯捷)

侯捷 C八部曲笔记汇总 - - - 持续更新 ! ! ! 一、C 面向对象高级开发 1、C面向对象高级编程(上) 2、C面向对象高级编程(下) 二、STL 标准库和泛型编程 1、分配器、序列式容器 2、关联式容器 3、迭代器、 算法、仿函数 4、适配器、补充 三、C 设计模式 四、C 新标准 五、C 内存管…

2023-04-29 动态规划介绍

2023-04-29 动态规划介绍 动态规划是运筹学课程的一部分 多阶段决策问题 有一类活动的过程&#xff0c;可以分成若干个互相联系的阶段&#xff0c;在它的每一阶段都需要作出决策&#xff0c;从而使整个过程达到最好的活动效果 当然&#xff0c;每个阶段的决策的选取不是任意确…

dc-6靶机

1.使用nmap进行信息搜集&#xff0c;存活主机&#xff0c;端口 192.168.85.184是存活主机&#xff0c;发现开放22&#xff0c;80端口 2.访问192.168.85.184的80端口 发现被重定向了&#xff0c;修改hosts文件 vim /etc/hosts 添加一行 192.168.85.174 wordy3.对网站进行信息搜…