Мелкие вопросы по МК и ПЛИС.

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 128
Зарегистрирован: Пн фев 08, 2016 10:57:14

Сообщение smalcom »

1.
[uquote="VladislavS",url="/forum/viewtopic.php?p=3697189#p3697189"]Нет, так не прокатит. Регистр SPI_DR чувствителен к разрядности команды записи в него. Правая часть автоматом из uint32_t во время записи командой STRH или STRB обрежется до необходимых 16 и 8 бит.[/uquote]
Там будет не обрезание, а неявное приведение типа. Что ваш, что мой код скомпилируется в одно и то же на STM32. Только это не тот случай когда нужна работа с указателями. И при переносе на BigEndian-систему можно отловить трудновыявимых граблей.

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

/**
  * @brief  Transmits a Data through the SPIx/I2Sx peripheral.
  * @param  SPIx: where x can be
  *   - 1, 2 or 3 in SPI mode 
  *   - 2 or 3 in I2S mode
  * @param  Data : Data to be transmitted.
  * @retval None
  */
void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data)
{
  /* Check the parameters */
  assert_param(IS_SPI_ALL_PERIPH(SPIx));
  
  /* Write in the DR register the data to be sent */
  SPIx->DR = Data;
}
Тупая библиотека, на помойку её.

2.
IAR делает 9 операций записи, GCC три. Комментарии излишни.
Сначала "убить" volatile приведением типа, а потом геройски найти решение. *КРУТОЧЁ*
В данном случае себя верно ведёт GCC, т. к. данные нигде не используются и результат не нужен.

3.
обрежется до необходимых 16 и 8 бит.
25.5
SPI and I2S registers
Refer to Section 2.1 on page 46 for a list of abbreviations used in register descriptions.
The peripheral registers can be accessed by half-words (16-bit) or words (32-bit).
Хм-м-м... Тупая документация, на помойку её.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Не кипятись. Если ты чего-то не знаешь, то это не значит что этого нет.
Изображение
111.png
(66.84 КБ) 898 скачиваний
Доступ к SPI_DR командой STRH или STRB даёт РАЗНОЕ поведение блока SPI. Ну и конечно же, скомпилированный код будет разный.

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

        LDR.N    R0,??DataTable1  ;; 0x4001300c
//*(volatile uint16_t *)&SPI1->DR = 0xAABB;        
        MOVW     R1,#+43707
        STRH     R1,[R0, #+0]
//*(volatile uint8_t *)&SPI1->DR = 0xAA;  
        MOVS     R2,#+170
        STRB     R2,[R0, #+0]
Индусские библиотеки можешь засунуть сам знаешь куда.
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 128
Зарегистрирован: Пн фев 08, 2016 10:57:14

Сообщение smalcom »

РАЗНОЕ поведение блока SPI
При использовании очереди. Да, не знал такой особенности.
Неужели я ошибся.jpg
(18.81 КБ) 363 скачивания
Наверное подсознательно берёгся от этого подблока с такой глупой логикой.
Тем не менее, я бы не использовал один класс для работы с разными подблоками, логичнее использовать наследника, который заточен на работу с очередью.

Хотя вот индусы с тобой согласны

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

      if (hspi->TxXferCount > 1U)
      {
        /* write on the data register in packing mode */
        hspi->Instance->DR = *((uint16_t *)pData);
        pData += sizeof(uint16_t);
        hspi->TxXferCount -= 2U;
      }
      else
      {
        *((__IO uint8_t *)&hspi->Instance->DR) = (*pData++);
        hspi->TxXferCount--;
      }
....
  /* Set the Rx Fifo threshold */
  if (hspi->Init.DataSize > SPI_DATASIZE_8BIT)
  {
    /* Set RX Fifo threshold according the reception data length: 16bit */
    CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
  }
  else
  {
    /* Set RX Fifo threshold according the reception data length: 8bit */
    SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
  }
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Но ведь библиотека может сама решать какие методы использовать в конкретном случае. Мне недавно посчастливилось участвовать/примазаться к разработке/тестированию одной библиотеки. Вот одна функция из неё как раз в тему. Запись в регистр по маске. Игра на скипе наложения маски при определённых счастливых значениях маски.

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

  template<uint32_t dmask>
  static _inline_ void writeReg32(volatile uint32_t* reg, uint32_t value)
  {    
    if constexpr (dmask == 0xFFFFFFFF) 
      *reg = value;
    else if constexpr (dmask == 0x0000FFFF) 
      *(volatile uint16_t*)reg = value;
    else if constexpr (dmask == 0xFFFF0000) 
      *((volatile uint16_t*)reg + 1) = value >> 16;
    else if constexpr (dmask == 0x000000FF)
      *(volatile uint8_t*)reg = value;
    else if constexpr (dmask == 0x0000FF00)
      *((volatile uint8_t*)reg + 1) = value >> 8;
    else if constexpr (dmask == 0x00FF0000)
      *((volatile uint8_t*)reg + 2) = value >> 16;
    else if constexpr (dmask == 0xFF000000)
      *((volatile uint8_t*)reg + 3) = value >> 24;
    else
      *reg = (*reg & ~dmask) | value;
  }
На другом дружественном форуме её охарактеризовали как "чудовище". Но когда она компилируется в пару ассемблерных команд чувства совсем другие посещают.
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 128
Зарегистрирован: Пн фев 08, 2016 10:57:14

Сообщение smalcom »

Минус чтение регистра - это плюс, но выглядит действительно... не чувствуется красоты. Наверное просто придирка.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

Сообщение *Trigger* »

СпойлерVladislavS, разве в последней строчке не нужно так написать?

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

*reg = (*reg & ~dmask) | (value & dmask);
Иначе могут установиться некоторые биты в тех местах, где в маске 0, а в value 1.
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

В общем случае да, но в библиотеке на вход этой функции приходят подготовленные данные, в них нет лишних бит. Подготовка этих данных как раз и есть основная сложность библиотеки, а это уже финальная мелкая оптимизация.
Друг Кота
Аватара пользователя
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

Сообщение *Trigger* »

Ну, если за этим внимательно следить, то и так можно, конечно.
А вообще, неужели при оптимизации подобное выражение:

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

*reg = (*reg & ~((uint32_t)0x0000FFFF)) | (value & 0x0000FFFF)
достаточно умный компилятор сам не заменит на запись в 16-битный регистр? Что-то я сомневаюсь в полезности такой "ручной" обработки всех 8-ми и 16-ти битных случев... :dont_know:
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Не заменит. Если регистр определён как _IO uint32_t *reg; то запись будет всегда 32-битная. И оптимизация то не ручная, её компилятор на этапе компиляции сам делает.

Добавлено after 14 minutes:
Трудно удержаться, чтобы не похвастаться. Вот тут конфигурация трёх GPIO контроллера.

Код
Спойлер

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

ConfigList<
  PinMode::PushPull_MediumSpeed<0>, 
    PA3, PA5, PA7, PA12, 
    GpioB<0x3F>, PB13, PB14, PB15, 
    GpioC<0xF>, PC5, PC6, PC8, PC9, PC15, 
  PinMode::Floating,               
    PA0, PA1, PA2, PA4, PA6, PA10, PA11, 
    PB6, PB12, PC4, PC7, 
  PinMode::PullDown, PA13, PA14, 
  PinMode::AF_PushPull_MediumSpeed,
    PA8, PA9, PA15, 
  PinMode::AF_OpenDrain_MediumSpeed, 
    PB8, PB9, PB10, PB11, 
  PinMode::AF_PushPull_HighSpeed, PB7,
  PinMode::Floating, CfgCmd::AllUnusedPins
>::mode();
Листинг. Всё просчитал компилятор сам на этапе компиляции!
Спойлер

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

        LDR.N    R2,??__low_level_init_0+0x2C  ;; 0x40010004
        LDR.N    R3,??__low_level_init_0+0x30  ;; 0x14141444
        LDR.N    R4,??__low_level_init_0+0x34  ;; 0x98814499
        LDR.N    R5,??__low_level_init_0+0x38  ;; 0x836f0000
        STR      R3,[R2, #+2044]
        STR      R4,[R2, #+2048]
        LDR.N    R3,??__low_level_init_0+0x3C  ;; 0x70a80000
        LDR.N    R4,??__low_level_init_0+0x40  ;; 0xb4111111
        STR      R3,[R2, #+2060]
        STR      R4,[R2, #+3068]
        LDR.N    R3,??__low_level_init_0+0x44  ;; 0x1114dddd
        LDR.N    R4,??__low_level_init_0+0x48  ;; 0xe03f0000
        STR      R3,[R2, #+3072]
        STR      R4,[R2, #+3084]
        LDR.N    R3,??__low_level_init_0+0x4C  ;; 0x41141111
        LDR.N    R4,??__low_level_init_0+0x50  ;; 0x14444411
        STR      R3,[R2, #+4092]
        LDR.N    R3,??__low_level_init_0+0x54  ;; 0x40011004
        STR      R4,[R3, #+0]
        STR      R5,[R3, #+12]
Убрал комментарии, а то за ними на мобильных экранах кода не видно.
Встал на лапы
Аватара пользователя
Сообщения: 96
Зарегистрирован: Пт сен 08, 2017 16:54:41

Сообщение Dmitriy70 »

появилась необходимость прошить флешь 25Q32 телевизора. Есть в наличии программатор, я им atmega тестер транзисторов прошивал Изображение названия на нем нет - подойдёт ли он для моих целей? или надо другой брать?
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 183
Зарегистрирован: Вт сен 14, 2010 23:07:10
Откуда: Ростов

Сообщение baron_P »

Доброго дня.
Есть у меня привод ELL 12030 на котором периодически сбоит АЦП. В качестве АЦП используется микросхема AD7927, а общается с ней микроконтроллер ADSP2181. Схема их соединения выглядит так:
СпойлерИзображение
Осциллографом я просмотрел сигналы. На SCLK идет частота 16 МГц, на остальных - разные последовательности импульсов. Когда я касаюсь щупом контакта DI0, тут же появляется сбой АЦП. Понятно, вношу помеху, но меня смущает форма импульсов на этом контакте. Выглядят они так:
СпойлерИзображение
Тоже самое в большем разрешении:
СпойлерИзображение
В начале каждого импульса (перепад 1-0) появляется какой-то странный всплеск длительностью 100 нс. Как будто дребезг контакта, но там же транзисторы на выходе, а не реле. Вопрос: нормально ли такое поведение? Это какие-то помехи или специально сгенерированный контроллером сигнал?
We do what we must because we can (c) GLaDOS
Мудрый кот
Сообщения: 1743
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="baron_P",url="/forum/viewtopic.php?p=3740728#p3740728"]нормально ли такое поведение? Это какие-то помехи или специально сгенерированный контроллером сигнал?[/uquote]Нормально. Эти артефакты вносит ваш щуп. Покрутите подстроечник в своём щупе. А также - землю для SCLK берите как можно ближе к точке, откуда берёте SCLK и подавайте её на металлическое колечко вокруг острия щупа.
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 183
Зарегистрирован: Вт сен 14, 2010 23:07:10
Откуда: Ростов

Сообщение baron_P »

[uquote="jcxz",url="/forum/viewtopic.php?p=3740733#p3740733"]Нормально. Эти артефакты вносит ваш щуп. Покрутите подстроечник в своём щупе. А также - землю для SCLK берите как можно ближе к точке, откуда берёте SCLK и подавайте её на металлическое колечко вокруг острия щупа.[/uquote]
Спасибо за информацию. Увы, у меня не настолько продвинутый щуп - нет на нем ни подстроечника ни колечка вокруг острия)
We do what we must because we can (c) GLaDOS
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

[uquote="Dmitriy70",url="/forum/viewtopic.php?p=3729878#p3729878"]появилась необходимость прошить флешь 25Q32 телевизора.[/uquote]надо разобраться что за программатор... для USBasp ов и их клонов есть спецпрошивка, позволяющая шить и эти микры (сам так делал)... со стандартной прошивкой и стандартным совтом этот программатор скорее всего не подойдет...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Встал на лапы
Аватара пользователя
Сообщения: 106
Зарегистрирован: Вт июл 25, 2017 22:47:08
Откуда: KAZAN

Сообщение Shumadan »

В МК новичок, поэтому не пинайте за вопросы.
Нужно реализовать многоразрядный параллельный регистр в одном корпусе. Составлена даже схема на простых логических элементах (где то 300 элементов). Что лучше использовать ПЛИС или МК?
Есть некоторое количество GAL16, GAL20, PIC16F628. Хватит ли их ресурсов?
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Shumadan писал(а):Нужно реализовать многоразрядный параллельный регистр в одном корпусе.
В одной микросхеме?
Тогда PIC16F628 не подойдет. У него выводов мало.
Уточните сколько выводов должно быть у регистра.
Встал на лапы
Аватара пользователя
Сообщения: 106
Зарегистрирован: Вт июл 25, 2017 22:47:08
Откуда: KAZAN

Сообщение Shumadan »

[uquote="Мурик",url="/forum/viewtopic.php?p=3742046#p3742046"]
Shumadan писал(а):Нужно реализовать многоразрядный параллельный регистр в одном корпусе.
В одной микросхеме?
Тогда PIC16F628 не подойдет. У него выводов мало.
Уточните сколько выводов должно быть у регистра.[/uquote]
Вроде должно хватить. Если нет каких то ограничений.
5 входов и 5 выходов, 1 вход тактирующий
Встал на лапы
Аватара пользователя
Сообщения: 106
Зарегистрирован: Вт июл 25, 2017 22:47:08
Откуда: KAZAN

Сообщение Shumadan »

так никто не поможет? стою и думаю с чего начать изучение - МК или ПЛИС?
Встал на лапы
Аватара пользователя
Сообщения: 116
Зарегистрирован: Ср май 14, 2014 20:44:56
Откуда: Республика Карелия

Сообщение recyclebin »

Парни, привет. Может кто подсказать каким простеньким (желательно из тех что есть на Али) программатором можно прочитать и перезаписать память 95640? В наличии имеется ПикКит3 и USBasp 2.0 но они как я понял не умеют читать и шить память да?
Мучитель микросхем
Сообщения: 460
Зарегистрирован: Вс авг 16, 2015 13:08:53

Сообщение Бубоник »

Всем привет! Ребята подскажите почему stm8 нагинает stm32? Брал одинаковый кусок кода (переменные 32 бит) ставил оба мк на 8МГц, в итоге в итоге stm8 шуршит быстрее раза в 4. По дизасемблеру смотрел код разница незначительная, но не на столько чтобы в 4 раза медленнее работал
recyclebin SPI флешки перепрошивал extrapic-oм. Но я под него софт еще пилил.
Ответить

Вернуться в «Разные вопросы по МК»