Нет, так не прокатит. Регистр 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).
Наверное подсознательно берёгся от этого подблока с такой глупой логикой. Тем не менее, я бы не использовал один класс для работы с разными подблоками, логичнее использовать наследника, который заточен на работу с очередью.
Хотя вот индусы с тобой согласны
Код:
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); }
Но ведь библиотека может сама решать какие методы использовать в конкретном случае. Мне недавно посчастливилось участвовать/примазаться к разработке/тестированию одной библиотеки. Вот одна функция из неё как раз в тему. Запись в регистр по маске. Игра на скипе наложения маски при определённых счастливых значениях маски.
Код:
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; }
На другом дружественном форуме её охарактеризовали как "чудовище". Но когда она компилируется в пару ассемблерных команд чувства совсем другие посещают.
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
В общем случае да, но в библиотеке на вход этой функции приходят подготовленные данные, в них нет лишних бит. Подготовка этих данных как раз и есть основная сложность библиотеки, а это уже финальная мелкая оптимизация.
достаточно умный компилятор сам не заменит на запись в 16-битный регистр? Что-то я сомневаюсь в полезности такой "ручной" обработки всех 8-ми и 16-ти битных случев...
_________________ Этот пост оказался полезен? Не поленись, нажми слева!
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Не заменит. Если регистр определён как _IO uint32_t *reg; то запись будет всегда 32-битная. И оптимизация то не ручная, её компилятор на этапе компиляции сам делает.
Добавлено after 14 minutes: Трудно удержаться, чтобы не похвастаться. Вот тут конфигурация трёх GPIO контроллера.
Заголовок сообщения: Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вс ноя 03, 2019 13:09:53
Встал на лапы
Зарегистрирован: Пт сен 08, 2017 16:54:41 Сообщений: 95
Рейтинг сообщения:0
появилась необходимость прошить флешь 25Q32 телевизора. Есть в наличии программатор, я им atmega тестер транзисторов прошивал названия на нем нет - подойдёт ли он для моих целей? или надо другой брать?
Доброго дня. Есть у меня привод ELL 12030 на котором периодически сбоит АЦП. В качестве АЦП используется микросхема AD7927, а общается с ней микроконтроллер ADSP2181. Схема их соединения выглядит так: Спойлер Осциллографом я просмотрел сигналы. На SCLK идет частота 16 МГц, на остальных - разные последовательности импульсов. Когда я касаюсь щупом контакта DI0, тут же появляется сбой АЦП. Понятно, вношу помеху, но меня смущает форма импульсов на этом контакте. Выглядят они так: Спойлер Тоже самое в большем разрешении: Спойлер В начале каждого импульса (перепад 1-0) появляется какой-то странный всплеск длительностью 100 нс. Как будто дребезг контакта, но там же транзисторы на выходе, а не реле. Вопрос: нормально ли такое поведение? Это какие-то помехи или специально сгенерированный контроллером сигнал?
_________________ We do what we must because we can (c) GLaDOS
нормально ли такое поведение? Это какие-то помехи или специально сгенерированный контроллером сигнал?
Нормально. Эти артефакты вносит ваш щуп. Покрутите подстроечник в своём щупе. А также - землю для SCLK берите как можно ближе к точке, откуда берёте SCLK и подавайте её на металлическое колечко вокруг острия щупа.
Нормально. Эти артефакты вносит ваш щуп. Покрутите подстроечник в своём щупе. А также - землю для SCLK берите как можно ближе к точке, откуда берёте SCLK и подавайте её на металлическое колечко вокруг острия щупа.
Спасибо за информацию. Увы, у меня не настолько продвинутый щуп - нет на нем ни подстроечника ни колечка вокруг острия)
_________________ We do what we must because we can (c) GLaDOS
появилась необходимость прошить флешь 25Q32 телевизора.
надо разобраться что за программатор... для USBasp ов и их клонов есть спецпрошивка, позволяющая шить и эти микры (сам так делал)... со стандартной прошивкой и стандартным совтом этот программатор скорее всего не подойдет...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
В МК новичок, поэтому не пинайте за вопросы. Нужно реализовать многоразрядный параллельный регистр в одном корпусе. Составлена даже схема на простых логических элементах (где то 300 элементов). Что лучше использовать ПЛИС или МК? Есть некоторое количество GAL16, GAL20, PIC16F628. Хватит ли их ресурсов?
Заголовок сообщения: Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт дек 03, 2019 00:09:07
Встал на лапы
Карма: 1
Рейтинг сообщений: 30
Зарегистрирован: Ср май 14, 2014 20:44:56 Сообщений: 96 Откуда: Республика Карелия
Рейтинг сообщения:0
Парни, привет. Может кто подсказать каким простеньким (желательно из тех что есть на Али) программатором можно прочитать и перезаписать память 95640? В наличии имеется ПикКит3 и USBasp 2.0 но они как я понял не умеют читать и шить память да?
Всем привет! Ребята подскажите почему stm8 нагинает stm32? Брал одинаковый кусок кода (переменные 32 бит) ставил оба мк на 8МГц, в итоге в итоге stm8 шуршит быстрее раза в 4. По дизасемблеру смотрел код разница незначительная, но не на столько чтобы в 4 раза медленнее работал recyclebin SPI флешки перепрошивал extrapic-oм. Но я под него софт еще пилил.
Сейчас этот форум просматривают: Google [Bot] и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения