硬汉嵌入式论坛

 找回密码
 立即注册
查看: 595|回复: 2
收起左侧

[CAN/FDCAN] 制作了个CANopen时间戳生成函数,方便大家调用

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2023-10-5 08:15:44 | 显示全部楼层 |阅读模式


CANopen时间戳报文格式:

123456.png



函数如下:

[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
*        函 数 名: CANopen_WriteClock
*        功能说明: 设置Canopen时间戳
*        形    参:无
*        返 回 值: 1表示成功 0表示错误
*********************************************************************************************************
*/
extern CO_t* CO;
uint8_t CANopen_WriteClock(uint16_t _year, uint8_t _mon, uint8_t _day, uint8_t _hour, uint8_t _min, uint8_t _sec, uint32_t _ms, uint32_t _Interval_ms)
{
        uint16_t t;
        uint32_t seccount=0;
		uint32_t days;

        if (_year < 2000 || _year > 2099)
        {
                return 0;        /* _year范围1970-2099,此处设置范围为2000-2099 */   
        } 
   
        for (t = 1984; t < _year; t++)         /* 把所有年份的秒钟相加 */
        {
                if (Is_Leap_Year(t))                /* 判断是否为闰年 */
                {
                        seccount += 31622400;        /* 闰年的秒钟数 */
                }
                else
                {
                        seccount += 31536000;         /* 平年的秒钟数 */
                }
        }

        _mon -= 1;

        for (t = 0; t < _mon; t++)         /* 把前面月份的秒钟数相加 */
        {
                seccount += (uint32_t)mon_table[t] * 86400;        /* 月份秒钟数相加 */

                if (Is_Leap_Year(_year) && t == 1)
                {
                        seccount += 86400;        /* 闰年2月份增加一天的秒钟数 */
                }                        
        }

        seccount += (uint32_t)(_day - 1) * 86400;        /* 把前面日期的秒钟数相加 */

        seccount += (uint32_t)_hour * 3600;                /* 小时秒钟数 */

        seccount += (uint32_t)_min * 60;        /* 分钟秒钟数 */

        seccount += _sec;        /* 最后的秒钟加上去 */
            
		_ms = _ms + (seccount%(60*60*24))*1000;
		days = seccount/(60*60*24);
		
		CO_TIME_set(CO->TIME,  _ms,  days,  _Interval_ms);
		
        return 1;      
}


实测完全没问题:

12.png


回复

使用道具 举报

8

主题

157

回帖

181

积分

初级会员

积分
181
发表于 2023-10-5 16:10:25 | 显示全部楼层
看起来实用!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
 楼主| 发表于 2023-10-6 08:59:16 | 显示全部楼层

这些CAN协议都没有提供生成方法,所以自己搞了个。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-14 16:13 , Processed in 0.261340 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表