Перейти к содержанию
    

Это глупое свойство, не дающее никакой пользы.

 

Не соглашусь. Если над генерить "жестко" комплементарные сигналы - очень даже... Правда запихнуть такое в либу проблематично (к вопросу об издержках подхода)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Правильно, метод write так и делает:

static void write(bool data) { base()->BSRR = (0x10000 << pin) | (data << pin);    }

Не ради спора... а чтоб расширить кругозор... искать ваши объяления/определения... классы/шаблоны..... поясните, если не сложно... или покажите сырцы GpioB<>

 

пусть b = 0xff;

GpioB<4>::write(b & 0x20); b & 0x20 даёт 0x20. что дальше? write() принимает bool. т.е. при передачи аргумента есть неявное преобразование uint8_t(0x20) в bool (0х01)? да и ещё и передача аргумента... т.е. копя data создается внутри write().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не соглашусь. Если над генерить "жестко" комплементарные сигналы - очень даже... Правда запихнуть такое в либу проблематично (к вопросу об издержках подхода)

Установить одновременно один вывод в 0, другой в 1? На STM32 - легко. Для этого не нужно инвертировать сигнал, посылая одновременно "установить" и "сбросить".

И, да, я тоже помню про приоритет при задании состояния.

 

Если Вы не понимаете назначение чего-то, это не повод называть это глупым.

Прекрасно понимаю, что такое свойство мне [ ] не нужно.

STM согласна со мной, а не с вами. :laughing:

Я и в ПЛИСке так управляю триггерами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

STM согласна со мной, а не с вами. :laughing:
Вы заблуждаетесь, они с вами не согласны. )))

Иногда требуется не просто установить в 1 или в 0, а переключить. Для чего - это отдельная тема. В некоторых процессорах, если не ошибаюсь, есть отдельный регистр для toggle. В стм32 его нет. Плохо. Но st такой функционал добавили в SPL.

 

/**
  * @brief  Toggles the specified GPIO pins..
  * @param  GPIOx: where x can be (A..K) to select the GPIO peripheral for STM32F405xx/407xx and STM32F415xx/417xx devices
  *                      x can be (A..I) to select the GPIO peripheral for STM32F42xxx/43xxx devices.
  *                      x can be (A, B, C, D and H) to select the GPIO peripheral for STM32F401xx devices. 
  * @param  GPIO_Pin: Specifies the pins to be toggled.
  * @retval None
  */
void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

 

Установить одновременно один вывод в 0, другой в 1?

Прекрасно понимаю, что такое свойство мне [ ] не нужно.
похоже вы не понимаете о чем речь идет. при чем тут один вывод и другой одновременно? тут всего один вывод требуется инвертировать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы заблуждаетесь, они с вами не согласны. )))

Иногда требуется не просто установить в 1 или в 0, а переключить. Для чего - это отдельная тема. В некоторых процессорах, если не ошибаюсь, есть отдельный регистр для toggle. В стм32 его нет. Плохо. Но st такой функционал добавили в SPL.

похоже вы не понимаете о чем речь идет. при чем тут один вывод и другой одновременно? тут всего один вывод требуется инвертировать.

Комплементарные сигналы - это всегда пара. А вы о чем?

Если мне нужно в одно время установить и сбросить несколько сигналов (в одном порту), я подготовлю нужное слово заранее и пошлю его в BSRR.

Если мне нужно инвертировать сигнал, я установлю или сброшу его в состояние, противоположное предыдущему. Что в библиотеке и сделано.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У Infineon XMC4700/4800 подобный регистр имеет ещё более замечательное свойство: при одновременной записи единички и в установку бита и в сброс бита, соответствующий бит инвертируется. Атомарно.

Это глупое свойство, не дающее никакой пользы.

Комплементарные сигналы - это всегда пара. А вы о чем?
где тут пара?

 

jcxz говорит, что в Infineon XMC4700/4800 для инверсии вывода, одного вывода, нужно в BSRR регистр записать одновременно SetBit и ResetBit. При этом, вне зависимости от состояния вывода, он инвертируется. Эта операция атомарная и можно из разных потоков, даже из прерываний безопасно это делать. например для вывода РА0 это выглядит так

GPIOA->BSRR = GPIO_BSRR_BS0 | GPIO_BSRR_BR

 

2ViKo а про Комплементарные сигналы - тут я соглашусь, можно без тогла 2 вывода одновременно дёрнуть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрите сообщение, на которое я отвечал.

Я прекрасно понимаю, о чем говорится. Повторить - такое свойство [ ] не нужно.

Toggle - это Т-триггер. Поднимите руку, кто применял микросхемы таких триггеров.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрите сообщение, на которое я отвечал.

я понял... просмотрел, уже отписал. тут я согласен

Повторить - такое свойство [ ] не нужно.
а вот тут не понятно.... вы говорите, что если вам надо переключить бит, вы - установлю или сброшу его в состояние, противоположное предыдущему. Что в библиотеке и сделано. т.е. программно его инвертируете. Но аппаратное атомарное инвертирование - это для вас глупое свойство, не дающее никакой пользы. По мойму сами себе противоречите.

Польза в том, что инвертирование вывода будет за 1 машинный такт, атомарное, вот и всё!

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Заранее подготовлю слово для установки и слово для сброса. Когда нужно, пошлю.

За так(т) ничего не делается.

 

Предпочитаю конкретное поведение, не зависящее от того, в каком состоянии был до того.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...про Комплементарные сигналы - тут я соглашусь, можно без тогла 2 вывода одновременно дёрнуть.

 

Если нужно периодически (и быстро) тоглить комплементарные пины, и для этого надо ОДИН раз установить их состояние, а потом просто, не анализируя текущее состояние, писать в регистр КОНСТАНТУ...

 

Поднимите руку, кто применял микросхемы таких триггеров.

 

А на транзисторах слабо? :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прекрасно понимаю, что такое свойство мне [ ] не нужно.

STM согласна со мной, а не с вами. :laughing:

Так оказывается это Вы в согласии с STM убрали из её периферии кучу полезного упростив её до неприличия, как то:

FIFO в различной периферии, dual- и quad-SPI, передачи "свЯзным списком" из DMA и т.п.

Вот оказывается кто виноват! :biggrin:

 

я понял... просмотрел, уже отписал. тут я согласен

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

Польза в том, что инвертирование вывода будет за 1 машинный такт, атомарное, вот и всё!

Человек не понимает понятие "атомарность". Что поделать.

Для одновременной установки и сброса (а это нужно например для формирования парафазных сигналов, но не только - есть другие применения, где очень сложно без такой опции)

если нет возможности инверсии пина, то ViKo придётся:

1. запретить прерывания;

2. считать слово из порта текущих значений пинов;

3. установить в нём бит;

4. сбросить в нём бит;

5. записать слово в порт текущих значений пинов;

6. разрешить прерывания.

Всего-то 6 операций вместо одной.

ViKo, Вы: а) понятия не имеет об атомарности операций и её необходимости? или б) троллите всех тут?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В вашем коде две проблемы:

1. Проблема с двухэтапной записью в MODER. Выше уже очень хорошо объяснили, что это нехорошо. Потому что ножка переводится в промежуточное состояние, которое может быть нежелательным. И при возникновении прерывания между двумя записями ножка может остаться в этом состоянии достаточно продолжительное время. Этого может быть достаточно, чтобы что-нибудь сжечь. Это реальная мина, потому что на столе может всё работать, а в продакшене может рвануть.

В твоем кода, кстати, то же самое. В MODER и еще двух регистрах режим задается выставлением двух битов, но при использовании bitband они выставляются по отдельности...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если нужно периодически (и быстро) тоглить комплементарные пины, и для этого надо ОДИН раз установить их состояние, а потом просто, не анализируя текущее состояние, писать в регистр КОНСТАНТУ...

Как вариант такого применения (я использовал это на практике):

Реализация передачи для soft-UART через таймер+DMA+GPIO - при наличии возможности инверсии пинов это делается очень легко простой DMA-транзакцией (без использования передачи "свЯзных списков") заранее подготовленного массива по одному адресу, без влияния на соседние пины и всего с одним прерыванием на байт по окончании передачи всего блока.

На МК где нет инверсии пина, это решается более громоздкой передачей "свЯзным списком" в перемежающие адреса регистров установки или сброса.

Либо (если в GPIO МК есть регистр маски пинов) - маскированием (но операция может быть конфликтной с другими подобными).

На STM32 это не решается никак из-за отсутствия инверсии пина и отсутствии передачи "свЯзным списком". Только дёргаться в прерывания на каждый бит, переключая адреса в "double buffer" DMA режиме. :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как вариант такого применения (я использовал это на практике):

Реализация передачи для soft-UART через таймер+DMA+GPIO -

Какой суровый ногодрыг получается... :wacko:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какой суровый ногодрыг получается... :wacko:

Как раз для проца - совсем несуровый - его загрузка почти как с аппаратным UART получается - всего одно прерывание в конце блока. А если не жалко памяти, то можно и tx.FIFO эмулировать :biggrin:

 

PS: Чой-то я ошибся - прогнал напраслину на STM32 :rolleyes:

Сейчас глянул - у него же установка/сброс через один регистр делаются, значит такой soft-UART можно и на нём сделать. Что-то у меня в мыслях было, что это два разных регистра.... :wacko:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...