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

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

Сообщение Oxford »

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

GPIOB->CRL |= GPIO_CRL_MODE4_1; // PORTB.4 OUTPUT 2MHz
Кому тут не понятно что? Вы когда настраиваете комментарии пишите, чтобы знать что хотите и сами не забудете. Или тут нужен класс C++? :)))

Запоминать и не надо никому ни начинающим, ни профи есть мануал открываете на нужный микроконтроллер и настраиваете. Достаточно знать что нужно делать и как это работает. Так вы сможете любой микроконтроллер запрограммировать независимо от производителя в кратчайшие сроки.


GPIOB настраивается PORT B
-> доступ к полю по указателю
CRL младший регистр конфигурации
|= устанавливается через добавление (поразрядное ИЛИ)
GPIO_CRL_MODE4_1 настраивается поле MODE для 4 ножки, добавляется 1 бит (счет относительно поля с нуля) //10: Output mode, max speed 2 MHz.
Формат полей в референс мануале указан в бинарном формате.

Лево-присваивающий оператор |= кому не понятен это сокращенная запись этой:

GPIOB->CRL = GPIOB->CRL | GPIO_CRL_MODE4_1;

| это Поразрядное ИЛИ
*(volatile uint64_t *) GPIOA = (
a5021 зачем volatile обьявлять, здесь это не требуется. нда и доступ конечно вырви глаз. плюс идет увеличение выравнивания с 4 до 8 -Wcast-align
Поэтому не надо ничего придумывать.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Реклама
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="Oxford",url="/forum/viewtopic.php?p=3904859#p3904859"]a5021 зачем volatile обьявлять, здесь это не требуется.[/uquote]
Требуется. Любые регистры всегда объявляются волатайл.
нда и доступ конечно вырви глаз.
Доступ? Не знаю, что значит здесь слово "доступ". Одна строка -- один пин. Весь блок инициализации -- одно присвоение. И наглядно и компактно. Через пять лет можно открыть исходник и без малейшего затруднения быстро поменять пины, как надо, если возникнет нужда.
плюс идет увеличение выравнивания с 4 до 8 -Wcast-align
Выравнивание ни при чем. Cortex-M3 не умеет в 64-битные инструкции, т.ч. операции все равно 32-битные.
Поэтому не надо ничего придумывать.
перепишите в вашем стиле, попросим сравнить кому интересно.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

[uquote="a5021",url="/forum/viewtopic.php?p=3904877#p3904877"][uquote="Oxford",url="/forum/viewtopic.php?p=3904859#p3904859"]a5021 зачем volatile обьявлять, здесь это не требуется.[/uquote]
Требуется. Любые регистры всегда объявляются волатайл.[/uquote]

Это ты где прочитал что так делать надо?
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="Oxford",url="/forum/viewtopic.php?p=3904880#p3904880"]Это ты где прочитал что так делать надо?[/uquote]
В CMSIS, вестимо:

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

#define     __IO    volatile             /*!< Defines 'read / write' permissions */
typedef struct
{
  __IO uint32_t CRL;
  __IO uint32_t CRH;
  __IO uint32_t IDR;
  __IO uint32_t ODR;
  __IO uint32_t BSRR;
  __IO uint32_t BRR;
  __IO uint32_t LCKR;
} GPIO_TypeDef;
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

a5021 в данном случае не требуется. К тому же это отключает оптимизацию. Не всегда это нужно у регистров.
Инженер R@D

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

Сообщение VladislavS »

[uquote="Oxford",url="/forum/viewtopic.php?p=3904859#p3904859"]

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

GPIOB->CRL |= GPIO_CRL_MODE4_1; // PORTB.4 OUTPUT 2MHz
Кому тут не понятно что? Вы когда настраиваете комментарии пишите, чтобы знать что хотите и сами не забудете.[/uquote]1. Я не хочу помнить что значит в каждом конкретном чипе из всех что у меня в работе ничегонеговорящее GPIO_CRL_MODE4_1.
2. Я не хочу помнить есть ли там GPIO_CRL_MODE4_0 и GPIO_CRL_MODE4_2 и что значат они. А может там еще и CNF биты есть? Да ну на.
3. Я не хочу помнить начальное состояние GPIOB->CRL. Оно может отличаться от GPIOA->CRL и других. А не помня этого как можно тут |= применить?

[uquote="Oxford",url="/forum/viewtopic.php?p=3904859#p3904859"]Запоминать и не надо никому ни начинающим, ни профи есть мануал открываете на нужный микроконтроллер и настраиваете.[/uquote]Чтобы сконфигурировать на выход один пин лезть в RM?

И у меня для вас плохие новости. :cry: Начальное состояние GPIOB->CRL равно 0x44444444. Ваша инструкция задала не PushPull 2 MHz, а OpenDrain режим. Ошибка в такой примитивной операции, как конфигурация одного пина. ЧТД!!!

[uquote="Oxford",url="/forum/viewtopic.php?p=3904859#p3904859"]Или тут нужен класс C++? :)))[/uquote]А почему нет? Я даже думать не буду что это за контроллер и напишу

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

PB_4::mode<PinMode::PushPull_LowSpeed<>>();
Компилятор всё сделает за меня. На F1 он, в отличии от вас, старательно зачистил ненужные биты

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

LDR.W    R5,??main_0      ;; 0x40010c00
LDR      R0,[R5, #+0]
BIC      R0,R0,#0xF0000
ORR      R0,R0,#0x20000
STR      R0,[R5, #+0]
На mdr1986ve8

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

        LDR.N    R0,??DataTable1  ;; 0x40081010
        MOVS     R1,#+16
        STR      R1,[R0, #+0]
        STR      R1,[R0, #+40]
        STR      R1,[R0, #+68]
        STR      R1,[R0, #+52]
        STR      R1,[R0, #+60]
        MOV      R2,#+512
        MOV      R1,#+256
        STR      R1,[R0, #+72]
        STR      R2,[R0, #+80]
        MOV      R1,#+983040
        STR      R1,[R0, #+24]
И тут точно не будет ошибок, как у вас.

Добавлено after 49 minutes 11 seconds:
[uquote="Oxford",url="/forum/viewtopic.php?p=3904888#p3904888"]a5021 в данном случае не требуется. К тому же это отключает оптимизацию. Не всегда это нужно у регистров.[/uquote]У меня для вас вторая плохая новость за это утро. :cry:

Вот так правильно.Изображение

А вот так фигняс получиласьИзображение
СпойлерIAR, чуть похитрее даже поступил.

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

*(volatile uint64_t *) GPIOA = 0xFFFFFFFF'00000000;
        LDR.W    R5,??main_0      ;; 0x40010800
        MOVS     R0,#+0
        MOV      R1,#-1
        STRD     R0,R1,[R5, #+0]
*(volatile uint64_t *) GPIOA = 0x00000000'FFFFFFFF;
        MOVS     R3,#+0
        STRD     R1,R3,[R5, #+0]
vol.png
(60.82 КБ) 451 скачивание
nvol.png
(53.86 КБ) 448 скачиваний
Добавлено after 10 minutes 41 second:
[uquote="a5021",url="/forum/viewtopic.php?p=3904853#p3904853"]Смотря как записать. Можно, например, так:[/uquote]Боюсь даже представить размер "портянки" для какого-нибудь 240-ногого F7. При том что у него и портов 11, и регистров конфигурации одного порта 7. Да помножить это на 16 пинов. На 16 AF просто забьём :) Кстати, не для всех режимов нужно все регистры порта конфигурировать. Это как-то учтем в портянке?
Последний раз редактировалось VladislavS Вс окт 11, 2020 09:07:27, всего редактировалось 1 раз.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

А в чем фигня то не понял? Как раз таки красивая оптимизация

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

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

Сообщение VladislavS »

[uquote="Oxford",url="/forum/viewtopic.php?p=3904908#p3904908"]А в чем фигня то не понял?[/uquote]Написано два доступа к регистрам. А компилятор взял и выкинул один. Нормально?

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

Сообщение Oxford »

Да это нормально. Оптимизировал и правильно. Не везде отключать оптимизацию надо.
Инженер R@D

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

Сообщение VladislavS »

Вы считаете правильным, что компилятор выкидывает операции записи в регистры периферии? Остаётся только покрутить у виска.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

В данном случае все корректно и оптимизировано. Разрыв шаблонов C++?
Инженер R@D

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

Сообщение Reflector »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3904901#p3904901"]Боюсь даже представить размер "портянки" для какого-нибудь 240-ногого F7.[/uquote]
Так ведь никто кроме тебя не рискнул привести пример инициализации для LTDC, хотя там всего лишь 100 ногий H750 обещающий быть очень популярным. Пять портов, пусть даже 5 регистров по 20 строк на каждый, итого ~500 строк, у меня это 11 экранов текста. И вроде все понятно, но смотришь на строку, а в ней 1/5 инициализации VSYNC или 1/90 от общей инициализации LTDC, остальные 89 частей равномерно размазаны по всем этим страницам :)
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Oxford",url="/forum/viewtopic.php?p=3904919#p3904919"]В данном случае все корректно и оптимизировано. Разрыв шаблонов C++?[/uquote]Нет! Я написал программу, которая последовательно пишет в регистры два разных значения. В первом случае это работает, во втором нет.
Последний раз редактировалось VladislavS Вс окт 11, 2020 09:40:47, всего редактировалось 2 раза.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Ты даже свой код не понимаешь о чем тогда речь.
Инженер R@D

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

Сообщение VladislavS »

Давай ещё раз медленно и на пальцах. Вот этот код дёрнет ногой.

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

GPIOB->BSRR = GPIO_BSRR_BS_4;
GPIOB->BSRR = GPIO_BSRR_BR_4;
    ldr r3, [pc, #52]
    movs r2, #16
    str r2, [r3, #24]
    mov.w r2, #1048576	; 0x100000
    str r2, [r3, #24]
А вот этот нет.

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

*(uint32_t *)&GPIOB->BSRR = GPIO_BSRR_BS_4;
*(uint32_t *)&GPIOB->BSRR = GPIO_BSRR_BR_4;
    ldr r3, [pc, #48]
    mov.w r2, #1048576	; 0x100000
    str r2, [r3, #0]
И это ничем кроме разрядности не отличается от примера выше. Вот и весь сказ.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Ну че программируешь то и делает. Ты же программист
Инженер R@D

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

Сообщение VladislavS »

[uquote="Oxford",url="/forum/viewtopic.php?p=3904928#p3904928"]Ну че программируешь то и делает. Ты же программист[/uquote]Я то программист. А вот автор вот этого не очень :([uquote="Oxford",url="/forum/viewtopic.php?p=3904859#p3904859"]
*(volatile uint64_t *) GPIOA = (
a5021 зачем volatile обьявлять, здесь это не требуется.[/uquote]
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Дык а че там не так :tea: не работает без volatile?
Инженер R@D

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

Сообщение VladislavS »

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

Сообщение Oxford »

Ну ты там чет левые какие то программы показывал, а по тому что я писал не работает без volatile?
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Ответить

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