BK7231N 延时问题

Wi-Fi 设备、Wi-Fi 低功耗设备、Wi-Fi BLE 双模设备、Ethernet设备、Ethernet+Wi-Fi设备等
Post Reply
DebugGT
Posts: 15

SDK版本:ty_iot_sdk_2.3.3 && BK7231N 0.0.28
sdk的github地址:https://github.com/tuya/tuya-iotos-embe ... le-bk7231n
硬件:T34模组bk7231n
dp下发控制执行一次test函数,控制GPIOA7和GPIOA8,预期GPIOA8低电平持续13.5ms高电平持续33.5ms循环20次
实际高/低电平持续时间有时会比预期值大,多的时候误差达到4ms,不是必然出现。

Code: Select all

void close_global_fiq(void)
{
    *(volatile unsigned long *)(0x00802000 + 0x11 * 4) &= 0x01;
}

void open_global_fiq(void)
{
    *(volatile unsigned long *)(0x00802000 + 0x11 * 4) |= 0x02;
}

void looploop(int num) // sync from svn revision 18
{
    volatile int x, y;
    for (y = 0; y < num; y++)
    {
        for (x = 0; x < 3260; x++)
            ;
    }
}

void gpio_init(void)
{
    tuya_pin_init(TY_GPIOA_7, TUYA_PIN_MODE_OUT_PP_HIGH);
    tuya_pin_init(TY_GPIOA_8, TUYA_PIN_MODE_OUT_PP_HIGH);
}

void test(void)
{
    close_global_fiq();
    for (int i = 0; i < 20; i++)
    {
        tuya_pin_write(TY_GPIOA_7, 1);
	tuya_pin_write(TY_GPIOA_8, 0);
        looploop(20);
        tuya_pin_write(TY_GPIOA_7, 1);
	tuya_pin_write(TY_GPIOA_8, 1);
        looploop(50);
    }
    open_global_fiq();
}

Tags:
DebugGT
Posts: 15

Re: BK7231N 延时问题

试了*(volatile unsigned long *)(0x00802000 + 0x11 * 4) &= 0xFFFFFFFD;
用这个关中断结果也一样,延时误差还是会有。

yangjie
Posts: 213

Re: BK7231N 延时问题

建议使用下硬件定时器 0 或 1

DebugGT
Posts: 15

Re: BK7231N 延时问题

yangjie 2024年 Feb 2日 17:28

建议使用下硬件定时器 0 或 1

硬件定时器0 用这个tuya_timer_init吗,这个我试过,一样存在延时误差

yangjie
Posts: 213

Re: BK7231N 延时问题

DebugGT 2024年 Feb 2日 17:44
yangjie 2024年 Feb 2日 17:28

建议使用下硬件定时器 0 或 1

硬件定时器0 用这个tuya_timer_init吗,这个我试过,一样存在延时误差

这个误差是多少。我看上面你其实调用了 *(volatile unsigned long *)(0x00802000 + 0x11 * 4) &= 0xFFFFFFFD; 只是将 fiq 中断给屏蔽了。然后使用 while(i--) 的方式进行延时的,但是这种延时方式可能会被其他硬件中断或调度给打断的,这种方式也不是很靠谱的。建议使用硬件定时器的来进行 io 反转功能,这种方案在 ms 级别要比 while(i--) 更准确稳定的。但 T34 是一款具有 WiFi 功能的 SOC 芯片,所以他可能没办法像普通 MCU 那样在定时任务上准确、稳定的,它更偏向于要做好 WiFi 的功能。

你也可以在下面描述一下这个功能的应用场景,看下有没有更好的解决办法。

DebugGT
Posts: 15

Re: BK7231N 延时问题

yangjie 2024年 Feb 2日 18:06
DebugGT 2024年 Feb 2日 17:44
yangjie 2024年 Feb 2日 17:28

建议使用下硬件定时器 0 或 1

硬件定时器0 用这个tuya_timer_init吗,这个我试过,一样存在延时误差

这个误差是多少。我看上面你其实调用了 *(volatile unsigned long *)(0x00802000 + 0x11 * 4) &= 0xFFFFFFFD; 只是将 fiq 中断给屏蔽了。然后使用 while(i--) 的方式进行延时的,但是这种延时方式可能会被其他硬件中断或调度给打断的,这种方式也不是很靠谱的。建议使用硬件定时器的来进行 io 反转功能,这种方案在 ms 级别要比 while(i--) 更准确稳定的。但 T34 是一款具有 WiFi 功能的 SOC 芯片,所以他可能没办法像普通 MCU 那样在定时任务上准确、稳定的,它更偏向于要做好 WiFi 的功能。

你也可以在下面描述一下这个功能的应用场景,看下有没有更好的解决办法。

我设定是1ms定时器中断,这个误差也是能到4ms左右

DebugGT
Posts: 15

Re: BK7231N 延时问题

我现在是用GPIO控制电机,同时定时器中断里进行超时计数,电机运动过程中一直检测目标霍尔信号,定时器计数超时或者检测到目标霍尔位置时电机停止。我这个需要达到毫秒级定时,电机动作优先级最高,联网只是附带功能,用于远程控制和读取设备状态。我贴出来的程序就是希望电机在运动过程中不要切换到其他任务,很明显这个还是有4ms左右误差

DebugGT
Posts: 15

Re: BK7231N 延时问题

关闭fiq中断或者使用硬件定时器不能实现精确延时的要求,现在需要关闭其他中断包括任务调度中断的实现

User avatar
chenyisong
Posts: 124

Re: BK7231N 延时问题

DebugGT 2024年 Feb 2日 18:20

我现在是用GPIO控制电机,同时定时器中断里进行超时计数,电机运动过程中一直检测目标霍尔信号,定时器计数超时或者检测到目标霍尔位置时电机停止。我这个需要达到毫秒级定时,电机动作优先级最高,联网只是附带功能,用于远程控制和读取设备状态。我贴出来的程序就是希望电机在运动过程中不要切换到其他任务,很明显这个还是有4ms左右误差

wifi类soc芯片由于首要工作是完成底层wifi相关的工作,所以底层WiFi硬件相关的中断优先级是最高的,上层的中断会被下层的中断打断导致时间不准。

DebugGT
Posts: 15

Re: BK7231N 延时问题

类似的逻辑就是这样,需要延时误差在1ms内

Code: Select all

void timer_isr( void )
{
    if( needcount )//如果超时判定开启
    {
        if( count )//开始倒计时
        {
            count--;
        }
        else
        {
            MOTO_STOP;//超时停止
            needcount=0;
        }
    }
}

void action(void)
{
    count=500;//超时设定500ms
    needcount=1;//开启超时判定
    MOTO_RUN;//电机动作
    if(!HALL1&&!HALL2&&count)//一直死等直到判断到HALL1或HALL2或者超时
    {
        delay();
    }
    MOTO_STOP;//电机停止
}
Post Reply