STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: STM32 новичку в ARM что к чему

Сообщение Satyr »

axillent писал(а): освоил три платформы AVR8/STM8/STM32, осваивать больше явно перебор
тем более под каждую платформу нужно иметь и инструментарий и освоить софт
под атмел есть STK600/mkII/JTAGICE3, под STM - STLINKV2
Под все АРМы уж лет 10 один и тот же инструмент. И вобщем то софт.
А чтоб лить для большинства современных ничего не нужно. Или UART на TTL уровнях максимум.
если вы предлагаете esp8266, он разве более производительный чем ethernet организованный на enj2860/wiznet?
Что тот, что другой скоростью интерфейса к МК скорее ограничиваются, чем еще чем либо.
сейчас эту задачу у меня успешно решают устройства на atmega128 + enj2860
Ну уж если этот треш справляется, то вопросы к вайфаю просто неуместны -))

МК с MAC + внешний PHY - тот еще геморой, особенно при утюжной разводке. Да и PHY еще инитить надо, кодить куда больше.
Ищи тогда уж вариант с RMII, а не MII интерфейсом, хоть разводить поменьше.
Реклама
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: STM32 новичку в ARM что к чему

Сообщение Satyr »

axillent писал(а):кстати вот что китайцы прелагают http://ru.aliexpress.com/item/STM32F407 ... eb201560_4
дешевле пока ничего не нашел
на борту если не врут cortex-m4 c 1мбайт флэш
А я нашел -))
https://market.yandex.ru/product/7879331
я правда по 700р еще брал

Ethernet, Wifi, USB host, UART и несколько универсальных ног в комплекте.
Насколько помню, чтото типа 400мхз, 4mb флеша, 32мб оперативки.
+ корпус + БП

У меня как раз с веб интерфесом контроллер счетчиков воды -)))

Посмотри еще TI, чтото у них баксов по 20 с эзернетом демо платки какие то были года полтора назад
Реклама
axillent
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Re: STM32 новичку в ARM что к чему

Сообщение axillent »

Satyr писал(а): А я нашел -))
https://market.yandex.ru/product/7879331
я правда по 700р еще брал
да и верно
я вот тоже подумал, зачем такие деньги в stm вкладывать, если по такой же цене фактически идут mini-pc, тот же raspberry, тем более он меня есть
а всякие распространенные роутеры так еще и за копейки за счет своей массовости
буду думать
есть вариант вообще на NAS сервер этот функционал загнать

отвлеченный вопрос
eeprom атмеловский AT24C64/128/256/512 нормально будет работать с STM32?
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

На днях упражнялся на 030 именно с атемловскими, но at24c32 и 24с08. Проблем не заметил. Если что, могу подсказать и показать. Пока не забыл. :)
Реклама
Эиком - электронные компоненты и радиодетали
axillent
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Re: STM32 новичку в ARM что к чему

Сообщение axillent »

a5021 писал(а):Если что, могу подсказать и показать. Пока не забыл. :)
за пример буду признателен
Реклама
tuxxas
Родился
Сообщения: 10
Зарегистрирован: Ср сен 09, 2015 11:41:54

Re: STM32 новичку в ARM что к чему

Сообщение tuxxas »

Satyr писал(а): Посмотри еще TI, чтото у них баксов по 20 с эзернетом демо платки какие то были года полтора назад
А как насчет новых W7500(P) http://www.wiznet.co.kr/product-item/w7500/ ?
Реклама
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: STM32 новичку в ARM что к чему

Сообщение Satyr »

axillent писал(а): отвлеченный вопрос
eeprom атмеловский AT24C64/128/256/512 нормально будет работать с STM32?
Да, только на кой ?? Если у тебя пара страниц флеша прогмема остается, эмуляцию еепрома сделаешь
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: STM32 новичку в ARM что к чему

Сообщение HHIMERA »

Можно и так... хотя стремновато в некоторых случаях...
Можно просто взять за копейки SPI флэш с приличной скоростью... и довольно приличного размера... от Winbond например... Заодно не заморачиваться с вечно задротным И2Ц... с его ерратами и глюками...
"Я не даю готовых решений, я заставляю думать!"(С)
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

HHIMERA писал(а):Заодно не заморачиваться с вечно задротным И2Ц... с его ерратами и глюками...
Я немножко заморочился и для себя определил, что на f030 мастер в AUTOEND=1 работает примерно так, как и должен, чего у меня не получилось добиться, что с бубном, что без, если старт и стоп формировать руками. Я может не сильно вкуривался, но углядев, что AUTOEND=1 работает во всех моих случаях так, как надо, просто не стал даже запариваться с ручным формированием состояний.

Итак, камень STM32F030C6T6 проиничен на штатные 48мгц тактовой. Для того, чтобы гененрировать сигналы шины I2C с правильными таймингами надо в регистр I2C1->TIMINGR занести правильное значение, которое надлежит вычислить по некой совершенно зубодробительной методике, чем я решительно не пожелал заниматься. Правильное значение я взял из снайпетов, где, надеюсь, оно было вычислено без ошибок.

Вобщем, для работы шины на 400кгц весь инит выглядит так:

Код: Выделить всё

__INLINE void initI2C1(void)  {
  I2C1->CR1 = I2C_CR1_PE;                 // enable I2C
  I2C1->TIMINGR = (uint32_t)0x00B01A4B;   // Timing register value is computed with the AN4235 xls file, fast Mode @400kHz with I2CCLK = 48MHz, rise time = 140ns, fall time = 40ns
}
Определим возможные коды ошибок (здесь они выбраны произвольно и имеют разные значения только затем, чтобы отличать их друг от друга), которые могут произойти по разным причинам при работе с I2C:

Код: Выделить всё

#define  ERROR_I2C_TX_TIMEOUT     (uint32_t) (1<<16)
#define  ERROR_I2C_RX_TIMEOUT     (uint32_t) (1<<17)
#define  ERROR_I2C_STOP_TIMEOUT   (uint32_t) (1<<18)
#define  ERROR_I2C_BUS_FAIL       (uint32_t) (1<<19)
Заодно переменную, в которую они станут заноситься, если вдруг возникнут:

Код: Выделить всё

#define I2C_ERROR_VAR                   globalError
globalError -- это глобальная переменная, объявленная где-то выше. Имя может быть любым, главное, чтобы это было упоминание реальной переменной.

Для отслеживания таймаута, чтобы не зациклиться навечно в ожидании какого-нибудь флага, сошлемся на какой-нибдуь счетчик (по тому же принципу, как с I2C_ERROR_VAR), который тупо декрементируется где-нибудь в обработчике SysTick-а раз в микросекунду.

Код: Выделить всё

#define I2C_TIMEOUT_COUNTER_VAR         timeoutCounter
Макросы установки и сброса счетчика таймаута:

Код: Выделить всё

#define I2C_SET_TIMEOUT(TIMEOUT) __disable_interrupt(); I2C_TIMEOUT_COUNTER_VAR = TIMEOUT; __enable_interrupt()
#define I2C_RESET_TIMEOUT() __disable_interrupt(); I2C_TIMEOUT_COUNTER_VAR = 0; __enable_interrupt()
Дальше есть смысл определить макросы, которые можно использовать внутри функций для разнообразных манипуляций с I2C. Вот макрос, который начинает всякие операции записи по I2C. Он принимает три параметра: 1) i2c-адрес устройства, к которому планируется обращение, 2) общее число байт, которое будет передано по шине i2c в течение данного сеанса, 3) значение байта, который пойдет первым (обычно оно еще называется номером регистра) в данном сеансе.

Код: Выделить всё

#define I2C_START_WRITING(ADDR, COUNT, VALUE) \
          do { \
            I2C1->TXDR = VALUE; \
            I2C1->CR2 \
              =  I2C_CR2_AUTOEND \
              | ((COUNT) << 16) \
              | ((ADDR) << 1) \
              | I2C_CR2_START;\
          } while (0)
Такой же макрос, но для операций чтения. Параметры, которые он принимает чуть отличаются от I2C_START_WRITING в том, что нет значения регистра, к которому происходит обращение. Чтение начинается с текущей позиции. Если необходимо чтение с какой-то иной позиции, то перед ним нужно будет записать один байт номера регистра с помощью I2C_START_WRITING.

Код: Выделить всё

#define I2C_START_READING(ADDR, COUNT) \
            do { \
             I2C1->CR2 \
               = I2C_CR2_AUTOEND \
               | ((COUNT) << 16) \
               | I2C_CR2_RD_WRN \
               | ((ADDR) << 1) \
               | I2C_CR2_START; \
            } while (0)
Три макроса ожидания флага завершения операции. Первый для подтверждения окончания всего сеанса, второй для подтверждения окончания текущей операции чтения, а последний то же самое, но для записи:

Код: Выделить всё

#define I2C_WAIT_FOR_STOP_FLAG() \
          while(!(I2C1->ISR & I2C_ISR_STOPF)) { \
            if (I2C_TIMEOUT_COUNTER_VAR == 0) { \
              I2C_ERROR_VAR |= ERROR_I2C_STOP_TIMEOUT; \
              return 0; \
            } \
          } \
          I2C1->ICR = I2C_ICR_STOPCF

#define I2C_WAIT_FOR_RX_FLAG() \
          while(!(I2C1->ISR & I2C_ISR_RXNE)) { \
            if (I2C_TIMEOUT_COUNTER_VAR == 0) { \
              I2C_ERROR_VAR |= ERROR_I2C_RX_TIMEOUT; \
              return 0; \
            } \
          }
            
#define I2C_WAIT_FOR_TX_FLAG() \
          while(!(I2C1->ISR & I2C_ISR_TXE)) { \
            if (I2C_TIMEOUT_COUNTER_VAR == 0) { \
              I2C_ERROR_VAR |= ERROR_I2C_TX_TIMEOUT; \
              return 0; \
            } \
          }
Макросы отслеживают истечение таймаута текущей операции и прерывают выполнение функции, в которой они вызывались, если таймаут таки случился.

В принципе, данных макросов достаточно, чтобы писать разнообразные функции по работе с I2C, что ниже я покажу на примере работы с той же AT24C32.

Код: Выделить всё

#define  I2C_TIMEOUT              50
#define         AT24C32_ADDRESS        ((uint8_t)0x57)

bool at24c32_read(uint16_t addr, uint8_t buffer[], uint8_t count) {

  I2C_SET_TIMEOUT(I2C_TIMEOUT);

  I2C_START_WRITING(AT24C32_ADDRESS, 2, addr >> 8);
  I2C_WAIT_FOR_TX_FLAG();
  I2C1->TXDR = (addr & 0x00FF);  // Byte to send  
  I2C_WAIT_FOR_STOP_FLAG();

  I2C_START_READING(AT24C32_ADDRESS, count);

  for (uint8_t i = 0; i < count; i++) {
    I2C_WAIT_FOR_RX_FLAG();
    buffer[i] = I2C1->RXDR;
  }

  I2C_WAIT_FOR_STOP_FLAG();

  I2C_RESET_TIMEOUT();
  
  return true;
}

bool at24c32_write(uint16_t addr, uint8_t buffer[], uint8_t count) {

  I2C_SET_TIMEOUT(I2C_TIMEOUT);

  I2C_START_WRITING(AT24C32_ADDRESS, count + 2, addr >> 8);
  I2C_WAIT_FOR_TX_FLAG();
  I2C1->TXDR = (addr & 0x00FF);  // Byte to send  
  
  for (uint8_t i = 0; i < count; i++) {
    I2C_WAIT_FOR_TX_FLAG();
    I2C1->TXDR = buffer[i];
  }
  
  I2C_WAIT_FOR_STOP_FLAG();
  
  I2C_RESET_TIMEOUT();
  
  return true;
}
Функции возвращают true/false, как результат всей операции. Если true, то можно ехать дальше. Если false, то надо глядеть переменную globalError и выяснять, что пошло не так. Функции не идеальные и не годятся на все случаи жизни. У меня они используются для чтения/записи блоков по 32 байта и в таком виде работают без нареканий. Для больших размерностей единичной операции стоит уточнить особенности постраничной записи конкретного чипа EEPROM и внести соответствующие правки в алгоритм. Приведенный здесь код является частью более обширной моей писанины и хочется надеяться, что выдрал я его без ошибок. Написано для компилятора IAR.
axillent
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Re: STM32 новичку в ARM что к чему

Сообщение axillent »

a5021 спасибо
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Кстати, тут обратил внимание, что STM32CubeMX умеет рассчитывать значение I2C1->TIMINGR в секции конфигурирования I2C. Это, пожалуй, самый простой способ вычислить правильное значение для любой тактовой частоты.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

ncp1400 писал(а):у STM32F030F4 флеш реально 32К
Проверил, все обстоит именно так. Побудило к этому то обстоятельство, что разрастающийся код для stm32f030f4p6 перестал влезать в 16к и IAR-овский загрузчик флеша начал орать о попытке записи за границу 0800400. Сначала в свойствах проекта указал другой камень из той же серии -- stm32f030k6c6. Загрузка с последующей верификацией и прогоном в отладчике не вызвали никаких проблем. Всего загружалось и работало примерно 20кб кода, но думаю, что и с полными 32кб вопросов не возникнет.

Указывать в свойствах проекта другой МК показалось не совсем идеологически-правильным, потому поискал, какие файлы конфигурации ограничивают доступный флеш лишь половиной объема. Нашлись, как минимум три файла (может их и больше, но не стал копать дальше), в которых указывался размер флеша:

C:\Program Files\IAR Systems\Embedded Workbench 7.3\arm\config\flashloader\ST\FlashSTM32F03xx4.flash и
C:\Program Files\IAR Systems\Embedded Workbench 7.3\arm\config\linker\ST\stm32f030x4.icf
C:\Program Files\IAR Systems\Embedded Workbench 7.3\arm\config\debugger\ST\STM32F030x4.ddf

Положил на их место такие же файлы от K6 и иар успокоился.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Чем и насколько чреватым может оказаться полный запрет работы SysTick-а в коде для STM32F030, если никаких сторонних библиотек не используется совсем, а в моем коде SysTick не нужен? Сейчас я в начале программы на всякий случай вырубаю его при помощи SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Pos; хоть оно и так вроде в нуле, но остаются сомнения, не нарушаю ли я какой-нибудь логики работы МК.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: STM32 новичку в ARM что к чему

Сообщение HHIMERA »

a5021 писал(а):Сейчас я в начале программы на всякий случай вырубаю его
А зачем тогда его вообще врубать???
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
drakon
Грызет канифоль
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

Re: STM32 новичку в ARM что к чему

Сообщение drakon »

SysTick используется для отсчета времени, в основном в ОС. Если Вы его выключите, то ничего плохого в этом нету. По умолчанию он выключен должен быть.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Понял. Спасибо. Просто смутило, что часто его прикручивают куда нужно и куда нет. Вот и возникло подозрение, что мож я чего не знаю и систик по любому должен крутиться. Теперь просто убрал из своего кода упоминания о нем вообще.

Хотел бы тут задать знающим людям еще один вопрос на другую тему, чтобы уж два раза не вставать, как говорится. В больших корпусах (LQFP48) у F030 наружу выведены пины PC13-PC15, которые замечательны тем, что умеют сохранять свое состояние, когда МК уходит в глубокий сон и все прочие ноги отключаются и повисают в воздухе. В мелких корпусах (TSSOP20, TQFP32) такой фишки нет, а данная фича очень бы оказалась кстати. Существуют ли в природе схемные решения, позволяющие реализовать данный функционал на внешних компонентах? Нужно что-то простое и энергоэффективное, навроде пары мелких полевичков, образующих защелку.
Galizin
Мучитель микросхем
Сообщения: 478
Зарегистрирован: Ср окт 15, 2008 09:33:03
Откуда: Воронеж

Re: STM32 новичку в ARM что к чему

Сообщение Galizin »

a5021 писал(а):Нужно что-то простое и энергоэффективное
74НС595 74HC74 ?
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

По потреблению не пролазят. Даже низковольтные версии жрут до 500мка, что, как бы, многовато.
Аватара пользователя
Alexey_N
Сверлит текстолит когтями
Сообщения: 1273
Зарегистрирован: Вт фев 01, 2011 17:56:40
Откуда: г. Жуковка, Брянская обл.

Re: STM32 новичку в ARM что к чему

Сообщение Alexey_N »

Возник вопрос: как в stm32f103 реализовать работу с вещественными числами? там же нет fpu ...
Индукционный нагреватель - 20% (наладка). TIG сварка - 10% (детальки)
ВЧ генератор 150МГц - 80% (наладка). Мостовой ИИП - 40% (подкл. ОС).
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: STM32 новичку в ARM что к чему

Сообщение Satyr »

Alexey_N писал(а):Возник вопрос: как в stm32f103 реализовать работу с вещественными числами? там же нет fpu ...
использовать компилятор с библиотекой работы с вещ. числами.
то есть, вероятно в современных реалиях, любой
Ответить

Вернуться в «ARM»