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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Так у STM32 нет toggle, если бы у бабушки был х.й, она бы была дедушкой.
у инфениона тоже хотелось бы увидеть где эта возможность
И если используется ОС повторяю у нее свои механизмы синхронизации есть и не надо париться над всякими записями атомарными, GPIO не самое сложное. Программируется легко. А вот к примеру SPI расшарить на несколько потоков вот это уже другое дело.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="a5021",url="/forum/viewtopic.php?p=3902309#p3902309"]Ничего не мешает. Точно так же, как ничего не вдохновляет. Слишком невелик эффект.[/uquote]
Для одного пина невелик, а для группы пинов? Из относительно недавнего была тема про семисегментники в которой пытались работать с любыми пинами, в результате все свелось к массиву с адресами портов и номеров пинов который перебирается в цикле... Или была тема про опрос кнопок висящих на любых пинах, там автор докатился до использования вариативных макросов и это определенно не очень помогло. Когда пинов несколько, то количество возможных оптимизаций резко увеличивается и перебрать их на стадии компиляции можно только на C++, в таком случае разница в производительности может отличаться сразу на порядок.
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 56
Зарегистрирован: Вт дек 29, 2015 11:33:49

Сообщение pavell »

Господа, есть вопрос. Перешил stm32discovery в j-link, в keil все отлично работает, но появилась необходимость использования openocd и вот тут никак не могу заставить подключится. Может есть у кого подобный опыт, ткните в настройки.
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Вроде как драйвер другой нужен. Через zidag переключается.
Реклама
Эиком - электронные компоненты и радиодетали
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку

Сообщение Zhuk72 »

[uquote="jcxz",url="/forum/viewtopic.php?p=3902005#p3902005"][uquote="Oxford",url="/forum/viewtopic.php?p=3902003#p3902003"]Нету у фрискале никакого атомарного тоггле.[/uquote]У фрискале - нет, у ST - нет, у Infineon - есть. Я про фрискале вроде и не говорил.... :dont_know:[/uquote]
Слегка пооффтоплю на тему toggle: у PIC18, даже таком старом как 14К50, уже есть команда bit toggle:
BTG рег, бит.
Всё, ухожу 8)
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Zhuk72",url="/forum/viewtopic.php?p=3902514#p3902514"]Слегка пооффтоплю на тему toggle: у PIC18, даже таком старом как 14К50, уже есть команда bit toggle:
BTG рег, бит.[/uquote]
У этой команды точно доступ к регистрам портов есть?
Реклама
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Вот дались вам эти тоглы. На STM8 оно есть [BCPL dst, #pos (pos=0..7)] и порты можно дергать, только толку-то.

[uquote="Reflector",url="/forum/viewtopic.php?p=3902446#p3902446"]Для одного пина невелик, а для группы пинов?[/uquote]
На десяти пинах сэкономили десять байт? Это называется экономия?
Друг Кота
Аватара пользователя
Сообщения: 25492
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="Reflector",url="/forum/viewtopic.php?p=3902561#p3902561"]У этой команды точно доступ к регистрам портов есть?[/uquote] У Микрочипа порты находятся в общем пространстве ОЗУ и все без исключения команды к регистрам портов применимы как к любому адресу ОЗУ.
Тоггл есть в PIC18 и в PIC24/dsPIC33. Эта команда относится к RMW-инструкциям.
Последний раз редактировалось КРАМ Вт окт 06, 2020 14:45:55, всего редактировалось 1 раз.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку

Сообщение Zhuk72 »

Reflector,
СпойлерИзображение
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Контактная информация:
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Сообщение a797945 »

довесом к предыдущей странице
накомпилил кейл, f103, (надергано, т.е. не все одна за другой)
одна str - положить линию, одна str - взвести. Инф. о бите внутри 16 бит самой инструкции,
статичная инф. может "запаковываться" на уровне компиляции.
Спецам здесь ничего нового.
Спойлер#define LCD_WR Pin_15
#define LCD_WR1 GPIOC->BSRR = LCD_WR
#define LCD_WR0 GPIOC->BRR = LCD_WR
GPIOB->BSRR = (0x00FF0000 | x);
LCD_WR0;__NOP();LCD_WR1;__NOP();LCD_WR0;__NOP();LCD_WR1;

4E34 LDR r6,[pc,#208] ; DCW 0x1000,0x4001
2401 MOVS r4,#0x01
03E0 LSLS r0,r4,#15
F445057F ORR r5,r5,#0xFF0000
F8C95000 STR r5,[r9,#0x00]
6170 STR r0,[r6,#0x14]
BF00 NOP
6130 STR r0,[r6,#0x10]
BF00 NOP
6170 STR r0,[r6,#0x14]
BF00 NOP
6130 STR r0,[r6,#0x10]
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Ну само собой компилятор анализирует код.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

a797945, по генерируемому коду всё хорошо. А вот по стилю программирования есть вопросы на подумать. LCD_WR - константа, а LCD_WR1 уже целый кусок кода. Код был бы более читаем, если бы макроопределение константы выглядело константой, а действие как-то в виде функции LCD_WR1(); оформлено.
СпойлерИнтересно, никто не прискачет с криками "непортабельно"? BRR не у всех STM32 есть. :)
Открыл глаза
Аватара пользователя
Сообщения: 56
Зарегистрирован: Вт дек 29, 2015 11:33:49

Сообщение pavell »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3902496#p3902496"]Вроде как драйвер другой нужен. Через zidag переключается.[/uquote]
UPD Все так и оказалось, проблема была с самой утилитой Zadig, скачал новую - все заработало
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Сообщение a797945 »

... в виде функции LCD_WR1()...
а если не хочу чтоб вызывалась - оформить как static inline
правильно понимаю?
ну что ж, правила так правила
хотя с непривычки, в данном случае, кажется избыточным.
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3902914#p3902914"]BRR не у всех STM32 есть.[/uquote]
У каких нет? Мне, кстати, сей регистр всегда казался непонятным.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

BRR просто младшие 16 бит работают как сброс. А у BSRR младшие 16 бит работают на установку, старшие на сброс.

У STM32F405/415, STM32F407/417, STM32F427/437, STM32F446xx, STM32F75xxx and STM32F74xxx например нету BRR. Видать в старших сериях этот регистр убрали.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="a5021",url="/forum/viewtopic.php?p=3902076#p3902076"]Старые семейства (F1, F2) умеют только word access.[/uquote][uquote="a5021",url="/forum/viewtopic.php?p=3903307#p3903307"]Мне, кстати, сей регистр всегда казался непонятным.[/uquote]Как эти две мысли могут существовать в голове одновременно и не пересечься? Сравниваем на F1

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

GPIOA->BSRR = GPIO_BSRR_BS0;
GPIOA->BSRR = GPIO_BSRR_BR0;
        LDR.W    R5,??main_0      ;; 0x40010810
        MOVS     R0,#+1
        STR      R0,[R5, #+0]
        MOV      R1,#+65536
        STR      R1,[R5, #+0]

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

GPIOA->BSRR = GPIO_BSRR_BS0;
GPIOA->BRR = GPIO_BRR_BR0;
        LDR.W    R5,??main_0      ;; 0x40010810
        MOVS     R0,#+1
        STR      R0,[R5, #+0]
        STR      R0,[R5, #+4]
Разница очевидна.

[uquote="Oxford",url="/forum/viewtopic.php?p=3903391#p3903391"]Видать в старших сериях этот регистр убрали.[/uquote]А зачем он нужен, при наличии 16-битного доступа к старшей части BSRR? Сравниваем на F3

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

GPIOA->BSRR = GPIO_BSRR_BS_0;
GPIOA->BRR = GPIO_BRR_BR_0;
        LDR.N    R1,??main_0      ;; 0x48000018
        MOVS     R0,#+1
        STR      R0,[R1, #+0]   
        STR      R0,[R1, #+16]

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

GPIOA->BSRR = GPIO_BSRR_BS_0;
*((volatile uint16_t *)&GPIOA->BSRR+1) = GPIO_BSRR_BR_0>>16;
        LDR.N    R1,??main_0      ;; 0x48000018
        MOVS     R0,#+1
        STR      R0,[R1, #+0]
        STRH     R0,[R1, #+2]
А вот тут, как раз, разницы считай и нет. Только зря потраченные транзисторы.
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3903420#p3903420"]Как эти две мысли могут существовать в голове одновременно и не пересечься?[/uquote]
В вас умер посредственный пеар-менеджер -- вы создаете информационный шум на пустом месте и уверены, что никто не заметит чепушистости повода.
Сравниваем на F1

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

GPIOA->BSRR = GPIO_BSRR_BS0;
GPIOA->BSRR = GPIO_BSRR_BR0;
        LDR.W    R5,??main_0      ;; 0x40010810
        MOVS     R0,#+1
        STR      R0,[R5, #+0]
        MOV      R1,#+65536
        STR      R1,[R5, #+0]

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

GPIOA->BSRR = GPIO_BSRR_BS0;
GPIOA->BRR = GPIO_BRR_BR0;
        LDR.W    R5,??main_0      ;; 0x40010810
        MOVS     R0,#+1
        STR      R0,[R5, #+0]
        STR      R0,[R5, #+4]
Разница очевидна.
Сравниваем с другого ракурса:

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

GPIOA->BSRR = GPIO_BSRR_BS0;
    movs r1, #1
    movs r2, #2
    ldr r3, =0x40010800
    str r1, [r3, #16]
GPIOA->BRR = GPIO_BRR_BR1;
    str r2, [r3, #20]
Вывод -- разницы нет. Вы зря потратили время.
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

А теперь то же без BRR.
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Странно, что позиционируя себя такими сведующим человеком вы теперь не в состоянии представить, что будет без BRR.
Сообщаю вам, что будет то же самое:

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

GPIOA->BSRR = GPIO_BSRR_BS0;
    movs r1, #1
    mov.w r2, #0x020000
    ldr r3, =0x40010800
    str r1, [r3, #16]
GPIOA->BSRR = GPIO_BSRR_BR1;
    str r2, [r3, #16]
И чтобы уж совсем ясно представить, какие там еще мысли не в состоянии пересечься теперь уже в вашей голове, попробуйте проиллюстрировать пользу BRR на вашем же примере:

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

GPIOA->BSRR = (0xFF<<(2+16)) | (x<<2);
Ответить

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