【星闪】Hi2821 | SysTick系统定时器
1. 简介
hi2821 和 STM32 一样也有系统定时器,系统定时器的优点是配置及功能简单,可以用来实现一般的计时、计数、延时等任务。
hi2821 的 SysTick 使用外部 32.768kHz 晶振或内部 32kHz 时钟作为时钟源,默认为内部晶振。hi2821 的 SysTick 包含 2 个 32 位的计数寄存器,可以单独使用也可串联一起使用,当串联使用时,计数值最高可为 。
2. 函数接口
- uapi_systick_init(void):初始化Systick;
- uapi_systick_deinit(void):去初始化Systick;
- uapi_systick_count_clear(void):清除Systick计数;
- uapi_systick_get_count(void):获取Systick计数值;
- uapi_systick_get_s(void):获取Systick计数秒值;
- uapi_systick_get_ms(void):获取Systick计数毫秒值;
- uapi_systick_get_us(void):获取Systick计数微秒值;
- uapi_systick_delay_count(uint64_t c_delay):按count计数延时(c_delay表示延时时间);
- uapi_systick_delay_s(uint32_t s_delay):按秒数延时(s_delay表示延时时间);
- uapi_systick_delay_ms(uint32_t m_delay):按毫秒数延时(m_delay表示延时时间);
- uapi_systick_delay_us(uint32_t u_delay):按微秒数延时(us_delay表示延时时间);
- uapi_systick_suspend(uintptr_t arg):挂起Systick模块,低功耗情况使用(arg表示挂起时所需要的参数);
- uapi_systick_resume(uintptr_t arg):恢复Systick模块,低功耗情况使用(arg表示恢复时所需要的参数)。
3. 例程
例程中只是简单演示获取计数和计时相关的函数接口,延时相关的接口已经集成到 LiteOS 的系统接口中了,无需调用 SysTick 的接口。
3.1 Kconfig
因为 LiteOS 的系统心跳是依靠 SysTick 的,因此 SDK 中自然是默认打开相关的配置选项。如果有需要可以使能下面的计数寄存器串联功能。
3.2 代码
#include "soc_osal.h"
#include "app_init.h"
#include "securec.h"
#include "systick.h"#include <string.h>
#include <stdint.h>void app_main(void *unused)
{(void)(unused);while (1) {uint64_t tick = uapi_systick_get_count();uint64_t s = uapi_systick_get_s();uint64_t ms = uapi_systick_get_ms();uint64_t us = uapi_systick_get_us();osal_printk("tick: %lld, s: %lld, ms: %lld, us: %lld\r\n",tick,s,ms,us);osal_msleep(1000);}
}
SysTick 的初始化,即 uapi_systick_init 函数,用户是不需要调用的,因为系统在初始化的时候就已经调用了一次了。
代码当中可以直接调用相关函数获取计数值。需要注意的是,如果获取微秒值,它的最小计数单位是 (使用内部32kHz时钟),所以如果调用速度很快可能会出现前后两次的值是一样的。