ART_ME

STM32 для чайника

2096 posts in this topic

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

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

Share this post


Link to post
Share on other sites
Alex    589

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

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

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

Share this post


Link to post
Share on other sites

 pzAPgIml.jpg

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

 

Share this post


Link to post
Share on other sites

Старт складской программы по Wi-Fi/ Bluetooth-чипам от Espressif

На склад КОМПЭЛ поступили чипы, модули и отладочные платы от компании Espressif Systems на базе ESP8266 и ESP32. Стоимость всех изделий данной линейки – в 2-3 раза ниже ближайших аналогов, чипы занимают минимальное место на плате, энергоэффективны и универсальны в применении

Подробнее...

Alex    589

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

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

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

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

Share this post


Link to post
Share on other sites

Вебинар Литиевые ХИТы FANSO или что нужно знать инженеру о батарейках»

20 июня компания Компэл приглашает всех желающих принять участие в вебинаре, посвященном литиевым батарейкам FANSO. На вебинаре будет рассказано о параметрах батареек, их зависимости от режима работы и эксплуатации. Будет дана информация о том, на какие параметры следует обращать внимание, выбирая литиевый ХИТ, и как избежать некоторых проблем.

Подробнее...

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

Share this post


Link to post
Share on other sites
Alex    589
2 часа назад, DrobyshevAlex сказал:

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

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

Share this post


Link to post
Share on other sites
Цитата

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

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

Share this post


Link to post
Share on other sites
vonavi    0
В 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 - всё завелось без каких-либо проблем.

Share this post


Link to post
Share on other sites
vonavi    0

Прошил stm32f100c8t6b - та же ситуация. Линия BUSY, описанный метод решения виснет на пятом шаге.

Share this post


Link to post
Share on other sites
tar    39
Posted (edited)

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

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

Расписал я память, начал ее мапить ссылками на структуры, и внезапно часть структур мапится и работает корректно а часть при маппиге и использовании сваливает проц в 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

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

Edited by tar
Указал IDE

Share this post


Link to post
Share on other sites
tar    39

Кстати обратил внимания что на четных все так же после 2 байт идет 2 чистых байта ни к чему не привязаны, откуда они там берутся?

Share this post


Link to post
Share on other sites
Posted (edited)

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

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

Edited by MasterElectric

Share this post


Link to post
Share on other sites
tar    39
2 часа назад, MasterElectric сказал:

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

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

Share this post


Link to post
Share on other sites
Вуйко    18
Posted (edited)

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

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

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

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

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

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

 

 

Edited by Вуйко

Share this post


Link to post
Share on other sites
mail_robot    1502
Posted (edited)

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

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

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

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

 

Edited by mail_robot

Share this post


Link to post
Share on other sites
Posted (edited)

парни, всем привет
как то раз перестал шиться чип в отладочной плате (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. 

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

 

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

Edited by AlexAlex9417

Share this post


Link to post
Share on other sites
3 часа назад, mail_robot сказал:

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

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

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

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

Share this post


Link to post
Share on other sites
tar    39
6 часов назад, mail_robot сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites

Your content will need to be approved by a moderator

Guest
You are commenting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoticons maximum are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...