Перейти до публікації
Пошук в
  • Додатково...
Шукати результати, які містять...
Шукати результати в...

STM (Cortex) vs ATMEL

toksoft

Рекомендовані повідомлення

Да, внешние прерывания не используются, многопоточность (если я правильно понял) тоже.

 

АЦП непрерывно в фоне преобразовывает и через ДМА ложит данные в массив. (также передрал из примеров)

 

20мА в активном режиме считаю вполне приемлемым потреблением, чтобы морочиться с ждущими режимами, поэтому мне намного проще чем вам с брелком:)

Еще раз - в серии f030 vbat нет - это ультрабюджетная серия. Если нужен vbat - это f103

 

Ого,- DMA я на stm еще ни разу не использовал.

Очень хотел на atmega, там все гораздо проще, но нужен ram. У меня только одна динамическая таблица брелков может 6к занять, поэтому пришлось выбирать кристалл с большим объемом RAM.

Из линейки CORTEX, я использовал только 2 кристалла, и это не f030.

Что-то мне не очень хочется снова погружаться в раскопки очередной архитектуры, и прогуливаться по швабрам.

 

P.S. Вот выложил уже практически все детали. Код что-ли начать публиковать, чтобы наконец уважаемый diver перестал рекламировать gsm, и перешел на более современные технологии ?

Посилання на коментар
Поділитися на інших сайтах

Ого,- DMA я на stm еще ни разу не использовал.

Очень хотел на atmega, там все гораздо проще, но нужен ram. У меня только одна динамическая таблица брелков может 6к занять, поэтому пришлось выбирать кристалл с большим объемом RAM.

Из линейки CORTEX, я использовал только 2 кристалла, и это не f030.

Что-то мне не очень хочется снова погружаться в раскопки очередной архитектуры, и прогуливаться по швабрам.

 

P.S. Вот выложил уже практически все детали. Код что-ли начать публиковать, чтобы наконец уважаемый diver перестал рекламировать gsm, и перешел на более современные технологии ?

 

 

Та я как бы тоже не хотел тратить время на разбирательства как оно работает, но оказалось что обработки нескольких каналов без ДМА никто не делает. По факту очень удобно-есть массив, который время от времени сам обновляется.

 

 

код не публикуйте-пускай свои шишки набивают :)))

Посилання на коментар
Поділитися на інших сайтах

Давайте упростим задачу тем, кто только решается начать свой проект, и для тех, кто уже активно кодит.

В соседней ветке я пытался "продать" идею 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 ;

}

Змінено користувачем toksoft
Посилання на коментар
Поділитися на інших сайтах

 

Наверное вам пригодилось бы "легкое напоминание", как можно получить параметры сенсора, без использования float. Например так (для BMx280):

 

 

Неееееееееее :))))) какой смысл пересаживаться на мерседес и ехать 20кмч?

 

Сроки всегда жмут, а по человечески написанные формулы намного легче отлаживать

Посилання на коментар
Поділитися на інших сайтах

Неееееееееее :))))) какой смысл пересаживаться на мерседес и ехать 20кмч?

 

Сроки всегда жмут, а по человечески написанные формулы намного легче отлаживать

:-)

Так это же "почти родная" библиотека, которую предоставляет BOSCH.

Немного подпилить, и пожалуйста - никаких вам float point.

"<<" и ">>" это простой bit shifting. Зачем делить, скажем на 4, если можно просто сдвинуть на 2 бита вправо (для целочисленных вычислений) ? Если беспокоит потеря точности, дык умножьте хоть на 1000, а потом уже сдвигайте. int32 это 4 байта, по 8 bit каждый. Учитывая знак, 2147483647 (в десятичном исчислении). Как для температурного датчика - более чем. Ну или 0К. -273 к с копейками. Если вам удастся зафиксировать температуру ниже,- я буду крайне удивлен.

А если "прямо посередине" вашего мега-float рассчета свершится interrupt, которого "заинтересует" рассчитываемое значение ?

 

 

P.S. unreal1975 - манная каша - она вкусная, а главное полезная :-)

Посилання на коментар
Поділитися на інших сайтах

<<" и ">>" это простой bit shifting. Зачем делить, скажем на 4, если можно просто сдвинуть на 2 бита вправо (для целочисленных вычислений) ?

 

 

 

Я так и делаю на атмегах, наигрался :)

 

 

 

А если "прямо посередине" вашего мега-float рассчета свершится interrupt, которого "заинтересует" рассчитываемое значение ?

 

 

стараюсь в прерывания ничего такого не совать- только в основной программе

 

 

 

Вы ж поймите, какой смысл тратить время на эти оптимизации, если за 100грн у вас почти полноценный компьютер:

 

www.kosmodrom.com.ua/el.php?name=STM32F103RET6

 

 

 

 

Зы кстати в разрезе датчиков-брелков stm32 также имеет преимущество- рекомендуют выводить в активном режиме ядро на максимальную частоту, чтобы сократить время выхода из спячки, у них и производительность больше и тактовая частота выше. А еще есть серия с низким потреблением

Змінено користувачем unreal1975
Посилання на коментар
Поділитися на інших сайтах

Зы кстати в разрезе датчиков-брелков stm32 также имеет преимущество- рекомендуют выводить в активном режиме ядро на максимальную частоту, чтобы сократить время выхода из спячки, у них и производительность больше и тактовая частота выше. А еще есть серия с низким потреблением

 

То есть вы предлагаете тактировать постоянно максимальной частотой для того, чтобы "выйти из sleep" побыстрее ?

Мне производительность как бы не критична, в особенности для задач брелка.

RA02 в общем "видит" не только базу, но и соседние брелки (в пределах видимости), но даже с учетом того, что у меня по идее может быть до 100 брелков, даже текущая производительность stm для меня сильно избыточна.

 

 

Может вы майнингом криптовалют занимаетесь на кристаллах ? :-)

Посилання на коментар
Поділитися на інших сайтах

То есть вы предлагаете тактировать постоянно максимальной частотой для того, чтобы "выйти из sleep" побыстрее ?

Мне производительность как бы не критична, в особенности для задач брелка.

RA02 в общем "видит" не только базу, но и соседние брелки (в пределах видимости), но даже с учетом того, что у меня по идее может быть до 100 брелков, даже текущая производительность stm для меня сильно избыточна.

 

 

Может вы майнингом криптовалют занимаетесь на кристаллах ? :-)

 

 

Минимизировать время в активном режиме-> увеличить ресурс батарейки

Посилання на коментар
Поділитися на інших сайтах

  • 1 рік потому...
Распаять вообще не проблема. Даже плату под неё сделать в домашних условиях. Главное чтобы периферии хватило. И несмотря на всю красивость стм-ок, в тех же драйверах фонариков (где микроконтроллер отвечает за весь интерфейс, 3 способа регулирования тока и, собственно, управление ключевым транзистором в импульсном повышающем стабилизаторе) используют именно Тиньку 85. Я не разработчик, я не знаю почему так - но факт. Плюс габариты Тиньки в корпусе QFN очень компактные, что удобно для маленьких фонариков. СТМ-ка туда физичски не поместится. Ну и следует понимать, что маааааленький глюк контроллера - и силовая схема превращается в угли.

После того, как микрочип купил атмел с потрохами, на атмеле остались только те, кто по разным причинам не может перейти на что-то другое (например 1000 плат на складе)

 

И к ассемблеру- раньше его был смысл использовать, так как не хватало либо флешки, либо быстродействия, сейчас и того и другого с избытком, поэтому применение ассемблера скорее минус

Посилання на коментар
Поділитися на інших сайтах

После того, как микрочип купил атмел с потрохами, на атмеле остались только те, кто по разным причинам не может перейти на что-то другое (например 1000 плат на складе)

 

И к ассемблеру- раньше его был смысл использовать, так как не хватало либо флешки, либо быстродействия, сейчас и того и другого с избытком, поэтому применение ассемблера скорее минус

 

Пофиг кто кого купил. критерии следующие:

 

1. Задачи, под которую нужен кристалл

2. Цена и доступность

3. Framework для разработки

4. Есть ли возможность относительно безболезненно достать dev board для прототипирования

 

Ассемблер, C, C++, JS, JAVA, возможность визуального моделирования, ... - это инструменты. Скальпель, молоток, гвозди, пинцет, ...

Если проект большой, то asm через пару месяцев надежно "замурует в трубу", ибо поддерживать и дорабатывать большой asm проект это недешевое удовольствие. Удержать в голове одновременно несколько архитектур, программируя при этом на asmе - задача достаточно сложная даже для full time. Если есть алгоритмы, которые должны отслеживаться с наносекундной дискретностью, то их имеет смысл писать на asmе, но только их.

Как сейчас не знаю, но ранее (лет 15 назад) я часто встречал персонажей, со "слегка завышенной самооценкой", на предмет "идеального" знания архитектуры и asma одного конкретного кристалла или серии. Они были уверены что "если понадобиться, они с легкостью освоят и другие платформы". В 99% случаев это была ошибка. Тихо и гордо ушли в историю, вместе с их уникальными, но к сожалению безнадежно устаревшими знаниями.

Любой проект (даже любительский), имеет цели и сроки. Если цель - реальный продукт, а не самозанятость для удовольствия, то нужно правильно выбирать платформу и инструментарий.

Посилання на коментар
Поділитися на інших сайтах

Пофиг кто кого купил. критерии следующие:

Ото атмел-микрочип по вашему же второму пункту и слился

контроллер на 128к с кучей ресурсов, пинов итд итп от СТ, стоит дешеве 328й атмеги

 

есть еще

5. число готовых примеров-библиотек, чтобы самому не писать каждую ерунду

Посилання на коментар
Поділитися на інших сайтах

Ото атмел-микрочип по вашему же второму пункту и слился

контроллер на 128к с кучей ресурсов, пинов итд итп от СТ, стоит дешеве 328й атмеги

 

есть еще

5. число готовых примеров-библиотек, чтобы самому не писать каждую ерунду

:-) Помнится в одном из сообщений, вы жаловались что "не хватет" EEPROM. Я тогда показал, что часть банков может использоваться для сохранения данных, а не кода. У stm есть 2 levels, если я правильно помню. Вы на user или system level обычно пишите свои приложения ? Сложный кристалл. Это я к тому, что порог входа высокий, и не каждый его осилит. atmega чуть попроще.

 

P.S. Для своих брелков LoRA я пока использую atmega. Так проще, и есть готовые dev boards.

Посилання на коментар
Поділитися на інших сайтах

:-) Помнится в одном из сообщений, вы жаловались что "не хватет" EEPROM. Я тогда показал, что часть банков может использоваться для сохранения данных, а не кода. У stm есть 2 levels, если я правильно помню. Вы на user или system level обычно пишите свои приложения ? Сложный кристалл. Это я к тому, что порог входа высокий, и не каждый его осилит. atmega чуть попроще.

 

P.S. Для своих брелков LoRA я пока использую atmega. Так проще, и есть готовые dev boards.

 

С епром вопрос чудесным образом решился внешней микросхемой за пару гривен.

Про уровни ничего не знаю :)

Сложно запустить периферию, тут помогает гугль, дальше скучно

Посилання на коментар
Поділитися на інших сайтах

С епром вопрос чудесным образом решился внешней микросхемой за пару гривен.

Про уровни ничего не знаю :)

Сложно запустить периферию, тут помогает гугль, дальше скучно

#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
Посилання на коментар
Поділитися на інших сайтах

 

Может все-таки передумаете на счет stm, и придете к "чистому и светлому" Expressif (Teslenica), например к ESP32 ? :-)

С такими темпами, на детальное изучение stmа уйдет вся жизнь.

Там что-то совсем пинов мало. Да и "передумать" это минимум полгода времени

Посилання на коментар
Поділитися на інших сайтах

Там что-то совсем пинов мало. Да и "передумать" это минимум полгода времени

 

Неужели мало ?

 

ESP32-DOIT-DEVKIT-V1-Board-Pinout-36-GPIOs-updated.jpg?ssl=1

 

Если говорить о неудобствах - то это энергопотребление, но есть sleeps в нескольких вариантах, так что проблема решается в основном архитектурно/программно.

Посилання на коментар
Поділитися на інших сайтах

Неужели мало ?

 

Если говорить о неудобствах - то это энергопотребление, но есть sleeps в нескольких вариантах, так что проблема решается в основном архитектурно/программно.

 

Та да. В двух проектах используются более 50 пинов. Один ТФТ экранчик легко съест под 20. Кстати, сколько там потребление в мА?

Посилання на коментар
Поділитися на інших сайтах

Та да. В двух проектах используются более 50 пинов. Один ТФТ экранчик легко съест под 20. Кстати, сколько там потребление в мА?

С каких это пор, SPI вместо 4х пинов, съедает 20 ? :-)

Даже если 2 экрнчика одновременно - все равно 4 пина...

Посилання на коментар
Поділитися на інших сайтах

С каких это пор, SPI вместо 4х пинов, съедает 20 ? :-)

Даже если 2 экрнчика одновременно - все равно 4 пина...

у китайцев SPI до 2.4", выше параллельный интефейс

  • Лайк 1
Посилання на коментар
Поділитися на інших сайтах

у китайцев SPI до 2.4", выше параллельный интефейс

Господи,- что вы там такое психическое ваяете ?

Посилання на коментар
Поділитися на інших сайтах

Господи,- что вы там такое психическое ваяете ?

Ну не всем же мигать светодиодом на ардуино :)

может для вас и новость, но TFT сейчас дешевле, чем LCD, + меньше срок поставки

Посилання на коментар
Поділитися на інших сайтах

Даже те что паралельные зачастую спокойно в spi переводятся. К ардуине легко цепляется 3-4 дисплея на один аппаратный spi только CS свой у каждого, и никаких проблем Скорость, да за счет более высокой частоты стм работает быстрее, но в большинстве случаев это не сильно требуется, обновление картинки раз в 0.3 - 1 секунду обычно так что будет вывод занимать 50 или 150 мс не сильно критично. Второй момент, стм на одну и ту-же инструкцию будет брать больше памяти, всегда, ибо у атмеги один байт на инструкцию а стм уже 4 так как шина 32 бита а не 8. Т-е 64 кб стм флеша можно ровнять к 32 кб ардуины, ибо часть все-таки данные а они занимают столько сколько занимают.

 

 

Высокая скорость того-же spi тоже не всегда гуд, попробуйте олед на аппаратный spi прикрутить ...

Посилання на коментар
Поділитися на інших сайтах

>Даже те что паралельные зачастую спокойно в spi переводятся. К ардуине легко цепляется 3-4 дисплея на один аппаратный spi только CS свой у каждого, и никаких проблем

 

Только ресурсов ни на что другое не останется, или флэшки не хватит, или частоты

 

>Скорость, да за счет более высокой частоты стм работает быстрее, но в большинстве случаев это не сильно требуется, обновление картинки раз в 0.3 - 1 секунду обычно так что будет вывод занимать 50 или 150 мс не сильно критично.

 

Не сильно комфортно нажать на кнопку и ждать реакции секунду и больше

 

>Второй момент, стм на одну и ту-же инструкцию будет брать больше памяти, всегда, ибо у атмеги один байт на инструкцию а стм уже 4 так как шина 32 бита а не 8. Т-е 64 кб стм флеша можно ровнять к 32 кб ардуины, ибо часть все-таки данные а они занимают столько сколько занимают.

 

Этот момент специально проверял, когда переползал на стм- прошивка занимает примерно столько же места. С чем связано не копал.

 

>Высокая скорость того-же spi тоже не всегда гуд, попробуйте олед на аппаратный spi прикрутить ...

 

Там есть делители и вообще можно сделать программный:))

Посилання на коментар
Поділитися на інших сайтах

Створіть акаунт або увійдіть у нього для коментування

Ви маєте бути користувачем, щоб залишити коментар

Створити акаунт

Зареєструйтеся для отримання акаунта. Це просто!

Зареєструвати акаунт

Увійти

Вже зареєстровані? Увійдіть тут.

Увійти зараз
×
×
  • Створити...