STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Eddy_Em »

[uquote="Reflector",url="/forum/viewtopic.php?p=3757586#p3757586"]И в ODR будет 0x5555.[/uquote]
Если старшее полуслово не используется, то почему бы и нет? Вполне работоспособная схема. Хоть и теоретически это UB.
Я, кстати, в какой-то железяке так гонял байты при помощи DMA - именно из массива uint8_t. Чтобы обеспечить параллельный интерфейс. Старшее полуслово не использовал, поэтому никаких косяков не было. Понятно, что если бы возникла необходимость использовать ногодрыг на пинах старшего полуслова, пришлось бы уже от uint8_t в массиве переходить на uint32_t и писать не в ODR, а в BSRR.
Последний раз редактировалось Eddy_Em Вт дек 17, 2019 15:45:01, всего редактировалось 1 раз.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

[uquote="Sergi",url="/forum/viewtopic.php?p=3757615#p3757615"]Если закоментировать LCD_WR_H; изображения нет.[/uquote]А откуда ему взяться, если ты в примерно половине случаев WR=1 не делаешь?

[uquote="Sergi",url="/forum/viewtopic.php?p=3757615#p3757615"]Я думал что такой подход кому-то поможет. Применять или нет дело программера.[/uquote]Мы же с Reflector показали, что это НЕ РАБОТАЕТ.

Добавлено after 1 minute 21 second:
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3757625#p3757625"]Если старшее полуслово не используется, то почему бы и нет?[/uquote]Ты вообще читаешь что люди пишут? Используется и влияет!
Реклама
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Eddy_Em »

[uquote="Sergi",url="/forum/viewtopic.php?p=3757610#p3757610"]https://www.youtube.com/watch?v=uv0sqAAMHFA[/uquote]
А что это там за черная фиговина прицеплена к "таблетке"? Холл что ли?

Добавлено after 50 seconds:
[uquote="VladislavS",url="/forum/viewtopic.php?p=3757626#p3757626"]Ты вообще читаешь что люди пишут? Используется и влияет![/uquote]
На кой черт я буду лезть дальше двух-трех последних комментариев? Как будто делать нехрен, только всю ветку читать…
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

И ведь в RM есть прямой запрет так делать, а нет, всё равно советуют...
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Eddy_Em »

VladislavS, а не пофиг ли, что в RM запрещено?
Еще раз: если из порта используется только половина ног, скажем младшее полуслово, то вполне нормально писать при помощи DMA байтики в ODR! Это не приведет к поломке устройства или UB, покуда ноги второго полуслова настроены как аналоговые входы или alternate function.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Реклама
Sergi
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Ср янв 04, 2012 11:57:40
Откуда: Алчевск

Re: STM32 новичку в ARM что к чему

Сообщение Sergi »

Черная - пьезопищалка. Изначально было про 8бит АЦП.
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3757639#p3757639"]Еще раз: если из порта используется только половина ног, скажем младшее полуслово, то вполне нормально писать при помощи DMA байтики в ODR![/uquote]
Sergi писал, что у него на второй половине порта, которая перезаписывается случайным образом, висит WR, энкодер, кнопки и EPROM. По-моему тут и один дисплей не должен нормально работать, разве что на очень низкой скорости, но если очень хочется отлавливать непонятно откуда взявшиеся баги, то почему нет :) И это все ради одной или двух лишних инструкций которые добавятся если в половинку порта писать через BSRR.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Eddy_Em »

Reflector, ну, понятно к чему дело - попытка сэкономить время и объем памяти, т.к. через BSRR пришлось бы городить преобразование 8 бит в 32 (единички - в одну половинку, нулики инвертировать - и в другую). А потом при помощи DMA гнать этот массив.
А насчет АЦП - если работает, ну и хрен с ним! Скажем, в STM8 было важно, в какой последовательности считываются полуслова (кажись, это в АЦП было, хотя точно уж не помню). Здесь же никаких флагов нет. Единственная проблема - невыровненный доступ. Но, к счастью, STM32 - little endian, а читать надо младший байт. Так что, все ОК.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3757639#p3757639"]VladislavS, а не пофиг ли, что в RM запрещено?[/uquote]Да, знаю, а если не будет работать "перепишешь модуль ядра".

Добавлено after 5 minutes 55 seconds:
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3757649#p3757649"]через BSRR пришлось бы городить преобразование 8 бит в 32 (единички - в одну половинку, нулики инвертировать - и в другую).[/uquote]Ууууу, да ты ещё и не знаешь как BSRR работает! Куда я попал...
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Eddy_Em »

VladislavS, в смысле не знаю? Одна половинка регистра устанавливает биты, другая - гасит. Что-то ты гонишь!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

Если установлены и Set, и Reset биты одновременно, то приоритет имеет Set. Соответственно, ничего инвертировать и в другую половинку гнать не надо. Это, кстати, тоже в RM написано. Да кто же его читает...
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение WiseLord »

Это да, в левую половинку можно просто FFFF положить, а не инверсию нулей.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Eddy_Em »

Нельзя туда FFFF положить! Иначе UB будет. Только FF куда нужно.
Да кто же его читает...
Есть такое.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение WiseLord »

Почему вдруг?
Если мне надо в порт положить, например, число 0x5555, можно его просто в ODR записать, либо в BSRR положить 0xFFFF5555.

Или, если надо в младший байт число 0x55 записать, просто в BSRR положить 0x00FF0055. Какие-то дополнительные манипуляции с нулями (0x55 => 0xAA => 00AA0055) не нужны.
Аватара пользователя
Oxford
Опытный кот
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Oxford »

WiseLord если нужно только записать данные использовать надо ODR, если нужно изменить значение порта есть два путя
1. через read IDR/ODR-modify-write ODR
2. Атомарный write BSRR(установка/сброс) регистр. либо просто атомарный BRR(сброс)

BSRR регистр за один вызов изменяет значение порта, это нужно если работает ОС и несколько потоков могут одновременно получить доступ к порту.

BRR только сбрасывает.

если в переменной лежит число 0x55, вам еще подготовить его надо будет. Если не используется несколько потоков, с атомарным доступом не надо морочиться. Программируете стандартно.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Sergi
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Ср янв 04, 2012 11:57:40
Откуда: Алчевск

Re: STM32 новичку в ARM что к чему

Сообщение Sergi »

Проверил скорость вех вариантов.
BSRR победил как всегда :)) .

Код: Выделить всё

void lcd_send_cmd(uint8_t cmd)
{
    LCD_DC_L;
    LCD_WR_L;
 //GPIOB->ODR &=~0xff00;GPIOB->ODR |= (cmd<<8);	//88596 tics
   GPIOB->BSRR = 0xff000000 | (cmd<<8);	                //66660 tics
 //LCD = cmd;		                                                        //72593 tics
    LCD_WR_H;
		LCD_DC_H;
};
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

[uquote="Oxford",url="/forum/viewtopic.php?p=3757982#p3757982"]Если не используется несколько потоков, с атомарным доступом не надо морочиться.[/uquote]Кроме потоков есть ещё и прерывания.

[uquote="Oxford",url="/forum/viewtopic.php?p=3757982#p3757982"]Программируете стандартно.[/uquote]Через BSRR это и есть стандартно, ибо тупо быстрее, чем R-M-W ODR.
Аватара пользователя
Oxford
Опытный кот
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Oxford »

VladislavS есть переменная которая меняется скажем uint8_ t X, как будешь записывать значение в порт через BSRR? Покажи код.

Прерывания другая история, это все равно контроллируемый код и однопоточный.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение Eddy_Em »

[uquote="Oxford",url="/forum/viewtopic.php?p=3758011#p3758011"]VladislavS есть переменная которая меняется скажем uint8_ t X, как будешь записывать значение в порт через BSRR?[/uquote]
Да элементарно: GPIOX->BSRR = 0xff0000 | X
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

[uquote="Oxford",url="/forum/viewtopic.php?p=3758011#p3758011"]VladislavS есть переменная которая меняется скажем uint8_ t X, как будешь записывать значение в порт через BSRR? Покажи код.[/uquote]Ну, в отличии от Эдика, я парень хитрый. К тому же, ты решил поиграть на моём поле. :)
Код то будет простой.

Код: Выделить всё

uint8_t X = GPIOA->IDR;         // Сделаем чтобы X была переменной, а не константой
PinList<GpioB<0xFF00>> bus8bit; // Определим шину на старшие 8 бит GPIOB
bus8bit = X;                    // Запишем в неё данные
А вот во что это скомпилируется, это как раз и интересно. А вариантов тут может быть два.

1. На процессоре STM32F103 без байтового доступа к регистрам
Компилятор выберет вот такой метод и запишет через BSRR

Код: Выделить всё

  template<uint32_t PM=PinsMask>
  static void inline write(uint16_t data)
  {
    if constexpr (PM == 0xFFFF)
      base()->ODR = data;
    else
      base()->BSRR = (PM << 16) | (data & PM);
  }
Листинг

Код: Выделить всё

//uint8_t X = GPIOA->IDR;
        LDR.N    R1,??main_0      ;; 0x40010808
        LDR      R0,[R1, #+0]
//PinList<GpioB<0xFF00>> bus8bit; 
//bus8bit = X;    
        LSLS     R0,R0,#+24
        LSRS     R0,R0,#+16
        ORR      R0,R0,#0xFF000000
        STR      R0,[R1, #+1032]
2. На процессоре STM32F303 c байтовым доступом к регистрам
Компилятор выберет вот такой метод и запишет через ODR

Код: Выделить всё

template<uint32_t PM=PinsMask>
static void inline write(uint16_t data)
{   
  if constexpr (PM == 0xFFFF)
    base()->ODR = data;
  else if constexpr (PM == 0x00FF)
    *(volatile uint8_t*)&base()->ODR = data;
  else if constexpr (PM == 0xFF00)
    *((volatile uint8_t*)&base()->ODR + 1) = data >> 8;
  else
    base()->BSRR = (PM << 16) | (data & PM);
}
Листинг

Код: Выделить всё

//uint8_t X = GPIOA->IDR;
        LDR.N    R0,??main_0      ;; 0x48000010
        LDR      R1,[R0, #+0]
//PinList<GpioB<0xFF00>> bus8bit; 
//bus8bit = X;    
        STRB     R1,[R0, #+1029]
Ну вот как-то так.

[uquote="Oxford",url="/forum/viewtopic.php?p=3758011#p3758011"]Прерывания другая история, это все равно контроллируемый код и однопоточный.[/uquote]Хм. Если в основном цикле я делаю неатомарный доступ R-M-W к порту и из прерывания к этому же порту идёт обращение... То всё!
СпойлерКод можно было и короче написать. Но это неважно, результат тот же.

Код: Выделить всё

uint8_t X = GPIOA->IDR;
PinList<GpioB<0xFF00>>::write(X);
Добавлено after 4 hours 17 minutes 21 second:
Ну куда же вы все разбежались? Я ещё не показал коронный номер, которому меня Reflector научил. :)

Копируем младшие 8 бит порта в старшие 8 бит в обратном порядке: PB0->PB15, PB1->PB14, PB2->PB13, PB3->PB12, PB4->PB11, PB5->PB10, PB6->PB9 и PB7->PB8.

Код: Выделить всё

PinList<PB_7, PB_6, PB_5,  PB_4,  PB_3,  PB_2,  PB_1,  PB_0 > bus_low;
PinList<PB_8, PB_9, PB_10, PB_11, PB_12, PB_13, PB_14, PB_15> bus_high;
bus_high = bus_low;
//Листинг
        LDR.N    R1,??main_0      ;; 0x48000410
        LDRB     R0,[R1, #+0]
        RBIT     R0,R0
        LSRS     R0,R0,#+24
        STRB     R0,[R1, #+5]
Ответить

Вернуться в «ARM»