系列文章目录
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),可以用来实现系统监控和复位功能。文章来源:https://www.toymoban.com/news/detail-429632.html
总的来说,RA2E1提供了多个定时器模块,可以满足各种应用场景下的定时器需求。开发者可以根据具体的应用需求选择合适的定时器模块,并使用相应的定时器API进行开发。文章来源地址https://www.toymoban.com/news/detail-429632.html
朦胧月色
到了这里,关于【致敬未来的攻城狮计划】— 连续打卡第十六天:FSP固件库系统定时器(滴答定时器SysTick)每2秒LED闪烁一次的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!