• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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
А то тут:
 

Вложения

Сверху Снизу