|
|
  |
Библиотеки для STM32 |
|
|
|
Apr 21 2017, 02:52
|
Местный
  
Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188

|
Цитата(ViKo @ Apr 20 2017, 20:48)  Это глупое свойство, не дающее никакой пользы. Не соглашусь. Если над генерить "жестко" комплементарные сигналы - очень даже... Правда запихнуть такое в либу проблематично (к вопросу об издержках подхода)
|
|
|
|
|
Apr 21 2017, 03:04
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата(Reflector @ Apr 20 2017, 19:21)  Правильно, метод 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().
|
|
|
|
|
Apr 21 2017, 05:00
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(Axel @ Apr 21 2017, 05:52)  Не соглашусь. Если над генерить "жестко" комплементарные сигналы - очень даже... Правда запихнуть такое в либу проблематично (к вопросу об издержках подхода) Установить одновременно один вывод в 0, другой в 1? На STM32 - легко. Для этого не нужно инвертировать сигнал, посылая одновременно "установить" и "сбросить". И, да, я тоже помню про приоритет при задании состояния. Цитата(jcxz @ Apr 21 2017, 00:52)  Если Вы не понимаете назначение чего-то, это не повод называть это глупым. Прекрасно понимаю, что такое свойство мне [ ] не нужно. STM согласна со мной, а не с вами.  Я и в ПЛИСке так управляю триггерами.
|
|
|
|
|
Apr 21 2017, 05:33
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата(ViKo @ Apr 21 2017, 10:00)  STM согласна со мной, а не с вами.  Вы заблуждаетесь, они с вами не согласны. ))) Иногда требуется не просто установить в 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? Цитата Прекрасно понимаю, что такое свойство мне [ ] не нужно. похоже вы не понимаете о чем речь идет. при чем тут один вывод и другой одновременно? тут всего один вывод требуется инвертировать.
|
|
|
|
|
Apr 21 2017, 05:56
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата(ViKo @ Apr 20 2017, 22:48)  Цитата У Infineon XMC4700/4800 подобный регистр имеет ещё более замечательное свойство: при одновременной записи единички и в установку бита и в сброс бита, соответствующий бит инвертируется. Атомарно. Это глупое свойство, не дающее никакой пользы. Цитата Комплементарные сигналы - это всегда пара. А вы о чем? где тут пара? jcxz говорит, что в Infineon XMC4700/4800 для инверсии вывода, одного вывода, нужно в BSRR регистр записать одновременно SetBit и ResetBit. При этом, вне зависимости от состояния вывода, он инвертируется. Эта операция атомарная и можно из разных потоков, даже из прерываний безопасно это делать. например для вывода РА0 это выглядит так GPIOA->BSRR = GPIO_BSRR_B S0 | GPIO_BSRR_B R2 ViKo а про Комплементарные сигналы - тут я соглашусь, можно без тогла 2 вывода одновременно дёрнуть.
|
|
|
|
|
Apr 21 2017, 06:24
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата(ViKo @ Apr 21 2017, 11:00)  Посмотрите сообщение, на которое я отвечал. я понял... просмотрел, уже отписал. тут я согласен Цитата Повторить - такое свойство [ ] не нужно. а вот тут не понятно.... вы говорите, что если вам надо переключить бит, вы - установлю или сброшу его в состояние, противоположное предыдущему. Что в библиотеке и сделано. т.е. программно его инвертируете. Но аппаратное атомарное инвертирование - это для вас глупое свойство, не дающее никакой пользы. По мойму сами себе противоречите. Польза в том, что инвертирование вывода будет за 1 машинный такт, атомарное, вот и всё!
|
|
|
|
|
Apr 21 2017, 06:57
|
Местный
  
Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188

|
Цитата(juvf @ Apr 21 2017, 08:56)  ...про Комплементарные сигналы - тут я соглашусь, можно без тогла 2 вывода одновременно дёрнуть. Если нужно периодически (и быстро) тоглить комплементарные пины, и для этого надо ОДИН раз установить их состояние, а потом просто, не анализируя текущее состояние, писать в регистр КОНСТАНТУ... Цитата Поднимите руку, кто применял микросхемы таких триггеров. А на транзисторах слабо?
|
|
|
|
|
Apr 21 2017, 07:06
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(ViKo @ Apr 21 2017, 07:00)  Прекрасно понимаю, что такое свойство мне [ ] не нужно. STM согласна со мной, а не с вами.  Так оказывается это Вы в согласии с STM убрали из её периферии кучу полезного упростив её до неприличия, как то: FIFO в различной периферии, dual- и quad-SPI, передачи "свЯзным списком" из DMA и т.п. Вот оказывается кто виноват!  Цитата(juvf @ Apr 21 2017, 08:24)  я понял... просмотрел, уже отписал. тут я согласен а вот тут не понятно.... вы говорите, что если вам надо переключить бит, вы - установлю или сброшу его в состояние, противоположное предыдущему. Что в библиотеке и сделано. т.е. программно его инвертируете. Но аппаратное атомарное инвертирование - это для вас глупое свойство, не дающее никакой пользы. По мойму сами себе противоречите. Польза в том, что инвертирование вывода будет за 1 машинный такт, атомарное, вот и всё! Человек не понимает понятие "атомарность". Что поделать. Для одновременной установки и сброса (а это нужно например для формирования парафазных сигналов, но не только - есть другие применения, где очень сложно без такой опции) если нет возможности инверсии пина, то ViKo придётся: 1. запретить прерывания; 2. считать слово из порта текущих значений пинов; 3. установить в нём бит; 4. сбросить в нём бит; 5. записать слово в порт текущих значений пинов; 6. разрешить прерывания. Всего-то 6 операций вместо одной. ViKo, Вы: а) понятия не имеет об атомарности операций и её необходимости? или б) троллите всех тут?
|
|
|
|
|
Apr 21 2017, 07:11
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 15-07-06
Пользователь №: 18 836

|
Цитата(AHTOXA @ Apr 20 2017, 10:42)  В вашем коде две проблемы: 1. Проблема с двухэтапной записью в MODER. Выше уже очень хорошо объяснили, что это нехорошо. Потому что ножка переводится в промежуточное состояние, которое может быть нежелательным. И при возникновении прерывания между двумя записями ножка может остаться в этом состоянии достаточно продолжительное время. Этого может быть достаточно, чтобы что-нибудь сжечь. Это реальная мина, потому что на столе может всё работать, а в продакшене может рвануть. В твоем кода, кстати, то же самое. В MODER и еще двух регистрах режим задается выставлением двух битов, но при использовании bitband они выставляются по отдельности...
|
|
|
|
|
Apr 21 2017, 07:16
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Axel @ Apr 21 2017, 08:57)  Если нужно периодически (и быстро) тоглить комплементарные пины, и для этого надо ОДИН раз установить их состояние, а потом просто, не анализируя текущее состояние, писать в регистр КОНСТАНТУ... Как вариант такого применения (я использовал это на практике): Реализация передачи для soft-UART через таймер+DMA+GPIO - при наличии возможности инверсии пинов это делается очень легко простой DMA-транзакцией (без использования передачи "свЯзных списков") заранее подготовленного массива по одному адресу, без влияния на соседние пины и всего с одним прерыванием на байт по окончании передачи всего блока. На МК где нет инверсии пина, это решается более громоздкой передачей "свЯзным списком" в перемежающие адреса регистров установки или сброса. Либо (если в GPIO МК есть регистр маски пинов) - маскированием (но операция может быть конфликтной с другими подобными). На STM32 это не решается никак из-за отсутствия инверсии пина и отсутствии передачи "свЯзным списком". Только дёргаться в прерывания на каждый бит, переключая адреса в "double buffer" DMA режиме.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|