系列文章目录
1.连续打卡第一天:提前对CPK_RA2E1是瑞萨RA系列开发板的初体验,了解一下
5.Keil配置使用(使用 RASC 生成 Keil 工程)
6.Keil配置使用(使用 RASC 生成 Keil 工程)
文章目录
前言
继外部中断之后,我们可以根据外部中断来控制检测按键输入的高低电平,然后进入回调函数从而控制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进行开发。