Files
chrg/apps/chrg/applications/bsp/chrg_tmr.c
T
yhf 9f63dfeaf5 chore: 统一项目版本至V1.1.24并完善版本管理
1.  新增`apps/chrg/applications/utils/chrg_def.h`统一管理版本号,定义CHRG_VERSION相关宏与版本字符串
2.  更新所有业务源文件和头文件的文件头版本号为V1.1.24
3.  修改`chrg_comm.c`移除硬编码版本号,改用统一定义的CHRG_FIRMWARE_VERSION
4.  更新`main.c`添加版本头文件并打印应用版本字符串
5.  更新`修改日志.md`添加V1.1.24版本记录,说明版本管理规则
6.  新增编译日志记录本次版本统一构建结果
7.  补充AGENTS.md中的版本管理规范
8.  新增一批产品测试文档与彩页文件
2026-09-15 21:33:14 +08:00

276 lines
6.5 KiB
C

/****************************************************************************
文件名称 : chrg_tmr.c
完成日期 :
当前版本号 : V1.1.24
主要功能 : 芯片内支持的高精度(us级)硬件定时器操作实现:启动、停止、回调等接口。
版本历史 : 创建原始版本
说明 :
******************************************************************************/
#include <string.h>
#include "chrg_tmr.h"
#define LOG_TAG "chrg.tmr"
#define DBG_LEVEL DBG_LOG
#include <rtdbg.h>
struct chrg_tmr_t chrgtmr[TOTAL_TMRS] = {
[IDX_TMR_1S] = {
.index = IDX_TMR_1S,
.dev = RT_NULL,
.name = DEV_NAME_HWTIMER_1S,
.mode = HWTIMER_MODE_PERIOD,
}
};
/*****************************************************************
函数名称: chrg_tmr_us_callback
函数描述: us 计时回调函数
输入参数: dev:设备节点,size:数据长度
输出参数: -
返回说明: =0: 正常
其它说明: -
*****************************************************************/
static rt_err_t chrg_tmr_1s_callback(rt_device_t dev, rt_size_t size)
{
struct chrg_tmr_t *pTMR = (struct chrg_tmr_t *)&chrgtmr[IDX_TMR_1S];
pTMR->times++;
return RT_EOK;
}
/*****************************************************************
函数名称: chrg_tmrs_get_count
函数描述: 获取指定编号定时器的当前时刻,单位us
输入参数: index: 定时器编号
输出参数: -
返回说明: >=0: 定时器已运转微秒数 <0 :异常
其它说明: -
*****************************************************************/
rt_uint32_t chrg_tmr_get_count (eIDX_TMR index)
{
if (index >= TOTAL_TMRS) {
return 0;
}
rt_uint32_t cnt = 0;
struct chrg_tmr_t *pTMR = &chrgtmr[index];
rt_device_control(pTMR->dev, HWTIMER_CTRL_COUNT_GET, &cnt);
return cnt;
}
/*****************************************************************
函数名称: chrg_tmrs_start
函数描述: 启动指定编号的定时器
输入参数: index: 定时器编号,timeo: 微秒定时
输出参数: -
返回说明: 0: 正常 <0 :异常
其它说明: -
*****************************************************************/
rt_err_t chrg_tmr_start (eIDX_TMR index, uint32_t timeo)
{
rt_err_t ret = RT_EOK;
if (index >= TOTAL_TMRS) {
return RT_EINVAL;
}
struct chrg_tmr_t *pTMR = &chrgtmr[index];
if (RT_NULL == pTMR->dev) {
LOG_E("dev '%s' not opened.", pTMR->name);
return 0;
}
pTMR->timeout.sec = timeo/1000000;
pTMR->timeout.usec = timeo%1000000;
if (rt_device_write(pTMR->dev, 0, &pTMR->timeout,
sizeof(rt_hwtimerval_t)) != sizeof(rt_hwtimerval_t)) {
LOG_E("set timer '%s' timeout failed.", pTMR->name);
return ret;
}
return ret;
}
/*****************************************************************
函数名称: chrg_tmrs_stop
函数描述: 停止指定编号的定时器
输入参数: index: 定时器编号
输出参数: -
返回说明: 0: 正常 <0 :异常
其它说明: -
*****************************************************************/
rt_err_t chrg_tmr_stop (eIDX_TMR index)
{
rt_err_t ret = RT_EOK;
if (index >= TOTAL_TMRS) {
return RT_EINVAL;
}
struct chrg_tmr_t *pTMR = &chrgtmr[index];
if (RT_NULL == pTMR->dev) {
LOG_E("dev '%s' not opened.", pTMR->name);
return 0;
}
ret = rt_device_control(pTMR->dev, HWTIMER_CTRL_STOP, RT_NULL);
if (RT_EOK != ret) {
LOG_E("set '%s' stop failed. %d", pTMR->name, ret);
return ret;
}
return ret;
}
/*****************************************************************
函数名称: chrg_tmr_release
函数描述: 释放指定编号的定时器
输入参数: index: 定时器编号
输出参数: -
返回说明: 0: 正常 <0 :异常
其它说明: -
*****************************************************************/
void chrg_tmr_release (eIDX_TMR index)
{
if (index >= TOTAL_TMRS) {
return ;
}
struct chrg_tmr_t *pTMR = &chrgtmr[index];
if (RT_NULL != pTMR->dev) {
rt_device_close(pTMR->dev);
pTMR->dev = RT_NULL;
}
}
/*****************************************************************
函数名称: chrg_tmrs_open
函数描述: 打开指定编号的硬件定时器设备
输入参数: index: 定时器编号
输出参数: -
返回说明: =0: 正常 <0 :异常
其它说明: -
*****************************************************************/
int chrg_tmr_open (eIDX_TMR index)
{
rt_err_t ret = RT_EOK;
rt_uint32_t freq = 1000000;
if (index >= TOTAL_TMRS) {
return -1;
}
struct chrg_tmr_t *pTMR = &chrgtmr[index];
pTMR->dev = rt_device_find(pTMR->name);
if (RT_NULL == pTMR->dev) {
LOG_E("dev '%s' not found.", pTMR->name);
return -1;
}
ret = rt_device_open(pTMR->dev, RT_DEVICE_OFLAG_RDWR);
if (RT_EOK != ret) {
LOG_E("open dev '%s' failed. %d", pTMR->name, ret);
return ret;
}
ret = rt_device_control(pTMR->dev, HWTIMER_CTRL_FREQ_SET, &freq);
if (RT_EOK != ret) {
LOG_E("set '%s' freq failed. %d", pTMR->name, ret);
return ret;
}
ret = rt_device_control(pTMR->dev, HWTIMER_CTRL_MODE_SET, &pTMR->mode);
if (RT_EOK != ret) {
LOG_E("set '%s' mode failed. %d", pTMR->name, ret);
return ret;
}
switch (pTMR->index) {
case IDX_TMR_1S:
ret = rt_device_set_rx_indicate(pTMR->dev, chrg_tmr_1s_callback);
break;
default:
return -1;
}
if (IDX_TMR_1S == pTMR->index) {
chrg_tmr_start(pTMR->index, TIME_TRIGGER_SECOND);
}
return ret;
}
/*****************************************************************
函数名称: chrg_tmrs_init
函数描述: 初始化多个硬件高精度定时器
输入参数: -
输出参数: -
返回说明: 0: 正常
其它说明: -
*****************************************************************/
int chrg_tmrs_init (void)
{
int i = 0;
for (i = 0; i < TOTAL_TMRS; i++) {
chrg_tmr_open((eIDX_TMR)i);
}
return 0;
}
INIT_ENV_EXPORT(chrg_tmrs_init);
static int uptime (int argc, char **argv)
{
struct chrg_tmr_t *pTMR = &chrgtmr[IDX_TMR_1S];
int day = pTMR->times/86400;
int hour = (pTMR->times%86400)/3600;
int minute = ((pTMR->times%86400)%3600)/60;
int second = ((pTMR->times%86400)%3600)%60;
rt_uint32_t us = chrg_tmr_get_count(IDX_TMR_1S);
rt_kprintf("up %d days, %02d:%02d:%02d.%06d \r\n",
day, hour, minute, second, us%1000000);
return 0;
}
MSH_CMD_EXPORT(uptime, system running life.)
#if 0
static int sec_tmr(int argc, char **argv)
{
if (argc != 2) {
rt_kprintf("sec_tmr <start|stop>\r\n");
return RT_ERROR;
}
if (strcmp(argv[1], "start") == 0) {
chrg_tmr_start(IDX_TMR_1S, 1000000);
} else if (strcmp(argv[1], "stop") == 0) {
chrg_tmr_stop(IDX_TMR_1S);
} else {
rt_kprintf("sec_tmr start|stop\r\n");
}
return 0;
}
MSH_CMD_EXPORT(sec_tmr, second timer);
#endif