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-х секунд, как и в случае первого соединения в данном тесте, производимого для получения информации для последующих укороченных соединений...
 

Вложения

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