• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

MJIOT-AMB-03-DEBUG (RTL8710BN)

12345

New member
[QUOTE = "pvvx, post: 39397, member: 6"] I2S:
PA_18 - MCK
PA_19 - TX
PA_22 - WS

RX - none. [/ QUOTE]
Nice!
 

pvvx

Активный участник сообщества
PA_19 - ADC1 работает на модуле с RTL8710BN даже в "AT" прошивке, а написано:
Снимок1585.gif

При включении к 3.3В PA_19:
Код:
# ATSA=1
[ATSA]: _AT_SYSTEM_ADC_TEST_
analogin_init [13:1 ]
[ATSA] A1 = 0x0EEE

[MEM] After do cmd, available heap 151032
Снимок1580.gif

Так-же нигде нет описания команд для загрузчика в "UARTIMG_Download 2" (нет описаний протокола и самой программы ImageTool), а продавец модулей пишет:

Снимок1586.gif

Модуль выводит "Open xModem Transfer on Log UART...", передает символ 0x15 на 1500000 Baud...
Я то уже наковырял какие там команды путем dissasm всей ROM, но как будут жить пользователи? :confused:

Ameba типа SDK дало, в котором во множестве документов приведены примеры загрузки ПО по UART в модуль с помощью программы ImageTool (Image Generation в "UM0112 Realtek Ameba-Z SDK quick start.pdf") но саму программу или описание протокола не дают :) Он совсем не "xModem" :)
Кратко:
UART Set Baud: 0x05, x
Erase Flash Sectors: 0x17, a0,a1,a2, s0,s1
Read Flash: 0x19, a0,a1,a2, s0,s1, ... 0x06
FLASH Set Status: 0x26, xx
FLASH Get Status: 0x21
End: 0x07

Особенно в данном протоколе прикольно, что если модуль случайно стартанули в режиме "UARTIMG_Download 2", на стандартной скорости 115200, то дальше UART переключается на 1500000 и принимает любой поток, то вероятность пролета символа 0x17 очень высока, что приведет к стиранию какого-то сектора Flash или их пачке... На это стоит обратить внимание и отключить данную фигню, типа режима "UARTIMG_Download x" в eFuse (это есть и описания пользователям тоже не дано :) ) для надежных приложений.
 
Последнее редактирование:

pvvx

Активный участник сообщества
PA_19 - ADC1 работает на модуле с RTL8710BN даже в "AT" прошивке, а написано:
С этим разобрался.
В SDK описаны старые маркировки чипов серии "B" (подразумевался опытный образец RTL8710BN-L0, а не ...). Обновлен PDF на серию UM0114 Realtek Ameba-Z Data Sheet20170214.pdf (см. первое сообщение темы).
Также теперь актуален примерно такой расклад в чипах:
RTL_Ameba.gif
Для желающих уточнить данные в таблице к более корректным, приложил исходный xml:
 

Вложения

Последнее редактирование:

pvvx

Активный участник сообщества
Dhrystone - a mercurial repository | Mbed
Код:
Dhrystone Benchmark Program C/1 12/01/84
CLK CPU = 125.000000 MHz.
Test cycles 60 sec...
Dhrystone time for 13153280 passes = 60.001 sec
This machine benchmarks at 219217.679705 dhrystones/second
Dhrystone time for 13248512 passes = 60.001 sec
This machine benchmarks at 220804.853252 dhrystones/second
Dhrystone time for 13248512 passes = 60.001 sec
This machine benchmarks at 220804.853252 dhrystones/second
Dhrystone time for 13248512 passes = 60.001 sec
This machine benchmarks at 220804.853252 dhrystones/second
Dhrystone time for 13248512 passes = 60.001 sec
This machine benchmarks at 220804.853252 dhrystones/second
Dhrystone time for 13248512 passes = 60.001 sec
This machine benchmarks at 220804.853252 dhrystones/second
...
Dhrystone Benchmark for STM32F746 | Mbed
1. DISCO-F746NG (STM32F746NG ARM Cortex-M7 MCU with FPU @ 216MHz) :1243666 dhrystones/second
2. ST Nucleo F446RE (STM32F446RET6 ARM Cortex-M4 MCU with FPU @ 180MHz) : 737467 dhrystones/second
3. NXP LPCXpresso4337 (LPC4337 ARM Cortex-M4 MCU with FPU @ 204MHz) : 725736 dhrystones/second
4. DISCO-F469NI (STM32F469NIH6 ARM Cortex-M7 MCU with FPU @ 180MHz) : 670980 dhrystones/second
5. Seeed Arch Max (STM32F407VET6 ARM Cortex-M4 MCU with FPU @ 168MHz) : 667266 dhrystones/second
6. ST Nucleo F411RE (STM32F411RET6 ARM Cortex-M4 MCU with FPU @ 100MHz) : 399424 dhrystones/second
7. ST Nucleo F401RE (STM32F411RET6 ARM Cortex-M4 MCU with FPU @ 84MHz) : 349667 dhrystones/second
8. Seeeduino-Arch-Pro (LPC1768 ARM Cortex-M3 MCU @ 96MHz) : 325093 dhrystones/second
 

Вложения

Последнее редактирование:

pvvx

Активный участник сообщества
Dhrystone Benchmark, Version 2.1 (Language: C) (IAR compiler, SDK 4.0)
RunTime 6 544 ms, CPU CLK 125.000 000 MHz, Run Cycles 1 000 000
Microseconds for one run through Dhrystone: 6.544 000
Dhrystones per Second: 152 811.734 375
Dhrystones per MHz: 1 222.493 896

Код:
Dhrystone Benchmark, Version 2.1 (Language: C)
Program compiled without 'register' attribute
Execution starts, 1000000 runs through Dhrystone
Execution ends

Final values of the variables used in the benchmark:
Int_Glob:            5
        should be:   5
Bool_Glob:           1
        should be:   1
Ch_1_Glob:           A
        should be:   A
Ch_2_Glob:           B
        should be:   B
Arr_1_Glob[8]:       7
        should be:   7
Arr_2_Glob[8][7]:    1000010
        should be:   Number_Of_Runs + 10
Ptr_Glob->
  Ptr_Comp:          268693500
        should be:   (implementation-dependent)
  Discr:             257
        should be:   0
  Enum_Comp:         277
        should be:   2
  Int_Comp:          281
        should be:   17
  Str_Comp:          -
        should be:   DHRYSTONE PROGRAM, SOME STRING
Next_Ptr_Glob->
  Ptr_Comp:          268693500
        should be:   (implementation-dependent), same as above
  Discr:             257
        should be:   0
  Enum_Comp:         277
        should be:   1
  Int_Comp:          281
        should be:   18
  Str_Comp:          -
        should be:   DHRYSTONE PROGRAM, SOME STRING
Int_1_Loc:           5
        should be:   5
Int_2_Loc:           13
        should be:   13
Int_3_Loc:           7
        should be:   7
Enum_Loc:            1
        should be:   1
Str_1_Loc:           DHRYSTONE PROGRAM, 1'ST STRING
        should be:   DHRYSTONE PROGRAM, 1'ST STRING
Str_2_Loc:           DHRYSTONE PROGRAM, 2'ND STRING
        should be:   DHRYSTONE PROGRAM, 2'ND STRING

RunTime 6544 ms, CPU CLK 125.000000 MHz, Run Cycles 1000000
Microseconds for one run through Dhrystone: 6.544000
Dhrystones per Second:                      152811.734375
Dhrystones per MHz:                         1222.493896
Какие-то сравнения Dhrystone 2.1 on mcus - Page 1
 

Вложения

Последнее редактирование:

pvvx

Активный участник сообщества
Попробуем произвести тест скорости соединения с AP и передачи UDP пакета в режиме sleep и кол-во выпадений UDP пакетов.
Код:
/* Test Sleep + Wifi Connect */
#include "device.h"
#include "sleep_ex_api.h"
#include "analogin_api.h"
#include "gpio_irq_api.h"
#include "gpio_irq_ex_api.h"
#include "sys_api.h"
#include "diag.h"
#include "main.h"

#include <platform/platform_stdlib.h>
#include <sntp/sntp.h>
#include <lwip/sockets.h>
#include <lwip_netconf.h>
#include <dhcp/dhcps.h>
#include "wifi_conf.h"

#ifndef IP4ADDR
#define IP4ADDR(a,b,c,d) (((unsigned int)((d) & 0xff) << 24) | \
                         ((unsigned int)((c) & 0xff) << 16) | \
                         ((unsigned int)((b) & 0xff) << 8)  | \
                          (unsigned int)((a) & 0xff))
#endif

extern struct netif xnetif[NET_IF_NUM];

#define WiFi_SSID "APWIFISSDI"
#define WiFi_PASSWORD "Password"
#define WiFi_CHANNEL 1
#define WiFi_SECTYPE RTW_SECURITY_WPA2_AES_PSK
#define EXT_SERVER_IP "192.168.1.2"
#define EXT_SERVER_PORT 12345
#define DEF_ST_IP    IP4ADDR(192,168,1,72)
#define DEF_ST_MSK    IP4ADDR(255,255,255,0)
#define DEF_ST_GW    IP4ADDR(192,168,1,1)
#define ADC_NULL 0x4942

analogin_t   adc_vbat;
char *group_ip = EXT_SERVER_IP;
uint16_t port = EXT_SERVER_PORT;
char ssid[] = WiFi_SSID;
char password[] = WiFi_PASSWORD;
uint32_t channel = WiFi_CHANNEL;
uint8_t pscan_config = PSCAN_ENABLE | PSCAN_FAST_SURVEY;

uint16_t adc_read = ADC_NULL;
unsigned int active_tick, start_send_tick;

unsigned char packet[512];
int socket = -1;
struct sockaddr to;
struct sockaddr_in *to_sin = (struct sockaddr_in*) &to;
struct ip_addr ipaddr;
struct ip_addr netmask;
struct ip_addr gw;
unsigned int send_id;

void cycle_main(void)
{
    rtw_wifi_setting_t setting;
      int flg = 0;
    LwIP_Init();
    while(1) {
        start_send_tick = xTaskGetTickCount();
        ConfigDebugClose = 1;
        analogin_init(&adc_vbat, AD_2);
        adc_read = analogin_read_u16(&adc_vbat) - ADC_NULL;
          analogin_deinit(&adc_vbat);
 
        if(!flg) {
            wifi_on(RTW_MODE_STA);
            if(wifi_connect(ssid, WiFi_SECTYPE, password, strlen(WiFi_SSID), strlen(WiFi_PASSWORD), -1, NULL) != RTW_SUCCESS)
                    continue;
            wifi_get_setting(WLAN0_NAME, &setting);
            channel = setting.channel;
            if( LwIP_DHCP(0, DHCP_START) == DHCP_ADDRESS_ASSIGNED) {
                ipaddr = xnetif[0].ip_addr;
                netmask = xnetif[0].netmask;
                gw = xnetif[0].gw;
            } else {
                ipaddr.addr = DEF_ST_IP;
                netmask.addr = DEF_ST_MSK;
                gw.addr = DEF_ST_GW;
            }
              flg = 1;
        } else {
              wifi_rf_on();
            if(wifi_set_pscan_chan((uint8_t *)&channel, &pscan_config, 1) < 0) {
                  ConfigDebugClose = 0;
                  printf("Error listen beacon quickly!\n");
            }
            if(wifi_connect(setting.ssid, setting.security_type, setting.password, strlen(setting.ssid), strlen(setting.password), setting.key_idx, NULL) != RTW_SUCCESS)
                continue;
            netif_set_addr(&xnetif[0], &ipaddr , &netmask, &gw);
        }         
        if((socket = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
              ConfigDebugClose = 0;
            printf("Error open socket!\n");
            flg = 0;
        } else {
            to_sin->sin_family = AF_INET;
            to_sin->sin_port = htons(port);
            to_sin->sin_addr.s_addr = inet_addr(group_ip);
            if(!active_tick) active_tick = xTaskGetTickCount();
              ConfigDebugClose = 0;
            sprintf(packet, "ID:0x%08x\tADC:0x%04x\tT:%d ms\n", send_id, adc_read, active_tick);
            if(sendto(socket, packet, strlen(packet), 0, &to, sizeof(struct sockaddr)) < 0) {
                printf("Error send!\n");
                flg = 0;
            } else {
                printf(packet);
            }
            closesocket(socket);
        }
        wifi_rf_off();
          send_id++;
        active_tick = xTaskGetTickCount() - start_send_tick;
        sleep_ex(SLEEP_WAKEUP_BY_STIMER, (active_tick < 2048) ? 1024*8 - 2 - active_tick : 1024*8 - 1);
        // test_tmp()...
        sleep_ex(SLEEP_WAKEUP_BY_STIMER, 8191);
        // test_tmp()...
    }
}

void main(void)
{
    ConfigDebugClose = 1;

    if(xTaskCreate( (TaskFunction_t)cycle_main, "main", (2048/4), NULL, (tskIDLE_PRIORITY + 1), NULL)!= pdPASS) {
        ConfigDebugClose = 0;
        DiagPrintf("Cannot create main task\n");
    } else
        vTaskStartScheduler();
}
В примере, после подачи питания, производится соединение с AP и получение IP через DHCP. Выданный IP и некоторые параметры соединения запоминаются. Далее, после каждого sleep() длительностью 16 сек, производится новое соединение с AP, но у же с фиксированным IP, полученным при первом соединении.

При каждом соединении передается номер соединения (ID), значение напряжения батареи 3.3В в единицах АЦП (ADC) и полное время затраченное обработку прошлого цикла активности (T).
WiFiSleep1.gif
Время цикла активности измеряется между просыпанием и засыпанием в sleep() и включает в себя:
Измерение Vbat, поиск и соединение с AP , передача значений по UDP на внешний сервер, отключения WiFi.

Как показывает практика и замеры работы WiFi в городском шуме, практически каждый 10..20-ый пакет UDP теряется. Протокол по UDP с подтверждением и повторами не имеет никакого смыслу, т.к. тогда проще использовать TCP.

Среднее значение цикла активности за 220 соединений c паузой по 16 сек (примерно 1 час) вышло около 481 мс (тред 476 мс).
WiFiSleep2.gif
Лог с самого модуля приложен, см. wifi_con_slp_log.txt.

PS: Можно сравнить с тестом на требуемую энергию для соединения модуля RTL8710BN с внешней AP в SDK 4.0b здесь) по полному циклу по стандарту WiFi в режиме получения IP по DHCP, где время среднее время активности выходит более 3-х секунд, как и в случае первого соединения в данном тесте, производимого для получения информации для последующих укороченных соединений...
 

Вложения

Последнее редактирование:
Сверху Снизу