Эмулятор eeprom, как использовать на Maple Mini ?

z1rqdym
Чт 17 сентября 2015 г., 14:50
Я хочу использовать эмуляцию EEPROM на Maple Mini (Baite Clone).
Я нахожу эту библиотеку, данную в этой теме.

ViewTopic.PHP?f = 13&t = 274

У меня есть некоторые значения по поводу этой библиотеки эмуляции EEPROM.

1.) как использовать эту библиотеку? Я посмотрел в примере, но я ничего не получил.

2.Я надеюсь, что эта эмуляция не записывает оригинальный загрузчик или DEO IT?

Мадиас
Чт 17 сентября 2015 г. 15:01
Должен быть пример, как я вижу на GitHub:
https: // github.com/rogerclarkmelbourne/ ... Om_example

z1rqdym
Чт 17 сентября 2015 г. 15:12
#define RX1 PA0 //timer 2, channel 1 uint16_t ccr1, ccr2, measure; void setup() { Serial.begin(115200); pinMode(RX1, INPUT); TIMER2->regs.gen->CCMR1 = 0b100000001; TIMER2->regs.gen->CCMR2 = 0b0; TIMER2->regs.gen->CCER = 0b00110001; TIMER2->regs.gen->SMCR = 0b1010100; Timer2.attachInterrupt(TIMER_CH1, ppm_pwm_input); } void loop() { /******************************************************************** *SystemFrequency/1000 1ms = 7200 cykliCPU / 1ms * *SystemFrequency/100000 10us = 720 cykliCPU / 10us * *SystemFrequency/1000000 1us = 72 cykliCPU / 1us * ********************************************************************/ if(measure != 0){ Serial.print(ccr1/7200); Serial.print("\t"); Serial.println(ccr2/7200); measure = 0; } } void ppm_pwm_input(void) { measure = 1; ccr1 = TIMER2->regs.gen->CCR1; ccr2 = TIMER2->regs.gen->CCR2; } /* PWM input mode example: CC1S bits in CCMR1 set to 01 - CC1 channel is configured as input, IC1 is mapped on TI1 - CCR1 IC1PSC bits in CCMR1 set to 00 - no prescaler, capture is done each time an edge is detected on the capture input IC1F bits in CCMR1 set to 0000 - No filter, sampling is done at fDTS CC2S bits in CCMR1 set to 10 - CC2 channel is configured as input, IC2 is mapped on TI1 - CCR2 IC2PSC bits in CCMR1 set to 00 - no prescaler, capture is done each time an edge is detected on the capture input IC2F bits in CCMR1 set to 0000 - No filter, sampling is done at fDTS CCMR1: 0b100000001 | IC2F | IC2PSC | CC2S | IC1F | IC1PSC | CC1S | | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | PWM: | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | ---------------- CC1E bits in CCER set to 1 - enable capture CC1P bits in CCER set to 0 - rising edge CC2E bits in CCER set to 1 - enable capture CC2P bits in CCER set to 1 - falling edge CCER: 0b00110001 | Reserv. | CC4P | CC4E | Reserv. | CC3P | CC3E | Reserv. | CC2P | CC2E | Reserv. | CC1P | CC1E | | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | PWM: | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | ---------------- ETP bits in SMCR set to 0 - ETR is non-inverted, active at high level or rising edge ECE bits in SMCR set to 0 - External clock mode 2 disabled ETPS bits in SMCR set to 00 - Prescaler OFF ETF bits in SMCR set to 0000 - No filter, sampling is done at fDTS MSM bits in SMCR set to 0 - No action TS bits in SMCR set to 101 - Filtered Timer Input 1 (TI1FP1) SMS bits in SMCR set to 100 - Reset Mode - Rising edge of the selected trigger input (TRGI) reinitializes the counter and generates an update of the registers SMCR: 0b1010100 | ETP | ECE | ETPS | ETF | MSM | TS | Reserv. | SMS | | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | Reserv. | 2 | 1 | 0 | PWM: | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | Reserv. | 1 | 0 | 0 | */

Мадиас
Чт 17 сентября 2015 г. 15:19
Поскольку Maple Mini является STM32F103RCBT6 (так «RB»), вы должны использовать volatile uint32_t *DWT_CONTROL = (uint32_t *) 0xE0001000; volatile uint32_t *DWT_CYCCNT = (uint32_t *) 0xE0001004; volatile uint32_t *DEMCR = (uint32_t *) 0xE000EDFC; volatile uint32_t *LAR = (uint32_t *) 0xE0001FB0; // <-- added lock access register *DEMCR = *DEMCR | 0x01000000; // enable trace *LAR = 0xC5ACCE55; // <-- added unlock access to DWT (ITM, etc.)registers *DWT_CYCCNT = 0; // clear DWT cycle counter *DWT_CONTROL = *DWT_CONTROL | 1; // enable DWT cycle counter // some code here // ..... count = *DWT_CYCCNT;

z1rqdym
Чт 17 сентября 2015 г. 15:37
Только 10 тыс? это не хорошо для меня. Microchip PIC32, DSPIC и другой UC, имеют 100 тыс. Я думаю, что я собираюсь купить SPI или i2c eeprom.
Спасибо за ответ :)

Мадиас
Чт 17 сентября 2015 г. 15:47
Если вам нужно много хранения (2-4 МБ), чем захватить Aliexpress некоторые эти Winbond W25Q64xxx
Я написал для них библиотеку:
http: // www.STM32duino.com/viewtopic.PHP?f = 13&t = 9
Вам также нужна для них доска адаптеров SMD (общая дешевая на Али, у меня есть 8 и 16 -футовые доски, и они мне нужны все время)

Ахулл
Чт 17 сентября 2015 г. 15:48
За то, что стоит претензий GD32F103XX, имея 100 тыс. Циклы записи - http: // www.RealSense.компонент.CN/скачать/20 ... 25_159.PDF Страница 40 Однако поддержка GD32 все еще находится в стадии разработки.

Я подозреваю, что с тщательным использованием эмулированной вспышки я.эн. Только написание, когда это абсолютно необходимо, даже 10 тыс. Цикл будет достаточно для большинства вариантов использования, поскольку обычно используется Eerom. Все, что требует более нескольких циклов записи в день, и его время для добавления внешнего хранения или риска преждевременного сбоя продукта. Задняя часть расчета конверта предполагает, что срок службы в 10 000 велосипедов позволяет 27 циклов в день в течение годичного срока службы, 100 000 позволяет 270 циклов в день в течение годичного срока службы (13.5 или 135 в день в течение 2 -летней жизни, 6.7 или 67 в день для 4 -летней жизни и т. Д. для STM или GD32 соответственно). Эти цифры также предполагают, что вы каждый раз переписываете один и тот же блок.

z1rqdym
Чт 17 сентября 2015 г., 19:06
Причина использования EEPROM - сохранить прирост PID. Я меняю эти выгоды каждый раз, программируя доску, это тратит мне много времени. Необходимо настроить 9 усиления. Только сегодня я меняю эти значения 50 раз. И еще не может найти полезной выгоды. По этой причине я не знаю циклов R/W на EEPROM или Flash Pemory. Купил microchip 24lc512 i2c eeprom . Его памяти достаточно для меня :) Но я должен написать код для использования их с i2CdevLib, потому что я использую i2Cdevlib для использования MPU6050 для получения данных DMP.

Мадиас
Чт 17 сентября 2015 г., 8:20 вечера
Именно для этого EEPROM у меня есть две библиотеки и примеры наброска.
Почему две библиотеки?
Первый используется с стандартом STM32Duino «Программное обеспечение» I2C, второй с Adwarwware I2C («HW» или «Hardwire»).
Не стесняйтесь использовать их (надеюсь, я включил оригинального автора!)

Мадиас
Чт 17 сентября 2015 г., 8:24 вечера
ОК, и здесь просто простой эскиз без библиотеки (программное обеспечение i2c): /* CC1S bits in CCMR1 set to 01 - CC1 channel is configured as input, IC1 is mapped on TI1 - CCR1 CCMR1: | IC2F | IC2PSC | CC2S | IC1F | IC1PSC | CC1S | | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | ---------------- CC1E bits in CCER set to 1 - enable capture CC1P bits in CCER set to 1 - falling edge CCER: | Reserv. | CC4P | CC4E | Reserv. | CC3P | CC3E | Reserv. | CC2P | CC2E | Reserv. | CC1P | CC1E | | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | */ #define RX1 PA0 //timer 2, channel 1 int c = 0, data_ready = 0; String out1, out2; volatile uint32_t *DWT_CONTROL = (uint32_t *) 0xE0001000; volatile uint32_t *DWT_CYCCNT = (uint32_t *) 0xE0001004; volatile uint32_t *DEMCR = (uint32_t *) 0xE000EDFC; volatile uint32_t *LAR = (uint32_t *) 0xE0001FB0; // <-- added lock access register void setup() { Serial.begin(115200); pinMode(RX1, INPUT); *DEMCR = *DEMCR | 0x01000000; // enable trace *LAR = 0xC5ACCE55; // <-- added unlock access to DWT (ITM, etc.)registers Timer2.setPrescaleFactor(72); // set prescaler to get us (micro sec) counting, It can be changed on the fly as this control register is buffered TIMER2->regs.gen->CCMR1 = 0b1; TIMER2->regs.gen->CCMR2 = 0b0; TIMER2->regs.gen->CCER = 0b11; Timer2.attachInterrupt(TIMER_CH1, ppm_input); } void loop() { /******************************************************************** *SystemFrequency/1000 1ms = 7200 cykliCPU / 1ms * *SystemFrequency/100000 10us = 720 cykliCPU / 10us * *SystemFrequency/1000000 1us = 72 cykliCPU / 1us * ********************************************************************/ if(data_ready != 0){ if(out1.length() > 4){ Serial.print("String1 : "); Serial.println(countImpuls(out1)); out1 = ""; } if(out2.length() > 4){ Serial.print("String2 : "); Serial.println(countImpuls(out2)); out2 = ""; } data_ready = 0; } } void ppm_input(void) { if(c == 0){ // falling edge TIMER2->regs.gen->CCER = 0b1; // edge detection change c = 1; // go to second entrance *DWT_CYCCNT = 0; // clear DWT cycle counter *DWT_CONTROL = *DWT_CONTROL | 1; // enable DWT cycle counter } else { // rising edge if(((*DWT_CYCCNT)/72) < 50){ out1 += ((*DWT_CYCCNT)/72); out1 += " "; } else if(((*DWT_CYCCNT)/72) >= 50 &&((*DWT_CYCCNT)/72) < 200){ out2 += ((*DWT_CYCCNT)/72); out2 += " "; } else { data_ready = 1; // data ready } TIMER2->regs.gen->CCER = 0b11; // edge detection change c = 0; // go to first entrance } TIMER2->regs.gen->SR = 0; // delete capture input flag notification } int countImpuls(String message){ int x = 0, commaPosition = 0; do { commaPosition = message.indexOf(' '); if(commaPosition != -1) { x++; message = message.substring(commaPosition+1, message.length()); } else { } } while(commaPosition >=0); return x; }

Маркировать
Ср 21 октября 2015 г. 12:55
Я только что столкнулся с этим. Не могли бы мы получить больше от этого, если повернут адреса? Это в конечном итоге станет проблемой для меня, так как мне нужно, чтобы моя доска была очень маленькой.

ZMEMW16
Ср 21 октября 2015 г. 1:28
Это только такая запись, которая наносит упор на стойку?
Если да, напишите временную метку в блоке записи, может быть maple_loader v0.1 Resetting to bootloader via DTR pulse Searching for DFU device [1EAF:0003]... dfu-util - (C) 2007-2008 by OpenMoko Inc. Couldn't find the DFU device: [1EAF:0003] This program is Free Software and has ABSOLUTELY NO WARRANTY

Аранеус
Солнце 20 мая 2018 г. 18:57
[z1rqdym - Четверг 17 сентября 2015 г., 19:06] - Причина использования EEPROM - сохранить прирост PID. Я меняю эти выгоды каждый раз, программируя доску, это тратит мне много времени. Необходимо настроить 9 усиления. Только сегодня я меняю эти значения 50 раз. И еще не может найти полезной выгоды. По этой причине я не знаю циклов R/W на EEPROM или Flash Pemory. Купил microchip 24lc512 i2c eeprom . Его памяти достаточно для меня :) Но я должен написать код для использования их с i2CdevLib, потому что я использую i2Cdevlib для использования MPU6050 для получения данных DMP.
Поскольку вам нужно хранить коэффициенты PID, я предполагаю, что вы будете хранить их как значения поплавок.

Если вы все еще хотите использовать флэш -память: у меня был тот же вопрос: ViewTopic.PHP?F = 28&t = 3321
И есть решение в этой теме.

Pokemon99
Пн 21 мая 2018 г., 5:53
Нет необходимости хранить такие значения, как Float, вы можете хранить Int16, а затем конвертировать в Float

float int_to_float (int16_t ввод)
{
Возврат (вход / 10 + вход % 10 * 0.1);
}