|
|
  |
Библиотеки для STM32 |
|
|
|
Apr 21 2017, 10:17
|
Участник

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

|
Цитата(jcxz @ Apr 21 2017, 13:08)  BSRR = 1 << pin; //установка BSRR = 1 << pin + 16; //сброс BSRR = 0x10001 << pin; //инверсия Допустим нужно записать данные только в младшие 4 бита порта, пусть это будет 3. Тогда пишем в BSRR такое число, которое бы, во-первых, сбросило эти 4 бита(0xF << 16), во вторых выставило только нужные(3), итого получает 0x000F0003. Для двух пинов единица там и там, значит будет инверсия...
Сообщение отредактировал Reflector - Apr 21 2017, 10:19
|
|
|
|
|
Apr 21 2017, 10:23
|

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

|
Цитата(Reflector @ Apr 21 2017, 15:11)  Речь про STM32, у него только BSRR который дает возможность атомарно записать группу битов не затрагивая остальные пины. Если эту его способность заменить атомарной инверсией, то пользы будет меньше. Ни кто не предлагает заменить BSRR на инверсию. Предлагают дополнить BSRR ещё и инверсией. Цитата Тут было много примеров, где использовалась перманентная установка битов сброса и запись данных в биты установки. В таком варианте фактически получаем регистр ODR с маской или атомарный доступ к любой группе битов. Если ввести аппаратный тоггл, то эту полезность потеряем. не понятно - что теряем. Задача - перманентно выставлять РА1 и сбрасывать в одной задаче, и переключать РА5 в другой задаче. Если добавить регистр апаратного тогл, какую полезность теряем?
|
|
|
|
|
Apr 21 2017, 10:24
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(Шаманъ @ Apr 21 2017, 13:18)  .... аппаратный тоггл ... Читаю тему и никак не могу вкурить где может потребоваться именно аппаратный тогл, да и вообще тогл? Мне тоггл понадобился недавно и лишь раз - моргать лампочкой (blink-режим), т. е. случай, где "до лампочки" предыдущее состояние пина. А во всех остальных случаях нужна явная установка битов в нужное состояние, например: софтовые интерфесы, софтовый ШИМ, софтовое управление шаговым мотором и т. п. Просветите, кто сталкивался с нуждой тогла как таковой
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 21 2017, 10:33
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Шаманъ @ Apr 21 2017, 12:16)  Да, если пакет помещается в одну операцию, то возможно, хотя и несколько "притянуто". В этом варианте аппаратный тоггл рулит. Есть и непритянутый пример: Когда-то реализовывал передачу пакетов данных (1-2 КБ) из LPC17xx по 8-битной шине (GPIO) в CY7C68013A (это чип HS USB с подключением по внешней параллельной шине 8/16 бит с протоколом обмена, который можно запрограммировать самостоятельно написав диаграмму работу внутреннему GPIF). Главное требование там было - скорость передачи - надо было выплюнуть пакет как можно быстрее. Частота GPIO у LPC ограничена (как и у других МК), у LPC это было что-то около 10МГц. Соответственно - желательно было так построить схему обмена и протокол, чтобы выполнить передачу с минимальным числом записей в GPIO. CY7C68013A работала у меня на частоте то ли 30МГц то ли 48МГц - точно не помню, но помню, что написал диаграмму GPIF так, что она успевала принимать с LPC даже если он будет писать байт за байтом в порт непрерывно (10МГц). Я поместил сигнал квитирования и 8 линий данных в один порт (на этом порту были также другие сигналы, которые нельзя было трогать при передаче пакета). Как реализовать такую передачу? На STM32 её тоже можно реализовать, но на Infineon (и на LPC) код такой передачи получается проще и быстрее. Цитата(Reflector @ Apr 21 2017, 12:17)  Тогда пишем в BSRR такое число, которое бы, во-первых, сбросило эти 4 бита(0xF << 16), во вторых выставило только нужные(3), итого получает 0x000F0003 Неверно. Писать нужно 0xC0003.
|
|
|
|
|
Apr 21 2017, 10:35
|
Участник

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

|
Цитата(jcxz @ Apr 21 2017, 13:33)  Неверно. Писать нужно 0xC0003. Ок, в порту было 0xF, очищаем 2 бита, становится 3, пишем 3, остается 3. А если пишем 2? Откуда ты знаешь какое число запишешь? Может оно из массива читается или генерится весьма сложным образом.
Сообщение отредактировал Reflector - Apr 21 2017, 10:36
|
|
|
|
|
Apr 21 2017, 10:47
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Reflector @ Apr 21 2017, 12:35)  Откуда ты знаешь какое число запишешь? Может оно из массива читается или генерится весьма сложным образом. Не понял Вашу мысль.... В чём проблема-то? Что именно нельзя сделать? Если не нужно знать предыдущее состояние какого-то пина на порту, но состояние всех остальных можно установить в нужное одной операцией записи. Каким бы сложным ни был генератор. void SetPins(uint value) { BSRR = (value & 255) | (~value << 16); } Цитата(Forger @ Apr 21 2017, 12:24)  Читаю тему и никак не могу вкурить где может потребоваться именно аппаратный тогл, да и вообще тогл? Я же привёл пример: передача по параллельной шине с квитированием инверсией пина.
|
|
|
|
|
Apr 21 2017, 11:07
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(jcxz @ Apr 21 2017, 13:55)  А какое ещё решение? Цитата сейчас может использовал бы МК с HS USB. Я как раз про это - примеры, приведенные тут, как минимум устарели. В настоящее время и такую задачу найти сложно - дергать целиком порты для реализации некого интерфейса. Порой выгоднее воткнуть в довесок к основному толстому процу какой-нить копеешный М0/M0+, чтобы тот занимался подобным ногодрыгом.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|