Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

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

Пн сен 09, 2019 15:39:29

1.
Нет, так не прокатит. Регистр SPI_DR чувствителен к разрядности команды записи в него. Правая часть автоматом из uint32_t во время записи командой STRH или STRB обрежется до необходимых 16 и 8 бит.

Там будет не обрезание, а неявное приведение типа. Что ваш, что мой код скомпилируется в одно и то же на 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).

Хм-м-м... Тупая документация, на помойку её.

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

Пн сен 09, 2019 16:20:28

Не кипятись. Если ты чего-то не знаешь, то это не значит что этого нет.
Изображение
111.png
(66.84 KiB) Скачиваний: 839

Доступ к 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]

Индусские библиотеки можешь засунуть сам знаешь куда.

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

Пн сен 09, 2019 17:05:13

РАЗНОЕ поведение блока SPI

При использовании очереди. Да, не знал такой особенности.
Неужели я ошибся.jpg
(18.81 KiB) Скачиваний: 340


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

Хотя вот индусы с тобой согласны
Код:
      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);
  }

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

Пн сен 09, 2019 17:37:20

Но ведь библиотека может сама решать какие методы использовать в конкретном случае. Мне недавно посчастливилось участвовать/примазаться к разработке/тестированию одной библиотеки. Вот одна функция из неё как раз в тему. Запись в регистр по маске. Игра на скипе наложения маски при определённых счастливых значениях маски.
Код:
  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;
  }
На другом дружественном форуме её охарактеризовали как "чудовище". Но когда она компилируется в пару ассемблерных команд чувства совсем другие посещают.

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

Пн сен 09, 2019 18:57:56

Минус чтение регистра - это плюс, но выглядит действительно... не чувствуется красоты. Наверное просто придирка.

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

Пн сен 09, 2019 19:40:50

СпойлерVladislavS, разве в последней строчке не нужно так написать?
Код:
*reg = (*reg & ~dmask) | (value & dmask);

Иначе могут установиться некоторые биты в тех местах, где в маске 0, а в value 1.

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

Пн сен 09, 2019 19:43:32

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

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

Пн сен 09, 2019 19:52:53

Ну, если за этим внимательно следить, то и так можно, конечно.
А вообще, неужели при оптимизации подобное выражение:
Код:
*reg = (*reg & ~((uint32_t)0x0000FFFF)) | (value & 0x0000FFFF)

достаточно умный компилятор сам не заменит на запись в 16-битный регистр? Что-то я сомневаюсь в полезности такой "ручной" обработки всех 8-ми и 16-ти битных случев... :dont_know:

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

Пн сен 09, 2019 20:16:21

Не заменит. Если регистр определён как _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]

Убрал комментарии, а то за ними на мобильных экранах кода не видно.

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

Вс ноя 03, 2019 13:09:53

появилась необходимость прошить флешь 25Q32 телевизора. Есть в наличии программатор, я им atmega тестер транзисторов прошивал Изображение названия на нем нет - подойдёт ли он для моих целей? или надо другой брать?

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

Чт ноя 21, 2019 12:20:37

Доброго дня.
Есть у меня привод ELL 12030 на котором периодически сбоит АЦП. В качестве АЦП используется микросхема AD7927, а общается с ней микроконтроллер ADSP2181. Схема их соединения выглядит так:
СпойлерИзображение

Осциллографом я просмотрел сигналы. На SCLK идет частота 16 МГц, на остальных - разные последовательности импульсов. Когда я касаюсь щупом контакта DI0, тут же появляется сбой АЦП. Понятно, вношу помеху, но меня смущает форма импульсов на этом контакте. Выглядят они так:
СпойлерИзображение

Тоже самое в большем разрешении:
СпойлерИзображение

В начале каждого импульса (перепад 1-0) появляется какой-то странный всплеск длительностью 100 нс. Как будто дребезг контакта, но там же транзисторы на выходе, а не реле. Вопрос: нормально ли такое поведение? Это какие-то помехи или специально сгенерированный контроллером сигнал?

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

Чт ноя 21, 2019 12:24:23

нормально ли такое поведение? Это какие-то помехи или специально сгенерированный контроллером сигнал?
Нормально. Эти артефакты вносит ваш щуп. Покрутите подстроечник в своём щупе. А также - землю для SCLK берите как можно ближе к точке, откуда берёте SCLK и подавайте её на металлическое колечко вокруг острия щупа.

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

Чт ноя 21, 2019 12:40:37

Нормально. Эти артефакты вносит ваш щуп. Покрутите подстроечник в своём щупе. А также - землю для SCLK берите как можно ближе к точке, откуда берёте SCLK и подавайте её на металлическое колечко вокруг острия щупа.

Спасибо за информацию. Увы, у меня не настолько продвинутый щуп - нет на нем ни подстроечника ни колечка вокруг острия)

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

Чт ноя 21, 2019 13:54:01

появилась необходимость прошить флешь 25Q32 телевизора.
надо разобраться что за программатор... для USBasp ов и их клонов есть спецпрошивка, позволяющая шить и эти микры (сам так делал)... со стандартной прошивкой и стандартным совтом этот программатор скорее всего не подойдет...

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

Сб ноя 23, 2019 13:53:58

В МК новичок, поэтому не пинайте за вопросы.
Нужно реализовать многоразрядный параллельный регистр в одном корпусе. Составлена даже схема на простых логических элементах (где то 300 элементов). Что лучше использовать ПЛИС или МК?
Есть некоторое количество GAL16, GAL20, PIC16F628. Хватит ли их ресурсов?

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

Сб ноя 23, 2019 15:35:27

Shumadan писал(а):Нужно реализовать многоразрядный параллельный регистр в одном корпусе.
В одной микросхеме?
Тогда PIC16F628 не подойдет. У него выводов мало.
Уточните сколько выводов должно быть у регистра.

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

Сб ноя 23, 2019 16:11:29

Shumadan писал(а):Нужно реализовать многоразрядный параллельный регистр в одном корпусе.
В одной микросхеме?
Тогда PIC16F628 не подойдет. У него выводов мало.
Уточните сколько выводов должно быть у регистра.

Вроде должно хватить. Если нет каких то ограничений.
5 входов и 5 выходов, 1 вход тактирующий

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

Вт ноя 26, 2019 19:47:11

так никто не поможет? стою и думаю с чего начать изучение - МК или ПЛИС?

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

Вт дек 03, 2019 00:09:07

Парни, привет. Может кто подсказать каким простеньким (желательно из тех что есть на Али) программатором можно прочитать и перезаписать память 95640? В наличии имеется ПикКит3 и USBasp 2.0 но они как я понял не умеют читать и шить память да?

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

Ср дек 18, 2019 19:54:38

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