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

系列文章目录

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进行开发。


朦胧月色

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值