Wi-Fi 设备、Wi-Fi 低功耗设备、Wi-Fi BLE 双模设备、Ethernet设备、Ethernet+Wi-Fi设备等
-
DebugGT
- Posts: 15
- Joined: 2024年 Feb 2日 11:47
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
- Joined: 2024年 Feb 2日 11:47
试了*(volatile unsigned long *)(0x00802000 + 0x11 * 4) &= 0xFFFFFFFD;
用这个关中断结果也一样,延时误差还是会有。
-
DebugGT
- Posts: 15
- Joined: 2024年 Feb 2日 11:47
yangjie 2024年 Feb 2日 17:28
建议使用下硬件定时器 0 或 1
硬件定时器0 用这个tuya_timer_init吗,这个我试过,一样存在延时误差
-
yangjie
- Posts: 210
- Joined: 2022年 Sep 19日 14:25
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
- Joined: 2024年 Feb 2日 11:47
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
- Joined: 2024年 Feb 2日 11:47
我现在是用GPIO控制电机,同时定时器中断里进行超时计数,电机运动过程中一直检测目标霍尔信号,定时器计数超时或者检测到目标霍尔位置时电机停止。我这个需要达到毫秒级定时,电机动作优先级最高,联网只是附带功能,用于远程控制和读取设备状态。我贴出来的程序就是希望电机在运动过程中不要切换到其他任务,很明显这个还是有4ms左右误差
-
DebugGT
- Posts: 15
- Joined: 2024年 Feb 2日 11:47
关闭fiq中断或者使用硬件定时器不能实现精确延时的要求,现在需要关闭其他中断包括任务调度中断的实现
-
chenyisong
- Posts: 124
- Joined: 2022年 Sep 15日 17:46
DebugGT 2024年 Feb 2日 18:20
我现在是用GPIO控制电机,同时定时器中断里进行超时计数,电机运动过程中一直检测目标霍尔信号,定时器计数超时或者检测到目标霍尔位置时电机停止。我这个需要达到毫秒级定时,电机动作优先级最高,联网只是附带功能,用于远程控制和读取设备状态。我贴出来的程序就是希望电机在运动过程中不要切换到其他任务,很明显这个还是有4ms左右误差
wifi类soc芯片由于首要工作是完成底层wifi相关的工作,所以底层WiFi硬件相关的中断优先级是最高的,上层的中断会被下层的中断打断导致时间不准。
-
DebugGT
- Posts: 15
- Joined: 2024年 Feb 2日 11:47
类似的逻辑就是这样,需要延时误差在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;//电机停止
}