CH32V208WBU6基于CH32V20xEVT\EVT\EXAM\BLE\Peripheral_ETH项目增加RTC每秒定时器后无法正确运行?tmos_start_task

你好,CH32V208WBU6基于CH32V20xEVT\EVT\EXAM\BLE\Peripheral_ETH项目增加RTC每秒定时器后,接着调用

tmos_start_task(eth_TaskID, ETH_SENG_DATA_EVENT, 160); 但是无法在uint16_t eth_ProcessEvent(uint8_t task_id, uint16_t events)里收到ETH_SENG_DATA_EVENT这个event.


RTC功能添加方法如下:

1. ch32v20x_it.c里添加

void RTC_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

void RTC_IRQHandler(void)  --- 此函数是从CH32V20xEVT\EVT\EXAM\RTC\User\ch32v20x_it.c里拷贝的。

{

if (RTC_GetITStatus(RTC_IT_SEC) != RESET)   /* Seconds interrupt */

{

    RTC_Get();

  }

if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)     /* Alarm clock interrupt */

{

RTC_ClearITPendingBit(RTC_IT_ALR);

    RTC_Get();

  }

RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW);

RTC_WaitForLastTask();

}


2. eth.c里在函数eth_init()里添加

RTC_Init();


3. 在eth的phy link上时调用tmos_start_task(eth_TaskID, ETH_SENG_DATA_EVENT, 160);

    if (intstat & GINT_STAT_PHY_CHANGE)                           //PHY status change

    {

        i = WCHNET_GetPHYStatus();

        if (i & PHY_Linked_Status)

        {

            printf("PHY Link Success\r\n");

        }

        tmos_start_task(eth_TaskID, ETH_SENG_DATA_EVENT, 160);

printf("PHY Link Success, send ETH_SENG_DATA_EVENT\r\n");

    }




您好,TMOS系统在初始化后,就一直基于RTC在运行,不支持运行期间对RTC进行重新写入,可以读出;

 eth.c里在函数eth_init()里添加RTC_Init();”是在TMOS系统初始化之后吗,如果是的话,会导致TMOS时钟异常。

您是想要做每秒一次的定时器这样的功能吗,可以直接利用TMOS系统的延时启用时间的功能,每秒钟循环执行一次时间;如果觉得精度不够或者其他原因,也可以使用TIMER定时器,中断服务函数中置标志后快进快出,在主循环中查询标志以安排事件,不会影响BLE的运行。


我是需要使用TMOS的同时,启用RTC的

? ? RTC_ITConfig(RTC_IT_SEC, ENABLE);

每秒中断一次的功能,能每秒钟获取RTC的年月日,时分秒,请问如何才能实现?是否可以在TMOS启动时,同时把RTC的每秒中断一次的功能打开?


您留个邮箱,给您发参考代码。


个人信息保护,已隐藏

请基于CH32V20xEVT\EVT\EXAM\BLE\Peripheral_ETH帮忙加一下RTC启用RTC_ITConfig(RTC_IT_SEC, ENABLE);每秒发起一次中断的示例代码,谢谢!


另外第一次启动tmos后如果通过网络获得的实时的时分秒时间,获得的时间和芯片当前运行的时间时分秒差距较大时,此时是否可以通过RTC_set来修改芯片时间?

由于我们使用外置电池给VBAT供电,所以希望断电后,再上电RTC保持上次断电前的时间继续运行。


参考代码已发送至邮箱。

默认TMOS系统是基于RTC运行的,不可以直接RTC_set,会导致TMOS时钟紊乱;需要保存下校准时,目标时间和当前RTC的差值到ram里,应用层获取RTC时间时叠加上差值。

断电之后,VBAT可以给RTC寄存器供电,但是ram是不保持的,会丢失当前记录的时间。

您可以考虑使用CH58x系列MCU,有更精确的RTC寄存器,可以实现低功耗情况下的万年历。

image.png


请问CH32V208WBU6的内置RTC在DC断电后,VBAT有电池供电的情况下,RTC是否确定不能记录当前时分秒吗?如果在VBAT供电的情况下但DC断电了,想要让CH32V208WBU6的RTC记录当前时分秒,希望DC再供电时能时分秒继续正确,请问可以做到吗?再CH32V208WBU6芯片上是否有什么方案?谢谢!


请问CH32V208WBU6的内置RTC在DC断电后,VBAT有电池供电的情况下,RTC是否确定不能记录当前时分秒吗?如果在VBAT供电的情况下但DC断电了,想要让CH32V208WBU6的RTC记录当前时分秒,希望DC再供电时能时分秒继续正确,请问可以做到吗?再CH32V208WBU6芯片上是否有什么方案?谢谢!


VBAT是可以提供给RTC供电,如果说直接基于TMOS系统初始化时的时间无校准那没问题可以跑;一旦需要外部信号校准,校准的差值是保存在RAM里的,断电就会丢失;利用断电瞬间的低电压中断去保存关键ram数据到flash中,理论上也可以实现,电源电路上可以加个电容蓄电来保证由足够的时间操作。

您添加一下邮件中的手机号联系,沟通更多信息。


你好,可以把技术人员发你的参考代码,发我一份吗?邮箱:个人信息保护,已隐藏


已发送至邮箱,请查收。


只有登录才能回复,可以选择微信账号登录