• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Важно Документация на esp8266 на нашем сайте. пополняемый раздел.

jcmvbkbc

New member
void wdt_feed(void) { system_rtc_mem_read(????); if(? == 2) system_rtc_mem_write(0,?,28); ets_post(30,0,0); }
Вообще-то
Код:
void wdt_feed(void)
{
    uint32_t p[7];
    system_rtc_mem_read(0, p, 28);
    if (p[0] != 2) {
        p[0] = 1;
        p[1] = SR_EXCCAUSE;
        p[2] = SR_EPC1;
        p[3] = SR_EPC2;
        p[4] = SR_EPC3;
        p[5] = SR_EXCVADDR;
        p[6] = SR_DEPC;
        system_rtc_mem_write(0, p, 28);
    }
    ets_post(30, 0, 0);
}
 

pvvx

Активный участник сообщества

pvvx

Активный участник сообщества
ADC на базе system_read_adc():
Код:
/*
* adc.c
*
*  Created on: 12/02/2015
*      Author: PV`
*
*/

#include "ets_sys.h"
#include "osapi.h"


void ICACHE_FLASH_ATTR read_adcs(uint16 *ptr, uint16 len)
{
    if(len != 0 && ptr != NULL) {
        uint32 y;
        uint16 z;
        uint16 sar_x[8];
#if (0)
        uint32 store_reg710 = READ_PERI_REG(0x60000710);
        uint32 store_reg58e = READ_PERI_REG(0x600005e8);
        uint32 store018 = READ_PERI_REG(0x3FF00018);
        if((store_reg710 & 0xfe000000) != 0xfe000000) {
            SET_PERI_REG_MASK(0x3FF00018,0x038f0000);
            SET_PERI_REG_MASK(0x60000710,0xfe000000);
            rom_i2c_writeReg_Mask(98,1,3,7,4,15);
            rom_sar_init();
            ets_delay_us(2);
            SET_PERI_REG_MASK(0x600005e8,0x01800000);
            ets_delay_us(2);
        }
        else pm_set_sleep_mode(4);
#endif
        rom_i2c_writeReg_Mask(108,2,0,5,5,1);
        SET_PERI_REG_MASK(0x60000D5C,0x00200000);
          while(READ_PERI_REG(0x60000D50)&(0x7<<24));
        while(len--) {
            CLEAR_PERI_REG_MASK(0x60000D50,2);
            SET_PERI_REG_MASK(0x60000D50,2);
              while(READ_PERI_REG(0x60000D50)&(0x7<<24));
              read_sar_dout(&sar_x[0]);
            z = 0;
            for(y = 0; y < 8; y++) z += sar_x[y];
            z += 8;
            z >>= 4;
            *ptr++ = z;
        };
        rom_i2c_writeReg_Mask(108,2,0,5,5,0);
        while(READ_PERI_REG(0x60000D50)&(0x7<<24));
        CLEAR_PERI_REG_MASK(0x60000D5C,0x00200000);
        CLEAR_PERI_REG_MASK(0x60000D60,1);
        SET_PERI_REG_MASK(0x60000D60,1);
#if (0)
        if((store_reg710 & 0xfe000000) != 0xfe000000) {
            WRITE_PERI_REG(0x600005e8,((READ_PERI_REG(0x600005e8) & 0xfe7fffff) | 0x00800000));
            rom_i2c_writeReg_Mask(98,1,3,7,4,0);
            WRITE_PERI_REG(0x60000710, store_reg710);
            WRITE_PERI_REG(0x3FF00018, store018);
        }
        else    pm_wakeup_init(4,0);
#endif
    }
}
Пример рабочий. Скорость ADC в нем низкая ~ 20000 отсчетов в секунду (аналогично и у system_read_adc()).
If-ом закоментил инициализацию и восстановление из system_read_adc - они в некоторых случаях не нужны (к примеру в моем web для теста скорости ADC). По нормальному чтение ADC надо делать по прерыванию таймера...
 
Последнее редактирование:

pvvx

Активный участник сообщества
jcmvbkbc - исходников встроенного отладчика для работы с внешним портом (COM к примеру) и пару точками останова для работы прямо в xtensa-lx106 не существует? Это было бы самым простым решением и подошло бы многим. Там вроде требуется минимальное кол-во ресурсов - всё остальное должно обрабатываться внешне (желательно как debug прямо в Eclipse :) ).
С эмуляторами всё гораздо сложнее при неизвестной аппаратуре чипа.
 

jcmvbkbc

New member
jcmvbkbc - исходников встроенного отладчика для работы с внешним портом (COM к примеру) и пару точками останова для работы прямо в xtensa-lx106 не существует?
У меня есть в основном рабочий gdbstub рассчитанный на взаимодействие с gdb через разделяемую память. Можно попытаться прикрутить его к последовательному порту.

Но логичнее было бы использовать нормальный JTAG. Я сейчас занимаюсь этим.
 
Последнее редактирование:

pvvx

Активный участник сообщества
У меня есть в основном рабочий gdbstub рассчитанный на взаимодействие с gdb через разделяемую память. Можно попытаться прикрутить его к последовательному порту.

Но логичнее было бы использовать нормальный JTAG. Я сейчас занимаюсь этим.
1) Как вы видите исполнение JTAG у народу на модуле ESP-01?
2) JTAG предполагается на чем? Самое верное, наверно, на модуле c CY7C68013A? Их много на aliexpress и они дешевы.
 
Последнее редактирование:

jcmvbkbc

New member
1) Как вы видите исполнение JTAG у народу на модуле ESP-01?
Лучше на ESP03 -- там всё для этого есть. На ESP01 можно отпаять чип, отрезать MTDO от земли, припаять чип, припаять дополнительные выводы.
2) JTAG предполагается на чем? Самое верное, наверно, на модуле c CY7C68013A? Их много на aliexpress и они дешевы.
У меня был ARM-USB-TINY-H, я его прикрутил. По идее почти любой FTDI 2232-based должен работать.
 

jcmvbkbc

New member
Скорость не та, а High-speed USB2.0 FT-шки стоят дороговато...
Я предлагаю вариант, который точно будет работать с уже имеющимся софтом. Для других чипов придётся править xt-ocd, а для этого надо сначала получить его исходники.
 

pvvx

Активный участник сообщества
Я предлагаю вариант, который точно будет работать с уже имеющимся софтом. Для других чипов придётся править xt-ocd, а для этого надо сначала получить его исходники.
Точная схема ARM-USB-TINY-H есть? Или всё как в http://microsin.net/programming/ARM/openocd-manual-part1.html - "засИкречено" кучей никчемной инфы ?
<configuration> от туда?
 

jcmvbkbc

New member
Точная схема ARM-USB-TINY-H есть?
У меня нет схемы, но она в любом случае типовая для FT2232H.
Есть схема Flyswatter, который тоже поддерживается: http://www.tincantools.com/assets/FLYSWATTER_REV-B.pdf

По этой ссылке конфигурация для FT2232H встроенного в отладочную плату KC705.
Конфигурация для arm-usb-tiny-h которую я использовал -- тут: http://www.esp8266.com/viewtopic.php?f=9&t=31&start=10#p3435
 
Последнее редактирование:

pvvx

Активный участник сообщества
jcmvbkbc - Как это описать на "СИ":
rsr.epc2 axx
rsr.epc3 axx
rsr.excvaddr axx
rsr.depc axx

или :
p[1] = SR_EXCCAUSE;
p[2] = SR_EPC1;
p[3] = SR_EPC2;
p[4] = SR_EPC3;
p[5] = SR_EXCVADDR;
p[6] = SR_DEPC;

Где объявления этих SR_xxx и возможно пример?
Так как-то не красиво:
asm volatile("rsr %0,%1" : "=r" (destination) : "n" (EXCCAUSE));
 
Последнее редактирование:

jcmvbkbc

New member
jcmvbkbc - Как это описать на "СИ":
rsr.epc2 axx
rsr.epc3 axx
rsr.excvaddr axx
rsr.depc axx

или :
p[1] = SR_EXCCAUSE;
p[2] = SR_EPC1;
p[3] = SR_EPC2;
p[4] = SR_EPC3;
p[5] = SR_EXCVADDR;
p[6] = SR_DEPC;

Где объявления этих SR_xxx и возможно пример?
Я не видел подобных объявлений в коде espressif. Возможно, лучше было бы написать так:
Код:
#define SR_EPC1 177
#define SR_EPC2 178
#define SR_EPC3 179
#define SR_DEPC 192
#define SR_EXCCAUSE 232
#define SR_EXCVADDR 238

#define __stringify_1(x...)  #x
#define __stringify(x...)  __stringify_1(x)
#define RSR(sr) ({uint32_t r; asm volatile ("rsr %0,"__stringify(sr) : "=a"(r)); r;})

p[1] = RSR(SR_EXCCAUSE);
p[2] = RSR(SR_EPC1);
p[3] = RSR(SR_EPC2);
p[4] = RSR(SR_EPC3);
p[5] = RSR(SR_EXCVADDR);
p[6] = RSR(SR_DEPC);
Данные по специальным регистрам можно взять из ISA, раздел 5.3 Special Registers: http://0x04.net/~mwk/doc/xtensa.pdf
 

pvvx

Активный участник сообщества
#define SR_xxxx не нужны - они есть в #include <xtensa/specreg.h>
Оптимизированная wdt_feed из SDK 0.9.6:
Код:
#include "esp8266.h"
#include "ets.h"
#include <xtensa/specreg.h>

#define __stringify_1(x...)  #x
#define __stringify(x...)  __stringify_1(x)
#define RSR(sr) ({uint32_t r; asm volatile ("rsr %0,"__stringify(sr) : "=a"(r)); r;})

static ETSEventQueue wdt_eventq;

void wdt_feed(void)
{
    struct rst_info rst_info;
    rst_info.exccause = RSR(EXCCAUSE);
    rst_info.epc1 = RSR(EPC1);
    rst_info.epc2 = RSR(EPC2);
    rst_info.epc3 = RSR(EPC3);
    rst_info.excvaddr = RSR(EXCVADDR);
    rst_info.depc = RSR(DEPC);

    system_rtc_mem_read(0, &rst_info.flag, 4);

    if (rst_info.flag != EXP_RST_FLAG) {
        rst_info.flag = WDT_RST_FLAG;
        system_rtc_mem_write(0, &rst_info, sizeof(rst_info));
    }

    ets_post(0x1e, 0, 0);
}
....
И то всё это не нужно, т.к. используется только для отладки в IoT
user_esp_platform_init:
ESP_DBG("flag = %d,epc1 = 0x%08x,epc2=0x%08x,epc3=0x%08x,excvaddr=0x%08x,depc=0x%08x,\nFatal \
exception (%d): \n",rtc_info.flag,rtc_info.epc1,rtc_info.epc2,rtc_info.epc3,rtc_info.excvaddr,rtc_info.depc,rtc_info.exccause);
Больше - нигде.
 
Последнее редактирование:

pvvx

Активный участник сообщества
А весь архив с этого адреса не могли бы выложить для ознакомления ... удалили так , что ни в Googlecash ни в WebArchiv - е нету ....
Он уже переписан согласно SDK 1.0.1, оптимизирован и изменен алго в "свалке" и работает с SDK, и пока, в версии Ver 0.2.4 (16.04.2015) "свалки" в app\web\wdt.c
А то тут:
 

Вложения

Сверху Снизу