Перейти к содержанию

STM32 для чайника


ART_ME

Рекомендуемые сообщения

то есть 427 тоже? Выходит от 429 TFT-LCD мне не нужна штука?

А FMC и FSMC по 1 штуке на борту? Если я захочу SRAM + дисплей, мне надо 2 FSMC же как я понимаю

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Там разные банки. Можно по несколько устройств подключать.

На каком то сайте, какого-то магазина по РЭ, читал серию статей, как раз по этой теме. Не могу вспомнить какой сайт. :mellow: Там так хорошо всё описано...

Кстати, Ваш дисплей, судя по ДШ, подключается по SPI. Так что ему FSMC не нужен. Медленный будет :(
Я бы посоветовал прикупить что-нибудь типа на SSD1963, или ему подобном (с интерфейсом Intel 8080). Они простые как 5 копеек и запускаются с пол-оборота...

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

 pzAPgIml.jpg

Вот на такой похож мой дисплей, выводы Д0-Д7 разве не то что для  FSMC? На SPI как раз и не вижу выводов) Ну от SD карточки если только

 

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Из даташита на контроллер, который Вы сказали (SPFD5408) :

Скрытый текст

2019-03-25_11-24-43.thumb.png.bd1f3460c320a37134beac94123ba0ab.png

Есть SPI интерфейс и RGB.
Если разберётесь с модулем LTDC в микроконтроллере, то можете подключить по RGB.
 

Ссылка на комментарий
Поделиться на другие сайты

Лучше найти доку на сам экран, а не на контроллер, тут не совсем понятно как выбрать режим, где эти ножки, нет их. Скорее всего изначально настроен на SPI, а через него уже можно изменить режим. Типа как на дискавери 429.

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, DrobyshevAlex сказал:

Я могу по FMSC подключить его если что или нет?)

Если контроллер SPFD5408, то нет. Только SPI или RGB. Но инить его, всё равно, придётся через SPI.

Ссылка на комментарий
Поделиться на другие сайты

Цитата

Технические детали:

2,4 "диагональный ЖК-дисплей TFT

Разрешение 240x320, 18 бит (262000) цвет

Контроллер spfd5408 со встроенным буфером оперативной памяти

8 бит цифровой интерфейс, плюс 4 линии управления

Использует Цифровые контакты 5-13 и аналоговые 0-3. Это означает, что вы можете использовать Цифровые контакты 2, 3 и аналоговые 4 и 5. Pin 12 доступен, если не использовать microSD

Работает с любым '328 или Mega (Леонардо еще не поддерживается)

5 V совместимы! Использование с логикой 3,3 В или 5 В

Бортовой регулятор LDO 3,3 V 300mA

4 белая светодиодная подсветка. По умолчанию, но вы можете подключить транзистор к цифровой контакт для контроль задней подсветки

4-резистивный сенсорный экран

Вот такое описание. Как SPI и 8 битный интерфейс не понимаю))

Я даже выводов SPI не вижу) ИЛи спи может быть 8 битный? по 8 проводам вместо MI/MO

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...
В 16.11.2017 в 17:58, Darth_Vader сказал:

Я продолжил ковыряться с чудесами шины I²C - взял плату STM32VLDISCOVERY с процессором STM32F100RBT6B.

Ситуация не идентичная, но, по-сути, такая же.

Если частота тактирования модуля I²C 8 МГц или 16 МГц - модуль MPU6050 работает (на HAL_I2C_Master_Transmit отвечает HAL_OK),  если сделать частоту 24 МГц - всё, HAL_BUSY.

 

@Darth_Vader Здравствуйте, скажите пожалуйста, эпопея с I2c чем-то закончилась? Сейчас имею подобную ситуацию, только что бы ни пытался сделать, всегда линия BUSY. Пытаюсь на плате stm32vldiscovery. Пробовал менять частоты, использовать другие ноги (на ней два i2c) -  безрезультатно. Вы так же писали про 15 пунктов решения бага - не помогает, а конкретно - виснет на 5ом пункте, т.к. почему-то не может опустить SDA к земле. Взял плату с f4 discovery - всё завелось без каких-либо проблем.

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Не стал создавать новую тему, может все же я чего то не догоняю

Собственно столкнулся недавно вот с какой ситуацией:

Расписал я память, начал ее мапить ссылками на структуры, и внезапно часть структур мапится и работает корректно а часть при маппиге и использовании сваливает проц в HardFault_Handler

IDE Keil если что

Начал разбираться, и откровенно говоря вообще ничего не понял. 

Возьмем кусок памяти:

uint16_t modbus_data[32];

Есть у нас структура такого типа:


typedef struct vb_counter_unit {
    uint8_t init;
    uint8_t reserve;
    
    uint32_t counter;         

    double     counter_real;      
    float      counter_offset;    
    float    pulse_weight;
    
}  vb_counter_unit;

Структура как структура, создадим ссылку:

vb_counter_unit *cu_counters;

По сути я привожу пример с чистого проекта под STM32F072C8T6 + CubeMX 

Далее в main у нас начинается мап+фид:

cu_counters = (vb_counter_unit*) &modbus_data[1];
cu_counters->init = 1;
cu_counters->reserve = 2;
cu_counters->counter = 3;
cu_counters->counter_real = 4.4;
cu_counters->counter_offset = 5.5;
cu_counters->pulse_weight = 6.6;

Во время выполнения он заполняет только первые два поля, после чего дропается в HardFault_Handler

Начал смотреть память а там ваще котовасия какая та  

Запускаем и смотрим 

5cdd23c145868_.jpg.73eda12f01a017cf4ba371cde289c7d9.jpg

Видим что у нас заполнился только первые 2 байта, после чего проц ушел в  HardFault_Handler

Хорошо, в ручную меняем значение поля    cu_counters->counter = 0x21;

И получаем очень странную картину:

5cdd2444ba879_.jpg.9080908d2910c0ba0cfe19fd42a878f9.jpg

Видно что между counter и reserve есть целых 2 байта, откуда они там взялись???

Провожу еще один эксперемент, и начинаю мапить данные не с 1 а с 0 адреса 

    cu_counters = (vb_counter_unit*) &modbus_data[0];

До этого я указывал   modbus_data[1];

И о чудо:

5cdd24ea20c8d_.jpg.abe45520d879f47e17158c7670c0076c.jpg

Все работает правильно. После чего я провел некоторые тесты и выяснилось что если мап я назначаю с четного индекса массива то все работает, если же назначаю с нечетного то он крашится в HardFault_Handler

Может кто то ответить что я упустил в этой всей истории?

Я взял тут же накидал такой же пример на Xcode что по сути является GCC

Вот код:


#include <stdio.h>


uint16_t modbus_data[32];


typedef struct vb_counter_unit {
    
    uint8_t init;
    uint8_t reserve;
    
    uint32_t counter;           
    
    double     counter_real;      
    float      counter_offset;  
    float    pulse_weight;
    
}  vb_counter_unit;

vb_counter_unit *cu_counters;

int main(int argc, const char * argv[]) {

    cu_counters = (vb_counter_unit*) &modbus_data[19];
    cu_counters->init = 1;
    cu_counters->reserve = 2;
    cu_counters->counter = 3;
    cu_counters->counter_real = 4.4;
    cu_counters->counter_offset = 5.5;
    cu_counters->pulse_weight = 6.6;
    
    while (1){
        
    }
    
    return 0;
}

И он полноценно смапил все как надо и заполнил

5cdd260d11cf3_2019-05-1612_56_54.thumb.png.c7ab503089ca9bcc7c948b886f06b686.png

Может кто скажет что я упустил?

Изменено пользователем tar
Указал IDE
Ссылка на комментарий
Поделиться на другие сайты

Откуда проблемы если вы не выравнивали структуры к 1 байту? Это проделки кейла? Ну а то что М0 не умеет это понятно.

А ну теперь ясно cu_counters = (vb_counter_unit*) &modbus_data[1]; вот это проблема

Изменено пользователем MasterElectric
Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, MasterElectric сказал:

А ну теперь ясно cu_counters = (vb_counter_unit*) &modbus_data[1]; вот это проблема

В чем конкретно проблема? Я не понимаю. Я присваиваю адрес ссылке на структуру, предпологая что дальше в памяти расположатся данные моей структуры

Ссылка на комментарий
Поделиться на другие сайты

Ядро Cortex-M0 не поддерживает доступ к данным без выравнивания. Отсюда и HardFault.  Структура должна быть выровнена по границе в 8 байт, исходя из использования типа double.

Почему заполняются первые два поля, а потом наступает HardFault.

Начальный адрес структуры 0х01, она выровнена по границе в 1 байт.  

Первые две переменные типа uint8_t, требуют выравнивания по границе в 1 байт. Адреса переменных 0х01, 0х02. Все верно

Третья переменная типа uint32_t, требует выравнивания по границе в 4 байта. Адрес переменной 0х03, выравнивание в 1 байт.

Попытка записи -> HardFault.

 

 

Изменено пользователем Вуйко
Ссылка на комментарий
Поделиться на другие сайты

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

просто указатель адреса у М0 не может иметь никаких других значений, кроме кратных 4-ке. Как только кто-то пытается присвоить ему значение отличное от этого, в ядре махом вскакивает флаг ошибки. Железный флаг. Возникает немаскируемое прерывание ошибки и привет, в счетчик адреса записан железобетонный вектор в тупик. Вот и вся механика процесса

Просто нельзя чтобы счетчик адреса изменялся на значение не кратное 4-ем (0х03). Назначая в указателе индекс не с нулевого поля структуры происходит следующее - структура все равно создается целиком с 0-го поля по выровненному адресу, а указателю присвается адрес +1, который не кратен 4-ем и не может быть присвоен регистру указателю адреса процессорного ядра. У него просто физически нет двух последних бит (они эмулируются). Фиксируется ошибка при попытке записи в эти биты значений отличных от нуля

У GCC просто уже гдето прописано #pragma pack(push, 4), а у кайла по умолчанию стоит 1, вот и лепится рантайм эррор

 

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

парни, всем привет
как то раз перестал шиться чип в отладочной плате (stm32f407ve). при попытке чтения st-link utility выдает cannot read memory. disable read out protection and retry.

захожу в option bytes там стоит level 1 (хотя никто ее туда не ставил. эту плату вообще через st-link utility никто не шьет, а используют из матлаба)

меняю level 1 на level 0, жму апплай, начинается процесс, двигается зеленая полоска прогресса, доходит процентов до 15-20 и выдает ошибку could not set option bytes. please reset the target and retry. 

после резета ситуация не меняется

 

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

Изменено пользователем AlexAlex9417
Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, mail_robot сказал:

просто указатель адреса у М0 не может иметь никаких других значений, кроме кратных 4-ке. Как только кто-то пытается присвоить ему значение отличное от этого, в ядре махом вскакивает флаг ошибки. Железный флаг. Возникает немаскируемое прерывание ошибки и привет, в счетчик адреса записан железобетонный вектор в тупик. Вот и вся механика процесса

Просто нельзя чтобы счетчик адреса изменялся на значение не кратное 4-ем (0х03). Назначая в указателе индекс не с нулевого поля структуры происходит следующее - структура все равно создается целиком с 0-го поля по выровненному адресу, а указателю присвается адрес +1, который не кратен 4-ем и не может быть присвоен регистру указателю адреса процессорного ядра. У него просто физически нет двух последних бит (они эмулируются). Фиксируется ошибка при попытке записи в эти биты значений отличных от нуля

У GCC просто уже гдето прописано #pragma pack(push, 4), а у кайла по умолчанию стоит 1, вот и лепится рантайм эррор

Не совсем так, зависит от типа обращения к данным. Слово к 4, полуслово к 2, байты можно не выравнивать.

Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, mail_robot сказал:

И тут же спрашивает в чем проблема. Я хз каким местом люди читают

А там что, написано что:

6 часов назад, mail_robot сказал:

просто указатель адреса у М0 не может иметь никаких других значений, кроме кратных 4-ке

Я же выше привел пример что если я это делаю на x86 у меня никаких проблем нету. И в принципе что то подобное и ожидал.

Ссылка на комментарий
Поделиться на другие сайты

  • 5 месяцев спустя...

Здравствуйте! Собрался заказывать МК, хочу не ошибиться как прошлый раз, по этому вначале решил спросить а потом заказать))

Дисплей видимо вот такой у меня http://www.jurnal.nips.ru/sites/default/files/AaSI-1-2018-4_0.pdf

Я так понимаю управление по 8-битной параллельной шине, так что FSMC подойдет

И AD9280 или AD9283, тоже похоже что можно подключить по FSMC

Выбираю между STM32F407VGT6 и STM32F407ZGT6

STM32F407VGT6 - Дешевле, удобней размером, но есть ограничение 

Цитата

For the LQFP100 and WLCSP90 packages, only FSMC Bank1 or Bank2 are available. Bank1 can only support a multiplexed NOR/PSRAM memory using the NE1 Chip Select. Bank2 can only support a 16- or 8-bit NAND Flash memory using the NCE2 Chip Select. The interrupt line cannot be used since Port G is not available in this package.

Я не понимаю пока о чем речь) И какие типы мне нужны для работы с этими устройствами.

То есть я хочу подключить 2 устройства по 8 битной шине

Дисплей с ДМА будет слать из памяти байтики
АЦП с ДМА будет класть в память байтики

Можно ли это сделать с 100 ногим корпусом? И если да, то будет ли одинаковая производительность? То есть мне нужно что бы АЦП писало на максимальной скорости данные в ОЗУ МК.

 

Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...

Писал в другой теме, но неответили....Есть китайский показометр VC-288 на контроллере NUVOTON N76E003AT20 и он жутко тормознутый, тоесть показания меняються очень медленно. Можно ли его подключить к компу и подправить прошу? Походу и программатор надо, которого нету. Или выкинуть его?

Ссылка на комментарий
Поделиться на другие сайты

Конечно можно, если прошивка не залочена. Понадобится программатор, само собой. Ну и шарить надо в ассемблере, и придется разбираться с дизассемблированным мозголомным кодом, ибо это не ардуина со скетчами.

Изменено пользователем Dr. West

"Я не знаю какой там коэффициент, я просто паять умею. "

Ссылка на комментарий
Поделиться на другие сайты

44 минуты назад, Dr. West сказал:

Конечно можно, если прошивка не залочена. Понадобится программатор

Спасибо) короче будет как индикатор. Если программатор не куплю. Выкидать жаль, 100 гривен отдал.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • У меня больше всего вопросов вызвала необычная схема обеспечения отрицательного питания. Автор этой обстоятельной заметки пишет: For this supply to work correctly, the transformer must have a secondary voltage of at least 18V RMS.  Почему? Что будет не так с отрицательным питанием, если напряжение на трансформаторе будет меньше 18В?   https://tinyurl.com/23mlwxtt - я в простейшей эмуляции ставлю 12В пикового напряжения для трансформатора и на стабилитроне все как положено: -5.6В.
    • Согласен, очень криво объяснил. Это работа трёх вольтовой линии, просто на диод шотки сдвоенный, на один анод приходит сигнал напрямую с трансформатора, а на второй через дроссель. Вольт/деление 5 вольт в клетке, тайминг по моему 10 МС. Третья фотография это сигнал на катодах уровень земли ровно по центру экрана. Но все линии по итогу в порядке 3.3 в, 5, в, 12 в и -12 в. Нагрузить все линии не могу сразу ,так как тут же выгорают транзисторы (имеется нагрузка 250 ватт по 10 ампер на каждую линию за исключением-12в), поэтому нагружаю 3.3 вольтовую линию на 10 ампер,  подключаю переменный резистор 50 ватт на 15 ом на 5 вольтовую линию и постепенно довожу до той той картины с перекосом (это гдето  50 ватт общее). По поводу микросхемы, вверху имеется скрин где между импульсами проскакивает мини импульс, если так можно сказать, он проскакивает и на одной  и на второй ноге (7,8). Микросхема не tl 494, а lw4933/abx942.1/c9421646. Далее они приходят на базы транзисторов 945g  коллекторы этих транзисторов соединены с  выводами трансформатора. Просто схема типовая, легче мне кажется просто привести фото самого блока, для тех кто разбирается будет гораздо информативне.  Диод шотки по 12 вольтовой линии был подгоревший, заменил на донора. Приводить скрины не буду что бы не захламлять тему. В итоге, пока все так же, при достижении определенной нагрузки суммарно где-то 50 ватт, появляется этот "выброс и перекос". По этому имеются мысли на два варианта, это микросхема , этот мини импульс между периодами, на низкой нагрузке особо не влияет, но при достижении определенной приводит с самовозбуждению входной цепи и непроизвольному открытию транзистора нижнего плеча. Либо дело в "горячей части", плавающий дефект в обвязке силовых ключей.  Спасибо за ответ.
    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
    • А что нить из ассортимента активных щупов производства СССР..))
×
×
  • Создать...