Easyelectronics.ru

Электроника для всех
Текущее время: 10 авг 2020, 05:29

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 3340 ]  На страницу Пред.  1 ... 112, 113, 114, 115, 116, 117, 118 ... 134  След.
Автор Сообщение
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 05 фев 2020, 21:20 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6905
Если на PA4 указан альтернативный режим = DAC, то не включение этого (альтернативного) режима означает, что DAC на выходе вы не увидите.
Например, для OPAMP это не так (как всегда), там нет альтернативного режима и включение OPAMP выталкивает порт нафиг.
/(могу ошибаться)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 22 фев 2020, 20:46 
Заглядывает иногда

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 117
Добрый день!

Текущая неделя подкинула аномалию.. простите с моим английским боюсь не выкурю ее из RM. Чип 405RGT6, работает в режиме SPI-слейва. Захватывает данные (от АЦП) и отдает их мастеру по запросу. Дебажу, вылизываю. Программно через прерывание EXTI запускаю модуль SPI потом так же выключаю. Все пашет, запустилось. Есть прерывание от таймера которое срабатывает раз в 1мс, приоритет наинизший, делает всякие общие задачи по обслуживанию чипа.

Написал в в этом прерывании:
#define LED11_ON (GPIOA->BSRR = GPIO_BSRR_BS11)
#define LED11_OFF (GPIOA->BSRR = GPIO_BSRR_BR11)

if(SPI1->CR1 & SPI_CR1_SPE)
LED11_ON;
else
LED11_OFF;

т.е захотелось диодом подсветить работу SPI. (я понимаю, это можно сделать и иначе, но сделал так).
И возникла трабла.. как бы сказать, буферная, часть отдаваемого буфера повреждается. Точно не скажу как именно, но факт в том что данная конструкция оказалась небезразлична по отношению к процессу работы SPI. А мне казалось что регистр типа R/W можно безболезненно прочитать в.т.ч с поразрядной операцией. Или нет???
Признаюсь честно, вместо операций с GPIO других действий еще делать не пробовал.. задача "разобраться с этим" поставлена на сл.неделю.


Последний раз редактировалось esatman 22 фев 2020, 22:39, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 22 фев 2020, 21:09 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1235
esatman писал(а):
А мне казалось что регистр типа R/W можно безболезненно прочитать

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 22 фев 2020, 21:14 
Заглядывает иногда

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 117
Ясно. Питание подведено вроде адекватно (3.3 с 600мА чипа, 100нф на всех входах в параллели с 10мкФ и общий на чип тантал 100мкФ), но где-то читал про этот проц что у кого-то читал, интенсивные деления на float вызывали глюки, пока электролит не поставил. (причем неполярник такой же емкости не помогал)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 22 фев 2020, 21:19 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Надеюсь, св.диод через резистор подключили? 600 мА - это что, потребление МК? эээ, вы его поджарите, стопудово св.диод без резистора. У МК максимум 270 мА через все ноги питания.
Для работы слейва есть режим SPI slave, его можно сконфигурировать. Тогда сконфигурированный SPI slave будет самостоятельно отдавать байты по запросу от SPI master.


Последний раз редактировалось BusMaster 22 фев 2020, 21:24, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 22 фев 2020, 21:23 
Заглядывает иногда

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 117
Да, LEDs через 680Ом, это 2 единственных где использую pull push, мастер-чип давно переразвел на OD чтобы ток через чип не подавался.

Ну дык у меня SPI slave аппаратный, только CS программный. Потому что на ноге NSS DAC висит, а он мне нужен как DAC.

600ма это предельный ресурс DCDC который дает 3.3.
Причем он общий с 103 VET6, и AVDD на оба подаю с второго такого же DCDC.

Я НЕ ОЖИДАЛ глюка в описанном месте, и когда нашел, 10 этажно выматерившись оставил разбор на потом, понятно, что разобрать надо. Кто что думает пожалуйста напишите, на сл.неделе поковыряю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 22 фев 2020, 23:06 
Заглядывает иногда

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 117
Вот! Нашел!
https://radiokot.ru/forum/viewtopic.php?p=2594819
Тут вопрос связан с другим, но найдите 4 сообщение (balmer):
>>Но была и засада, которую долго искал.
>>На STM32F405 были слышны шумы при активной обработке float.
>>Решилось добавлением электролитов по питанию.
>>Неполярные конденсаторы такой-же емкости почемуто проблемы не решали.

Есть платка, проприетарная, на примере которой я учусь.. и кстати есть с десяток предыдущих поколений этой платы. На них всех, единогласно я не нахожу танталов, только керамика и электролиты.

А я помимо того что на 405RGT6 float-ом тоже оперирую, неслабо, так еще и ток сливаю на светодиоды через 680Ом. причем с частотой из прерывания. И электролитов у меня нет, только тантал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 02 мар 2020, 10:52 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
Вчера с IAR наткнулся на проблему которую не понимаю как решить
Есть структура с атрибутом __packed и в ней поле uint16_t
Хочу взять значение этого поля в переменную типа uint16_t
Получаю ошибку приведения типа - компилятор пишет, что ему не известно как uint16_t __packed преобразовать в uint16_t
Где копать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 03 мар 2020, 02:47 
Старожил

Зарегистрирован: 01 фев 2013, 02:21
Сообщения: 332
axill писал(а):
Вчера с IAR наткнулся на проблему которую не понимаю как решить
Есть структура с атрибутом __packed и в ней поле uint16_t
Хочу взять значение этого поля в переменную типа uint16_t
Получаю ошибку приведения типа - компилятор пишет, что ему не известно как uint16_t __packed преобразовать в uint16_t
Где копать?

Google, IAR саппорт... Не забудьте им номер лицензии скинуть...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 03 мар 2020, 07:56 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1515
axill писал(а):
Есть структура с атрибутом __packed и в ней поле uint16_t
Ну, допустим.
Код:
struct __attribute__((__packed__)) USB_CDC_HEADER_FUNCTIONAL_DESCRIPTOR
{
  uint8_t        bLength;             // длина дескриптора
  uint8_t        bDescriptorType;     // тип дескриптора (Class Specific Interface)
  uint8_t        bDescriptorSubType;  // подтип дескриптора (Header Functional Descriptor)
  uint16_t       bcdCDC;              // CDC Version ( 1.10 ) 
};

USB_CDC_HEADER_FUNCTIONAL_DESCRIPTOR tmp_struct;
axill писал(а):
Хочу взять значение этого поля в переменную типа uint16_t
Законное желание
Код:
uint16_t tmp = tmp_struct.bcdCDC;
axill писал(а):
Получаю ошибку приведения типа - компилятор пишет, что ему не известно как uint16_t __packed преобразовать в uint16_t
И не получаю никаких ошибок. ЧЯДНТ?

axill писал(а):
Где копать?
В вашем секретном коде.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 04 мар 2020, 23:56 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
VladislavS спасибо за ответ

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

template <typename T>
class swap_word {
protected:
  uint16_t   data;
public:
  swap_word() {}
  swap_word(T p) { data = (static_cast<uint16_t>(p) << 8) | (static_cast<uint16_t>(p) >> 8); }
  operator T () const { return static_cast<T>((data << 8) | (data >> 8)); }
  bool operator ==(const swap_word<T>& p) const { return data == p.data; }
};

typedef swap_word<uint16_t>    uint16;

struct ID {
protected:
    uint16   id;
public:
    operator uint16_t () const { return id; }
};

}}


класс ID я включаю в другой класс:
Код:
__packed struct MessageBase {
  ID   id;
  .......
};

и вот когда я обращаюсь к MessageBase::id в контексте uint16_t при компиляции возникает та самая ошибка на строчке оператора приведения типа из класса ID:
Код:
    operator uint16_t () const { return id; }


если в классе ID описать тип поля id как простой uint16_t - ошибка исчезает
сама много раз перечитал свой код, вроде все необходимые описания сделаны
почему он цепляется к преобразованию комплексного поля при наличии атрибута __packed - ума не приложу.

Если атрибут убрать, но оставить комплексный тип - ошибка тоже исчезает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 05 мар 2020, 00:38 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1515
http://www.keil.com/support/man/docs/ar ... 968737.htm

Мне видится, что там как минимум конструктора копирования не хватает, так как id возвращается из функции. А как максимум, оператора присваивания между упакованным и неупакованным типами, так как согласно тому что написано по ссылке они не assignment-compatible.

PS: пора отучаться от typedef. Сейчас есть using.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 05 мар 2020, 01:18 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
VladislavS писал(а):
http://www.keil.com/support/man/docs/armcc/armcc_chr1359124968737.htm

Мне видится, что там как минимум конструктора копирования не хватает, так как id возвращается из функции. А как максимум, оператора присваивания между упакованным и неупакованным типами, так как согласно тому что написано по ссылке они не assignment-compatible.

PS: пора отучаться от typedef. Сейчас есть using.

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

Я нашел решение - я для stm32 добавил оператор приведения с __packed:
Код:
template <typename T>
class swap_word {
protected:
  uint16_t   data;
public:
  swap_word() {}
  swap_word(T p) { data = (static_cast<uint16_t>(p) << 8) | (static_cast<uint16_t>(p) >> 8); }
  operator T () const { return static_cast<T>((data << 8) | (data >> 8)); }
#ifdef SMCOM_PLATFORM_STM32F0
  operator T () const __packed { return static_cast<T>((data << 8) | (data >> 8)); }
#endif
  bool operator ==(const swap_word<T>& p) const { return data == p.data; }
};



про typedef подскажите какая должна быть конструкция?
чем заменить например такой кусок кода?
Код:
  namespace BigEndian {
    class Static : public StaticNoSwap {};
    typedef uint16_t    uint16;
    typedef int16_t     int16;
    typedef uint32_t    uint32;
    typedef int32_t     int32;
  }


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 05 мар 2020, 01:39 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1515
https://ru.cppreference.com/w/cpp/language/type_alias

В принципе, пока не доходит дело до шаблонов, разницы с typedef никакой. А вот с шаблонами using. Так зачем два разных синтаксиса для одного действия использовать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 08 мар 2020, 13:03 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
пишу дальше код для STM32F030F4
добавил буквально не более 10 строк в разные классы, в код который становится активным внутри loop в main
Сам main никак не менялся, никаких экземпляров с++ объектов с инициализацией до main не возникло
Сам main выглядит так:
Show


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

так вот - при старте деббагера стал выпадать в эксепшин и все.
я не понимаю что с этим происходит.
как понять откуда проблема?

Ниже скриншоты из окон дебаггера сразу после старта отладки
Вложение:
log.jpg
log.jpg [ 40.91 Кб | Просмотров: 192 ]


Вложение:
log2.jpg
log2.jpg [ 42.43 Кб | Просмотров: 192 ]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 08 мар 2020, 13:41 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Чаще всего - обращение по неинициализованному указателю. Указатель содержит произвольный адрес, и он попадает вкудато не втуда, вгде нельзя. Адрес последней инструкции указан - в ассемблерном листинге найдите его и увидите, откудава возникло.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 08 мар 2020, 14:06 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
Спасибо, попробую

Но в целом это было бы очень странно. Не использую динамической памяти.
Все глобальные обьекты статика


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 08 мар 2020, 14:13 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
да и в статике - проще простого накосячить:
Код:
uint8_t *p;
*p = 10;

...и всё, приехали.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 08 мар 2020, 14:40 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
BusMaster писал(а):
да и в статике - проще простого накосячить:
Код:
uint8_t *p;
*p = 10;

...и всё, приехали.

нууу, я такое не использую вообще
статика в моем понимании это когда используется области данных выделенные во время компиляции и линковки, а не во время исполнения
в вашем примере не статика, здесь место во время компиляции выделено не было


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 08 мар 2020, 14:42 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
BusMaster писал(а):
Чаще всего - обращение по неинициализованному указателю. Указатель содержит произвольный адрес, и он попадает вкудато не втуда, вгде нельзя. Адрес последней инструкции указан - в ассемблерном листинге найдите его и увидите, откудава возникло.

Вложение:
log3.png
log3.png [ 46.95 Кб | Просмотров: 158 ]


об этом речь?
Там ниже метод RXAvailable моего статичного класса UART.
Сам класс инициализируется и используется уже после вызова main
Как программа могла сюда попасть до main?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 08 мар 2020, 14:49 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Найдите адрес 0x0800'09a6 и посмотрите, какому участку кода он принадлежит.

Цитата:
в вашем примере не статика, здесь место во время компиляции выделено не было

Оно выделено для указателя. Указатель - это четырехбайтная переменная, хранящая адрес той переменной, на которую указывает указатель. В данный момент указатель хранит значение 0x0000'0000, то есть указывает на адрес 0ч0000'0000 в адресном пространстве, который, конечно же, не попадает в допустимые адреса SRAM.
И при попытке записать в этот адрес получим "ахтунг":
Вложение:
2020-03-08.png
2020-03-08.png [ 30.51 Кб | Просмотров: 145 ]

Вложение:
2020-03-08 (1).png
2020-03-08 (1).png [ 46.63 Кб | Просмотров: 145 ]


Последний раз редактировалось BusMaster 08 мар 2020, 15:11, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 08 мар 2020, 14:59 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
упс, это мой класс абстрагирования от порядка байт
наверно теперь нужно искать в каком статическом конструкторе он вызывается?

Вложение:
log4.png
log4.png [ 50.95 Кб | Просмотров: 153 ]


Сам код
Код:
template <typename T>
class swap_word {
protected:
  uint16_t   data;
public:
  swap_word() {}
  swap_word(T p) { data = (static_cast<uint16_t>(p) << 8) | (static_cast<uint16_t>(p) >> 8); }
  operator T () const { return static_cast<T>((data << 8) | (data >> 8)); }
#ifdef SMCOM_PLATFORM_STM32F0
  operator T () const __packed { return static_cast<T>((data << 8) | (data >> 8)); }
#endif
  bool operator ==(const swap_word<T>& p) const { return data == p.data; }
};


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 08 мар 2020, 15:07 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 2045
Мне кажется что прежде чем в дебри C++ хорошо бы книжки почитать.
И не забывать про конструкторы.
И учитывать, что инициализацияя всей C++ лабуды делается до main
Ставите BP на SystemInit и после выхода из него по шагам (F11) смотрите какие конструкторы классов вызываются и где падает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 08 мар 2020, 15:16 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1235
axill писал(а):
Сам код

Вместо класса swap_word лучше использовать простую функцию. Передал uint16_t, вернуло uint16_t, хранишь, сравниваешь и т.д. как uint16_t...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 для чайников
СообщениеДобавлено: 08 мар 2020, 15:22 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5358
x893 писал(а):
Мне кажется что прежде чем в дебри C++ хорошо бы книжки почитать.
И не забывать про конструкторы.
И учитывать, что инициализацияя всей C++ лабуды делается до main
Ставите BP на SystemInit и после выхода из него по шагам (F11) смотрите какие конструкторы классов вызываются и где падает.

конструкторы у статичных классов по которым не существуют экземпляры?
вы о чем?

с++ 11 и старше хорош для эмбендинга как раз шаблонами, а не ОП

Как мне поставить точку на SystemInit? Где его найти?
В проекте у меня только мой main.c и ассемблерный файл с векторами прерываний


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3340 ]  На страницу Пред.  1 ... 112, 113, 114, 115, 116, 117, 118 ... 134  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB