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. 新增一批产品测试文档与彩页文件
276 lines
6.5 KiB
C
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
|
|
|
|
|
|
|