Страница 605 из 628
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пн сен 09, 2019 15:39:29
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).
Хм-м-м... Тупая документация, на помойку её.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пн сен 09, 2019 16:20:28
VladislavS
Не кипятись. Если ты чего-то не знаешь, то это не значит что этого нет.
Доступ к 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
smalcom
РАЗНОЕ поведение блока SPI
При использовании очереди. Да, не знал такой особенности.
Наверное подсознательно берёгся от этого подблока с такой глупой логикой.
Тем не менее, я бы не использовал один класс для работы с разными подблоками, логичнее использовать наследника, который заточен на работу с очередью.
Хотя вот индусы с тобой согласны
Код: Выделить всё
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
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;
}
На другом дружественном форуме её охарактеризовали как "чудовище". Но когда она компилируется в пару ассемблерных команд чувства совсем другие посещают.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пн сен 09, 2019 18:57:56
smalcom
Минус чтение регистра - это плюс, но выглядит действительно... не чувствуется красоты. Наверное просто придирка.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пн сен 09, 2019 19:40:50
*Trigger*
Спойлер
VladislavS, разве в последней строчке не нужно так написать?
Иначе могут установиться некоторые биты в тех местах, где в маске 0, а в value 1.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пн сен 09, 2019 19:43:32
VladislavS
В общем случае да, но в библиотеке на вход этой функции приходят подготовленные данные, в них нет лишних бит. Подготовка этих данных как раз и есть основная сложность библиотеки, а это уже финальная мелкая оптимизация.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пн сен 09, 2019 19:52:53
*Trigger*
Ну, если за этим внимательно следить, то и так можно, конечно.
А вообще, неужели при оптимизации подобное выражение:
Код: Выделить всё
*reg = (*reg & ~((uint32_t)0x0000FFFF)) | (value & 0x0000FFFF)
достаточно умный компилятор сам не заменит на запись в 16-битный регистр? Что-то я сомневаюсь в полезности такой "ручной" обработки всех 8-ми и 16-ти битных случев...

Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Пн сен 09, 2019 20:16:21
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]
Убрал комментарии, а то за ними на мобильных экранах кода не видно.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вс ноя 03, 2019 13:09:53
Dmitriy70
появилась необходимость прошить флешь 25Q32 телевизора. Есть в наличии программатор, я им atmega тестер транзисторов прошивал

названия на нем нет - подойдёт ли он для моих целей? или надо другой брать?
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт ноя 21, 2019 12:20:37
baron_P
Доброго дня.
Есть у меня привод ELL 12030 на котором периодически сбоит АЦП. В качестве АЦП используется микросхема AD7927, а общается с ней микроконтроллер ADSP2181. Схема их соединения выглядит так:
Спойлер

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

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

В начале каждого импульса (перепад 1-0) появляется какой-то странный всплеск длительностью 100 нс. Как будто дребезг контакта, но там же транзисторы на выходе, а не реле. Вопрос: нормально ли такое поведение? Это какие-то помехи или специально сгенерированный контроллером сигнал?
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт ноя 21, 2019 12:24:23
jcxz
[uquote="baron_P",url="/forum/viewtopic.php?p=3740728#p3740728"]нормально ли такое поведение? Это какие-то помехи или специально сгенерированный контроллером сигнал?[/uquote]Нормально. Эти артефакты вносит ваш щуп. Покрутите подстроечник в своём щупе. А также - землю для SCLK берите как можно ближе к точке, откуда берёте SCLK и подавайте её на металлическое колечко вокруг острия щупа.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт ноя 21, 2019 12:40:37
baron_P
[uquote="jcxz",url="/forum/viewtopic.php?p=3740733#p3740733"]Нормально. Эти артефакты вносит ваш щуп. Покрутите подстроечник в своём щупе. А также - землю для SCLK берите как можно ближе к точке, откуда берёте SCLK и подавайте её на металлическое колечко вокруг острия щупа.[/uquote]
Спасибо за информацию. Увы, у меня не настолько продвинутый щуп - нет на нем ни подстроечника ни колечка вокруг острия)
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Чт ноя 21, 2019 13:54:01
Ivanoff-iv
[uquote="Dmitriy70",url="/forum/viewtopic.php?p=3729878#p3729878"]появилась необходимость прошить флешь 25Q32 телевизора.[/uquote]надо разобраться что за программатор... для USBasp ов и их клонов есть спецпрошивка, позволяющая шить и эти микры (сам так делал)... со стандартной прошивкой и стандартным совтом этот программатор скорее всего не подойдет...
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Сб ноя 23, 2019 13:53:58
Shumadan
В МК новичок, поэтому не пинайте за вопросы.
Нужно реализовать многоразрядный параллельный регистр в одном корпусе. Составлена даже схема на простых логических элементах (где то 300 элементов). Что лучше использовать ПЛИС или МК?
Есть некоторое количество GAL16, GAL20, PIC16F628. Хватит ли их ресурсов?
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Сб ноя 23, 2019 15:35:27
Мурик
Shumadan писал(а):Нужно реализовать многоразрядный параллельный регистр в одном корпусе.
В одной микросхеме?
Тогда PIC16F628 не подойдет. У него выводов мало.
Уточните сколько выводов должно быть у регистра.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Сб ноя 23, 2019 16:11:29
Shumadan
[uquote="Мурик",url="/forum/viewtopic.php?p=3742046#p3742046"]
Shumadan писал(а):Нужно реализовать многоразрядный параллельный регистр в одном корпусе.
В одной микросхеме?
Тогда PIC16F628 не подойдет. У него выводов мало.
Уточните сколько выводов должно быть у регистра.[/uquote]
Вроде должно хватить. Если нет каких то ограничений.
5 входов и 5 выходов, 1 вход тактирующий
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт ноя 26, 2019 19:47:11
Shumadan
так никто не поможет? стою и думаю с чего начать изучение - МК или ПЛИС?
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт дек 03, 2019 00:09:07
recyclebin
Парни, привет. Может кто подсказать каким простеньким (желательно из тех что есть на Али) программатором можно прочитать и перезаписать память 95640? В наличии имеется ПикКит3 и USBasp 2.0 но они как я понял не умеют читать и шить память да?
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Ср дек 18, 2019 19:54:38
Бубоник
Всем привет! Ребята подскажите почему stm8 нагинает stm32? Брал одинаковый кусок кода (переменные 32 бит) ставил оба мк на 8МГц, в итоге в итоге stm8 шуршит быстрее раза в 4. По дизасемблеру смотрел код разница незначительная, но не на столько чтобы в 4 раза медленнее работал
recyclebin SPI флешки перепрошивал extrapic-oм. Но я под него софт еще пилил.