toksoft Опубліковано: 25 жовтня 2018 Автор Поділитись Опубліковано: 25 жовтня 2018 Да, внешние прерывания не используются, многопоточность (если я правильно понял) тоже. АЦП непрерывно в фоне преобразовывает и через ДМА ложит данные в массив. (также передрал из примеров) 20мА в активном режиме считаю вполне приемлемым потреблением, чтобы морочиться с ждущими режимами, поэтому мне намного проще чем вам с брелком Еще раз - в серии f030 vbat нет - это ультрабюджетная серия. Если нужен vbat - это f103 Ого,- DMA я на stm еще ни разу не использовал. Очень хотел на atmega, там все гораздо проще, но нужен ram. У меня только одна динамическая таблица брелков может 6к занять, поэтому пришлось выбирать кристалл с большим объемом RAM. Из линейки CORTEX, я использовал только 2 кристалла, и это не f030. Что-то мне не очень хочется снова погружаться в раскопки очередной архитектуры, и прогуливаться по швабрам. P.S. Вот выложил уже практически все детали. Код что-ли начать публиковать, чтобы наконец уважаемый diver перестал рекламировать gsm, и перешел на более современные технологии ? Посилання на коментар Поділитися на інших сайтах More sharing options...
unreal1975 Опубліковано: 25 жовтня 2018 Поділитись Опубліковано: 25 жовтня 2018 Ого,- DMA я на stm еще ни разу не использовал. Очень хотел на atmega, там все гораздо проще, но нужен ram. У меня только одна динамическая таблица брелков может 6к занять, поэтому пришлось выбирать кристалл с большим объемом RAM. Из линейки CORTEX, я использовал только 2 кристалла, и это не f030. Что-то мне не очень хочется снова погружаться в раскопки очередной архитектуры, и прогуливаться по швабрам. P.S. Вот выложил уже практически все детали. Код что-ли начать публиковать, чтобы наконец уважаемый diver перестал рекламировать gsm, и перешел на более современные технологии ? Та я как бы тоже не хотел тратить время на разбирательства как оно работает, но оказалось что обработки нескольких каналов без ДМА никто не делает. По факту очень удобно-есть массив, который время от времени сам обновляется. код не публикуйте-пускай свои шишки набивают )) Посилання на коментар Поділитися на інших сайтах More sharing options...
toksoft Опубліковано: 26 жовтня 2018 Автор Поділитись Опубліковано: 26 жовтня 2018 (змінено) Давайте упростим задачу тем, кто только решается начать свой проект, и для тех, кто уже активно кодит. В соседней ветке я пытался "продать" идею fifo, но наверное или я как-то путанно мысли излагал, или может еще что либо. Код (C++, template): template<typename T, uint16_t Z> class fifo { public: fifo () { _nNum = 0 ; _first = _last = NULL ; _nMax = Z ; bLock = false ; } ~fifo () { clear () ; } void clear ( void ) { T sTmp ; ets_intr_lock () ; while ( _first ) { sTmp = _first->next ; delete _first ; _first = sTmp ; } _last = _first ; _nNum = 0 ; ets_intr_unlock () ; } bool isLocked ( void ) { return bLock ; } T operator [] ( uint16_t nIndex ) { T sRes = _first ; ets_intr_lock () ; for ( uint16_t i = 0 ; i < nIndex ; i++ ) { if ( !sRes ) break ; else sRes = sRes->next ; } ets_intr_unlock () ; return sRes ; } T push ( T new_el ) { T sRes = NULL ; ets_intr_lock () ; if ( new_el ) { new_el->next = NULL ; if ( _nNum == 0 ) { _first = _last = new_el ; sRes = new_el ; _nNum++ ; } // Empty list else { if ( _nNum >= _nMax && _nMax > 0 ) { sRes = _first->next ; delete _first ; _first = sRes ; _nNum-- ; } if ( _nNum == 0 ) _first = _last = new_el ; else { _last->next = new_el ; _last = _last->next ; } // at least 1 element in fifo (case of _nMax = 1) sRes = new_el ; _nNum++ ; } // Non-empty list } // At least 1 element is present ets_intr_unlock () ; return sRes ; } T pop ( void ) { T sRes = NULL ; ets_intr_lock () ; if ( _first ) { sRes = _first ; _first = _first->next ; _nNum-- ; } ets_intr_unlock () ; return sRes ; } bool isEmpty ( void ) { return ( _nNum == 0 ) ; } uint16_t size ( void ) { return _nNum ; } private: T _first, _last ; uint16_t _nNum, _nMax ; bool bLock ; } ; Тут используется несколько системных вызовов (типа cli/sti), которые нужно изменить на соотв. для кристалла, который вы планируете использовать. interrupts/thread safe. Наверное вам пригодилось бы "легкое напоминание", как можно получить параметры сенсора, без использования float. Например так (для BMx280): int32_t i2cs::bmx280_temperature_c ( void ) { int32_t t_raw, var1, var2 ; if ( ( t_raw = bmx280_temperature_raw () ) == ERR_TEMP ) return ERR_TEMP ; var1 = ((((t_raw>>3) - ((int32_t)bmx280_C.dig_T1<<1))) * ((int32_t)bmx280_C.dig_T2)) >> 11 ; var2 = (((((t_raw>>4) - ((int32_t)bmx280_C.dig_T1)) * ((t_raw>>4) - ((int32_t)bmx280_C.dig_T1))) >> 12) * ((int32_t)bmx280_C.dig_T3)) >> 14 ; bmx280_t_fine = var1 + var2 ; return ( bmx280_t_fine * 5 + 128 ) >> 8 ; } Змінено 26 жовтня 2018 користувачем toksoft Посилання на коментар Поділитися на інших сайтах More sharing options...
unreal1975 Опубліковано: 26 жовтня 2018 Поділитись Опубліковано: 26 жовтня 2018 Наверное вам пригодилось бы "легкое напоминание", как можно получить параметры сенсора, без использования float. Например так (для BMx280): Неееееееееее )))) какой смысл пересаживаться на мерседес и ехать 20кмч? Сроки всегда жмут, а по человечески написанные формулы намного легче отлаживать Посилання на коментар Поділитися на інших сайтах More sharing options...
toksoft Опубліковано: 27 жовтня 2018 Автор Поділитись Опубліковано: 27 жовтня 2018 Неееееееееее )))) какой смысл пересаживаться на мерседес и ехать 20кмч? Сроки всегда жмут, а по человечески написанные формулы намного легче отлаживать Так это же "почти родная" библиотека, которую предоставляет BOSCH. Немного подпилить, и пожалуйста - никаких вам float point. "<<" и ">>" это простой bit shifting. Зачем делить, скажем на 4, если можно просто сдвинуть на 2 бита вправо (для целочисленных вычислений) ? Если беспокоит потеря точности, дык умножьте хоть на 1000, а потом уже сдвигайте. int32 это 4 байта, по 8 bit каждый. Учитывая знак, 2147483647 (в десятичном исчислении). Как для температурного датчика - более чем. Ну или 0К. -273 к с копейками. Если вам удастся зафиксировать температуру ниже,- я буду крайне удивлен. А если "прямо посередине" вашего мега-float рассчета свершится interrupt, которого "заинтересует" рассчитываемое значение ? P.S. unreal1975 - манная каша - она вкусная, а главное полезная Посилання на коментар Поділитися на інших сайтах More sharing options...
unreal1975 Опубліковано: 27 жовтня 2018 Поділитись Опубліковано: 27 жовтня 2018 (змінено) <<" и ">>" это простой bit shifting. Зачем делить, скажем на 4, если можно просто сдвинуть на 2 бита вправо (для целочисленных вычислений) ? Я так и делаю на атмегах, наигрался А если "прямо посередине" вашего мега-float рассчета свершится interrupt, которого "заинтересует" рассчитываемое значение ? стараюсь в прерывания ничего такого не совать- только в основной программе Вы ж поймите, какой смысл тратить время на эти оптимизации, если за 100грн у вас почти полноценный компьютер: www.kosmodrom.com.ua/el.php?name=STM32F103RET6 Зы кстати в разрезе датчиков-брелков stm32 также имеет преимущество- рекомендуют выводить в активном режиме ядро на максимальную частоту, чтобы сократить время выхода из спячки, у них и производительность больше и тактовая частота выше. А еще есть серия с низким потреблением Змінено 27 жовтня 2018 користувачем unreal1975 Посилання на коментар Поділитися на інших сайтах More sharing options...
toksoft Опубліковано: 28 жовтня 2018 Автор Поділитись Опубліковано: 28 жовтня 2018 Зы кстати в разрезе датчиков-брелков stm32 также имеет преимущество- рекомендуют выводить в активном режиме ядро на максимальную частоту, чтобы сократить время выхода из спячки, у них и производительность больше и тактовая частота выше. А еще есть серия с низким потреблением То есть вы предлагаете тактировать постоянно максимальной частотой для того, чтобы "выйти из sleep" побыстрее ? Мне производительность как бы не критична, в особенности для задач брелка. RA02 в общем "видит" не только базу, но и соседние брелки (в пределах видимости), но даже с учетом того, что у меня по идее может быть до 100 брелков, даже текущая производительность stm для меня сильно избыточна. Может вы майнингом криптовалют занимаетесь на кристаллах ? Посилання на коментар Поділитися на інших сайтах More sharing options...
unreal1975 Опубліковано: 29 жовтня 2018 Поділитись Опубліковано: 29 жовтня 2018 То есть вы предлагаете тактировать постоянно максимальной частотой для того, чтобы "выйти из sleep" побыстрее ? Мне производительность как бы не критична, в особенности для задач брелка. RA02 в общем "видит" не только базу, но и соседние брелки (в пределах видимости), но даже с учетом того, что у меня по идее может быть до 100 брелков, даже текущая производительность stm для меня сильно избыточна. Может вы майнингом криптовалют занимаетесь на кристаллах ? Минимизировать время в активном режиме-> увеличить ресурс батарейки Посилання на коментар Поділитися на інших сайтах More sharing options...
unreal1975 Опубліковано: 1 березня 2020 Поділитись Опубліковано: 1 березня 2020 Распаять вообще не проблема. Даже плату под неё сделать в домашних условиях. Главное чтобы периферии хватило. И несмотря на всю красивость стм-ок, в тех же драйверах фонариков (где микроконтроллер отвечает за весь интерфейс, 3 способа регулирования тока и, собственно, управление ключевым транзистором в импульсном повышающем стабилизаторе) используют именно Тиньку 85. Я не разработчик, я не знаю почему так - но факт. Плюс габариты Тиньки в корпусе QFN очень компактные, что удобно для маленьких фонариков. СТМ-ка туда физичски не поместится. Ну и следует понимать, что маааааленький глюк контроллера - и силовая схема превращается в угли. После того, как микрочип купил атмел с потрохами, на атмеле остались только те, кто по разным причинам не может перейти на что-то другое (например 1000 плат на складе) И к ассемблеру- раньше его был смысл использовать, так как не хватало либо флешки, либо быстродействия, сейчас и того и другого с избытком, поэтому применение ассемблера скорее минус Посилання на коментар Поділитися на інших сайтах More sharing options...
toksoft Опубліковано: 2 березня 2020 Автор Поділитись Опубліковано: 2 березня 2020 После того, как микрочип купил атмел с потрохами, на атмеле остались только те, кто по разным причинам не может перейти на что-то другое (например 1000 плат на складе) И к ассемблеру- раньше его был смысл использовать, так как не хватало либо флешки, либо быстродействия, сейчас и того и другого с избытком, поэтому применение ассемблера скорее минус Пофиг кто кого купил. критерии следующие: 1. Задачи, под которую нужен кристалл 2. Цена и доступность 3. Framework для разработки 4. Есть ли возможность относительно безболезненно достать dev board для прототипирования Ассемблер, C, C++, JS, JAVA, возможность визуального моделирования, ... - это инструменты. Скальпель, молоток, гвозди, пинцет, ... Если проект большой, то asm через пару месяцев надежно "замурует в трубу", ибо поддерживать и дорабатывать большой asm проект это недешевое удовольствие. Удержать в голове одновременно несколько архитектур, программируя при этом на asmе - задача достаточно сложная даже для full time. Если есть алгоритмы, которые должны отслеживаться с наносекундной дискретностью, то их имеет смысл писать на asmе, но только их. Как сейчас не знаю, но ранее (лет 15 назад) я часто встречал персонажей, со "слегка завышенной самооценкой", на предмет "идеального" знания архитектуры и asma одного конкретного кристалла или серии. Они были уверены что "если понадобиться, они с легкостью освоят и другие платформы". В 99% случаев это была ошибка. Тихо и гордо ушли в историю, вместе с их уникальными, но к сожалению безнадежно устаревшими знаниями. Любой проект (даже любительский), имеет цели и сроки. Если цель - реальный продукт, а не самозанятость для удовольствия, то нужно правильно выбирать платформу и инструментарий. Посилання на коментар Поділитися на інших сайтах More sharing options...
unreal1975 Опубліковано: 2 березня 2020 Поділитись Опубліковано: 2 березня 2020 Пофиг кто кого купил. критерии следующие: Ото атмел-микрочип по вашему же второму пункту и слился контроллер на 128к с кучей ресурсов, пинов итд итп от СТ, стоит дешеве 328й атмеги есть еще 5. число готовых примеров-библиотек, чтобы самому не писать каждую ерунду Посилання на коментар Поділитися на інших сайтах More sharing options...
toksoft Опубліковано: 2 березня 2020 Автор Поділитись Опубліковано: 2 березня 2020 Ото атмел-микрочип по вашему же второму пункту и слился контроллер на 128к с кучей ресурсов, пинов итд итп от СТ, стоит дешеве 328й атмеги есть еще 5. число готовых примеров-библиотек, чтобы самому не писать каждую ерунду Помнится в одном из сообщений, вы жаловались что "не хватет" EEPROM. Я тогда показал, что часть банков может использоваться для сохранения данных, а не кода. У stm есть 2 levels, если я правильно помню. Вы на user или system level обычно пишите свои приложения ? Сложный кристалл. Это я к тому, что порог входа высокий, и не каждый его осилит. atmega чуть попроще. P.S. Для своих брелков LoRA я пока использую atmega. Так проще, и есть готовые dev boards. Посилання на коментар Поділитися на інших сайтах More sharing options...
unreal1975 Опубліковано: 4 березня 2020 Поділитись Опубліковано: 4 березня 2020 Помнится в одном из сообщений, вы жаловались что "не хватет" EEPROM. Я тогда показал, что часть банков может использоваться для сохранения данных, а не кода. У stm есть 2 levels, если я правильно помню. Вы на user или system level обычно пишите свои приложения ? Сложный кристалл. Это я к тому, что порог входа высокий, и не каждый его осилит. atmega чуть попроще. P.S. Для своих брелков LoRA я пока использую atmega. Так проще, и есть готовые dev boards. С епром вопрос чудесным образом решился внешней микросхемой за пару гривен. Про уровни ничего не знаю Сложно запустить периферию, тут помогает гугль, дальше скучно Посилання на коментар Поділитися на інших сайтах More sharing options...
toksoft Опубліковано: 4 березня 2020 Автор Поділитись Опубліковано: 4 березня 2020 С епром вопрос чудесным образом решился внешней микросхемой за пару гривен. Про уровни ничего не знаю Сложно запустить периферию, тут помогает гугль, дальше скучно #include "flash.h" uint32_t flash_read ( uint32_t address ) { return ( *(__IO uint32_t*) address ) ; } void flash_save ( uint8_t *data, uint16_t size, uint32_t offset, uint8_t page, bool bErase ) { if ( size == 0 || size > 1024 ) return ; uint32_t st_address = FLASH_BASE + page * proto_get_page_size () + offset ; uint32_t val ; if ( bErase ) FLASH_ErasePage ( st_address ) ; for ( uint16_t i = 0 ; i < size ; i += 4 ) { val = *(data+i) ; if ( i+1 < size ) val |= *(data+i+1)<<8 ; else val &= 0x000000ff ; if ( i+2 < size ) val |= *(data+i+2)<<16 ; else val &= 0x0000ffff ; ; if ( i+3 < size ) val |= *(data+i+3)<<24 ; else val &= 0x00ffffff ; ; // flash_write ( st_address + i, val ) ; FLASH_ProgramWord ( st_address + i, val ) ; } } void flash_restore ( uint8_t *data, uint16_t size, uint32_t offset, uint8_t page ) { if ( size == 0 || size > 1024 ) return ; uint32_t st_address = FLASH_BASE + page * proto_get_page_size () + offset ; uint32_t val ; for ( uint16_t i = 0 ; i < size ; i += 4 ) { val = flash_read ( st_address + i ) ; *(data+i) = val&0x000000ff ; if ( i+1 < size ) *(data+i+1) |= ((val>>8)&0x000000ff) ; if ( i+2 < size ) *(data+i+2) |= ((val>>16)&0x000000ff) ; if ( i+3 < size ) *(data+i+3) |= ((val>>24)&0x000000ff) ; } } void flash_save ( uint8_t page ) { // 0, 1, 2 ... uint16_t size ; uint8_t *data ; if ( page == 0 ) { FLASH_Unlock () ; flash_save ( (uint8_t *)&config, sizeof ( config ), 0, DEF_PAGE ) ; data = fn.get_set ( page, &size ) ; // erase only on 1st write flash_save ( data, size, 16, DEF_PAGE, false ) ; FLASH_Lock () ; } else if ( page == 1 ) { FLASH_Unlock () ; flash_save ( (uint8_t *)&config2, sizeof ( config2 ), 0, DEF_PAGE + 1 ) ; data = fn.get_set ( page, &size ) ; // erase only on 1st write flash_save ( data, size, 16, DEF_PAGE + 1, false ) ; FLASH_Lock () ; } else if ( page == 2 ) { FLASH_Unlock () ; flash_save ( (uint8_t *)&config3, sizeof ( config3 ), 0, DEF_PAGE + 2 ) ; data = fn.get_set ( page, &size ) ; // erase only on 1st write flash_save ( data, size, 16, DEF_PAGE + 2, false ) ; FLASH_Lock () ; } else if ( page == 3 ) { FLASH_Unlock () ; flash_save ( (uint8_t *)&config4, sizeof ( config4 ), 0, DEF_PAGE + 3 ) ; data = fn.get_set ( page, &size ) ; // erase only on 1st write flash_save ( data, size, 16, DEF_PAGE + 3, false ) ; FLASH_Lock () ; } else if ( page == 4 ) { FLASH_Unlock () ; flash_save ( (uint8_t *)&config5, sizeof ( config5 ), 0, DEF_PAGE + 4 ) ; data = fn.get_set ( page, &size ) ; // erase only on 1st write flash_save ( data, size, 16, DEF_PAGE + 4, false ) ; FLASH_Lock () ; } } void flash_restore ( uint8_t page ) { // 0, 1, 2 ... uint16_t size ; uint8_t *data ; if ( page == 0 ) { flash_restore ( (uint8_t *)&config, sizeof ( config ), 0, DEF_PAGE ) ; data = fn.get_set ( page, &size ) ; flash_restore ( data, size, 16, DEF_PAGE ) ; } else if ( page == 1 ) { flash_restore ( (uint8_t *)&config2, sizeof ( config2 ), 0, DEF_PAGE + 1 ) ; data = fn.get_set ( page, &size ) ; flash_restore ( data, size, 16, DEF_PAGE + 1 ) ; } else if ( page == 2 ) { flash_restore ( (uint8_t *)&config3, sizeof ( config3 ), 0, DEF_PAGE + 2 ) ; data = fn.get_set ( page, &size ) ; flash_restore ( data, size, 16, DEF_PAGE + 2 ) ; } else if ( page == 3 ) { flash_restore ( (uint8_t *)&config4, sizeof ( config4 ), 0, DEF_PAGE + 3 ) ; data = fn.get_set ( page, &size ) ; flash_restore ( data, size, 16, DEF_PAGE + 3 ) ; } else if ( page == 4 ) { flash_restore ( (uint8_t *)&config5, sizeof ( config5 ), 0, DEF_PAGE + 4 ) ; data = fn.get_set ( page, &size ) ; flash_restore ( data, size, 16, DEF_PAGE + 4 ) ; } } void flash_save () { if ( CONF_ENTRIES >= 14 ) flash_save ( 0 ) ; if ( CONF_ENTRIES >= 28 ) flash_save ( 1 ) ; if ( CONF_ENTRIES >= 42 ) flash_save ( 2 ) ; if ( CONF_ENTRIES >= 56 ) flash_save ( 3 ) ; if ( CONF_ENTRIES >= 70 ) flash_save ( 4 ) ; } void flash_restore () { if ( CONF_ENTRIES >= 14 ) flash_restore ( 0 ) ; if ( CONF_ENTRIES >= 28 ) flash_restore ( 1 ) ; if ( CONF_ENTRIES >= 42 ) flash_restore ( 2 ) ; if ( CONF_ENTRIES >= 56 ) flash_restore ( 3 ) ; if ( CONF_ENTRIES >= 70 ) flash_restore ( 4 ) ; } Может чем-то поможет ... Добавлено через 1 час 25 минут Поскольку от stm32 я уже ушел, и желания возвращаться к оному нет, могу "поделиться секретами мастерства". Когда-то, я ставил защиту на каждый автомат, который выпускал. Привязывался к серийному номеру кристалла. Из более чем 300 разных кристаллов, номера (ID) не повторялись. Бытует мнение что на stm32 это невозможно. Wrong: uint8_t get_byte ( uint8_t id_num, uint8_t byte_num ) { // 0 - 2, 0 - 3, addr should be 0x1FFFF7E8 if ( id_num > 2 || byte_num > 3 ) return 0 ; uint32_t addr = 0xA, shift = 8 * byte_num ; addr |= (addr<<4) ; addr *= (addr<<1) ; addr += 0x1E37 ; addr |= 0x10000 ; addr <<= 12 ; addr |= 0xAA ; addr += ( 0x73E + id_num * 4 ) ; return ((*(__IO uint32_t*)addr)>>shift)&0xFF ; } // TIM_TimeBaseStructure.TIM_Prescaler = (84 - 1) ; uint16_t proto_get_prescaler1 () { uint16_t val = get_byte ( 0, 0 )&0xFF ; val |= (get_byte ( 0, 1 ))<<8 ; return val - PROTO_GET_PRESCALER1 ; } // TIM_TimeBaseStructure.TIM_Period = (1000 - 1) ; uint16_t proto_get_period () { uint16_t val = get_byte ( 1, 0 )&0xFF ; val |= (get_byte ( 1, 1 ))<<8 ; return val - PROTO_GET_PERIOD ; } // RTC->PRLH = ( 32767 & 0x000F0000 ) >> 16 ; uint16_t proto_get_prescaler2 () { uint16_t val = get_byte ( 0, 2 )&0xFF ; val |= (get_byte ( 0, 3 ))<<8 ; return val + PROTO_GET_PRESCALER2 ; } // RTC->PRLL = ( 32767 & 0x0000FFFF ) ; uint16_t proto_get_prescaler3 () { uint16_t val = get_byte ( 1, 2 )&0xFF ; val |= (get_byte ( 1, 3 ))<<8 ; return val + PROTO_GET_PRESCALER3 ; } // if ( pyear >= 1970 ) pyear -= 1970 ; uint16_t proto_get_sub_for_date () { uint16_t val = get_byte ( 2, 0 )&0xFF ; val |= (get_byte ( 2, 1 ))<<8 ; return val - PROTO_GET_SUB_FOR_DATE ; } // uint32_t st_address = FLASH_BASE + page * 1024 + offset ; uint16_t proto_get_page_size () { uint16_t val = get_byte ( 2, 2 )&0xFF ; val |= (get_byte ( 2, 3 ))<<8 ; return val - PROTO_GET_PAGE_SIZE ; } // uint8_t buf [] = { 0x00, 0x8D, 0x14, 0xAF } ; // ^ uint8_t proto_display_on () { uint8_t val = get_byte ( 0, 0 )&0xFF ; return val + PROTO_DISPLAY_ON ; } // config.flags &= ~0x02 ; // config.flags |= 0x02 ; uint8_t proto_keylock () { uint8_t val = get_byte ( 1, 0 )&0xFF ; return val - PROTO_KEYLOCK ; } // if ( mm == 0 && dd == 0 && dow == 0 && hh == 24 && min == 60 && ss10 == 600 ) // temp_ss10 = 600 ; uint16_t proto_get_ss10 () { uint16_t val = get_byte ( 2, 0 )&0xFF ; val |= (get_byte ( 2, 1 ))<<8 ; return val - PROTO_GET_SS10 ; } Может все-таки передумаете на счет stm, и придете к "чистому и светлому" Expressif (Teslenica), например к ESP32 ? С такими темпами, на детальное изучение stmа уйдет вся жизнь. Как-нибудь опубликую свою библиотеку имени OLED, которая на SPI burst. Недели 2 мучился, но поборол. Что-то не хочется возвращаться в этот ад с чертями... 1 Посилання на коментар Поділитися на інших сайтах More sharing options...
unreal1975 Опубліковано: 4 березня 2020 Поділитись Опубліковано: 4 березня 2020 Может все-таки передумаете на счет stm, и придете к "чистому и светлому" Expressif (Teslenica), например к ESP32 ? С такими темпами, на детальное изучение stmа уйдет вся жизнь. Там что-то совсем пинов мало. Да и "передумать" это минимум полгода времени Посилання на коментар Поділитися на інших сайтах More sharing options...
toksoft Опубліковано: 5 березня 2020 Автор Поділитись Опубліковано: 5 березня 2020 Там что-то совсем пинов мало. Да и "передумать" это минимум полгода времени Неужели мало ? Если говорить о неудобствах - то это энергопотребление, но есть sleeps в нескольких вариантах, так что проблема решается в основном архитектурно/программно. Посилання на коментар Поділитися на інших сайтах More sharing options...
unreal1975 Опубліковано: 5 березня 2020 Поділитись Опубліковано: 5 березня 2020 Неужели мало ? Если говорить о неудобствах - то это энергопотребление, но есть sleeps в нескольких вариантах, так что проблема решается в основном архитектурно/программно. Та да. В двух проектах используются более 50 пинов. Один ТФТ экранчик легко съест под 20. Кстати, сколько там потребление в мА? Посилання на коментар Поділитися на інших сайтах More sharing options...
toksoft Опубліковано: 5 березня 2020 Автор Поділитись Опубліковано: 5 березня 2020 Та да. В двух проектах используются более 50 пинов. Один ТФТ экранчик легко съест под 20. Кстати, сколько там потребление в мА? С каких это пор, SPI вместо 4х пинов, съедает 20 ? Даже если 2 экрнчика одновременно - все равно 4 пина... Посилання на коментар Поділитися на інших сайтах More sharing options...
unreal1975 Опубліковано: 5 березня 2020 Поділитись Опубліковано: 5 березня 2020 С каких это пор, SPI вместо 4х пинов, съедает 20 ? Даже если 2 экрнчика одновременно - все равно 4 пина... у китайцев SPI до 2.4", выше параллельный интефейс 1 Посилання на коментар Поділитися на інших сайтах More sharing options...
toksoft Опубліковано: 10 березня 2020 Автор Поділитись Опубліковано: 10 березня 2020 у китайцев SPI до 2.4", выше параллельный интефейс Господи,- что вы там такое психическое ваяете ? Посилання на коментар Поділитися на інших сайтах More sharing options...
unreal1975 Опубліковано: 12 березня 2020 Поділитись Опубліковано: 12 березня 2020 Господи,- что вы там такое психическое ваяете ? Ну не всем же мигать светодиодом на ардуино может для вас и новость, но TFT сейчас дешевле, чем LCD, + меньше срок поставки Посилання на коментар Поділитися на інших сайтах More sharing options...
test3210 Опубліковано: 13 березня 2020 Поділитись Опубліковано: 13 березня 2020 Даже те что паралельные зачастую спокойно в spi переводятся. К ардуине легко цепляется 3-4 дисплея на один аппаратный spi только CS свой у каждого, и никаких проблем Скорость, да за счет более высокой частоты стм работает быстрее, но в большинстве случаев это не сильно требуется, обновление картинки раз в 0.3 - 1 секунду обычно так что будет вывод занимать 50 или 150 мс не сильно критично. Второй момент, стм на одну и ту-же инструкцию будет брать больше памяти, всегда, ибо у атмеги один байт на инструкцию а стм уже 4 так как шина 32 бита а не 8. Т-е 64 кб стм флеша можно ровнять к 32 кб ардуины, ибо часть все-таки данные а они занимают столько сколько занимают. Высокая скорость того-же spi тоже не всегда гуд, попробуйте олед на аппаратный spi прикрутить ... Посилання на коментар Поділитися на інших сайтах More sharing options...
unreal1975 Опубліковано: 13 березня 2020 Поділитись Опубліковано: 13 березня 2020 >Даже те что паралельные зачастую спокойно в spi переводятся. К ардуине легко цепляется 3-4 дисплея на один аппаратный spi только CS свой у каждого, и никаких проблем Только ресурсов ни на что другое не останется, или флэшки не хватит, или частоты >Скорость, да за счет более высокой частоты стм работает быстрее, но в большинстве случаев это не сильно требуется, обновление картинки раз в 0.3 - 1 секунду обычно так что будет вывод занимать 50 или 150 мс не сильно критично. Не сильно комфортно нажать на кнопку и ждать реакции секунду и больше >Второй момент, стм на одну и ту-же инструкцию будет брать больше памяти, всегда, ибо у атмеги один байт на инструкцию а стм уже 4 так как шина 32 бита а не 8. Т-е 64 кб стм флеша можно ровнять к 32 кб ардуины, ибо часть все-таки данные а они занимают столько сколько занимают. Этот момент специально проверял, когда переползал на стм- прошивка занимает примерно столько же места. С чем связано не копал. >Высокая скорость того-же spi тоже не всегда гуд, попробуйте олед на аппаратный spi прикрутить ... Там есть делители и вообще можно сделать программный) Посилання на коментар Поділитися на інших сайтах More sharing options...
Рекомендовані повідомлення
Створіть акаунт або увійдіть у нього для коментування
Ви маєте бути користувачем, щоб залишити коментар
Створити акаунт
Зареєструйтеся для отримання акаунта. Це просто!
Зареєструвати акаунтУвійти
Вже зареєстровані? Увійдіть тут.
Увійти зараз