Jump to content
ART_ME

STM32 для чайника

Recommended Posts

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

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

Share this post


Link to post
Share on other sites

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

На каком то сайте, какого-то магазина по РЭ, читал серию статей, как раз по этой теме. Не могу вспомнить какой сайт. :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

Тестирование литиевых батареек Fanso в нормальных условиях

Компания Компэл, эксклюзивный дистрибьютор компании Fanso, предлагает широкий перечень ЛХИТ, позволяющий подобрать элемент питания, в наибольшей степени соответствующий конкретным требованиям. Для тестирования параметров, указанных в Datasheet, специалисты Компэл организовали в апреле 2019 г. полугодовой тест на постоянный разряд в нормальных условиях четырех наиболее популярных моделей литий-тионилхлоридных и литий-диоксидмарганцевых батареек Fanso.

Посмотреть результаты первого среза

Из даташита на контроллер, который Вы сказали (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

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

 

Share this post


Link to post
Share on other sites

Прибор контроля промышленного оборудования с беспроводными и проводными интерфейсами

Непрерывный контроль для заблаговременного предупреждения отказов оборудования – важнейшая составная часть Индустрии 4,0. Перед вами перевод референсной разработки(приложены проектные файлы) Texas Instruments прибора комплексного контроля для быстрого развертывания беспроводной сети, соединяющей различные типы датчиков контроля состояния напрямую с облаком. Контроль состояния основан на периодической и непрерывной записи состояния оборудования, что является необходимым для планово-предупредительного технического обслуживания. В проект включены интерфейсы RS-232, RS-485, IO-Link и резистивный термодатчик (RTD) для контроля различных датчиков и оборудования.

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

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

Share this post


Link to post
Share on other sites
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
В 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

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

Share this post


Link to post
Share on other sites
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

Кстати обратил внимания что на четных все так же после 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
2 часа назад, MasterElectric сказал:

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

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

Share this post


Link to post
Share on other sites
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
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
6 часов назад, mail_robot сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji 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...

×
×
  • Create New...