Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.85/34: Рейтинг темы: голосов - 34, средняя оценка - 4.85
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79

Структура GPIO_TypeDef для регистров. STM32

25.04.2022, 08:48. Показов 8061. Ответов 78
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Застрял на регистрах stm32.
Может кто нибудь подскажет?
Вопрос не в самих регистрах, а в языке Си.

Немного об устройстве регистров как я это вижу:
В файле stm32f10x.h находится структура:
C
1
2
3
4
5
6
7
8
9
10
 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
*Я эту структуру у себя не нашёл, так же как и этот файл.

Затем делаются указатели для каждого порта и регистров.
#define GPIOA ((GPIO_TypeDef*)0x48000);
Я думаю затем заполняется где то вся эта структура GPIO_TypeDef, но где я не нашёл.

Затем идёт настройка регистров
C
1
GPIOA->ODR |=1UL<<14;
------------------------------------------------
В принципе то что выше можно не учитывать, я пример упрощу.
У меня не получается заполнить структуру по указателю.
Visual Studio выдаёт ошибку. МК у меня ещё нет, тренируюсь на обычных IDE.

Этот способ является правильным для заполнения структуры?
C
1
2
3
4
5
6
7
8
  struct gpio
 {
int reg;
};
int main(void)
{
    ((struct gpio*)0x45000)->reg=1;
}
Если да, то как вывести, увидеть, проверить значение находящееся по адресу 0x45000? Не используя HEX код?
Так не получается
C
1
printf("%d\n", *((int*)0x45000));
И разве не надо прежде чем присваивать значение указателю, сначала присвоить этому указателю структурную переменную?
C
1
2
3
4
5
6
7
8
9
10
  struct gpio
 {
int reg;
} new_struct;
int main()
{
struct gpio *ptr;
ptr=&new_struct;
ptr->reg=1;
}
То есть разница. Здесь ((struct gpio*)0x45000)->reg=1; напрямую указателю присваивается.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.04.2022, 08:48
Ответы с готовыми решениями:

Структура регистров накоплений
Необходимо написать свою конфигурацию для учёта материалов и товаров Приход материалов регистрируется документом ПриходМатериалов ...

GPIO_TypeDef has no member named BSR
Пытаюсь работать с пинами на прямую. void AY_out (u8 op, u8 reg) { if (reg&amp;1) {GPIOA-&gt;BSRR = GPIO_Pin_11;} else...

Вывести состояние сегментных регистров и регистров флагов (ассемблерная вставка)
Вывести в консоль состояние сегментных регистров и регистров флагов. Добавлено через 9 минут unsigned long num; _asm { pushf...

78
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
02.05.2022, 15:18  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от locm Посмотреть сообщение
Атомарность, а не чтение/модификация/запись.
Да, я об этом тоже читал. В асме этим пользуются. Более быстрый код получается.
https://www.youtube.com/watch?v=olRLcz4QeY4


Здесь начиная от 16 ти бит слово https://istarik.ru/blog/stm32/130.html
У разных МК можно записывать разную длину «слова», например у F103 можно записать «слова» размером 16, 32 и 64 бита.
---------------
То есть Адрес==Байт даже нет в описании.

А для записи 8 битного значения магия какая то нужна.
data16 = ((uint16_t)data[index1] << 8) | data[index0];
index0 = index0 + 2;
index1 = index1 + 2;
И почему то на 2 индекс увеличивать надо, хотя uint8_t это однобайтный массив.
Сравниваем нулевой и первый элементы массива и записываем это по сдвигу влево на 8 бит.
Это конвертация ANSI в 16битное значение что ли?
------------
Чтоб записать 8-ми битное значение (не смотря на то, что производитель не предоставил такой возможности), надо просто записывать по два байта в одно 16-ти битное «слово» со сдвигом. Всё происходит почти так же как и с 16-ти битным числом…

Добавлено через 17 минут
8 битное число в 16 битном располагается через один Байт, это да, но в самом 8 битном массиве байты подряд идут.
Ок, если восьмибитное число сдвинуть на 8 влево, то получим 0.
Так и написали бы там 0, зачем городить. И через 2 индекса зачем прыгать data[index0] в однобайтном массиве.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
02.05.2022, 15:28
getstm32, для новых вопросов создавайте новую тему
Запрещено создавать темы с множеством вопросов во всех разделах, кроме разделов платных услуг. Один вопрос - одна тема.
ассемблер и битбайдинг это не структура
0
 Аватар для COKPOWEHEU
4149 / 2727 / 433
Регистрация: 09.09.2017
Сообщений: 12,084
02.05.2022, 16:27
Цитата Сообщение от locm Посмотреть сообщение
Не нужно модифицировать биты регистров? Ну-ну...
Месье не умеет работать с периферией так, чтобы она не ломалась? В таком случае месье лучше почитать документацию, а не хвастаться тут на форуме, как ловко он окуляром гвозди забивает.
Цитата Сообщение от locm Посмотреть сообщение
И что еще важнее, для чего конкретно bitband в случае прерываний оказывается лучше обычных способов?
Атомарность, а не чтение/модификация/запись.
А, то есть атомарный доступ используется для атомарного доступа. Просто верх конкретики.
Цитата Сообщение от getstm32 Посмотреть сообщение
То есть Адрес==Байт даже нет в описании.
А вас не смущает, что адресация все равно побайтная, даже если работа возможна только по адресам, кратным 4?
Цитата Сообщение от getstm32 Посмотреть сообщение
А для записи 8 битного значения магия какая то нужна.
эта "магия" называется endianness. То, в каком порядке идут байты в многобайтном числе. То есть число 0x12345678 может быть записано как [12|34|56|78] или как [78|56|34|12] в зависимости от железа или его настроек.
1
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
02.05.2022, 18:28  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А вас не смущает, что адресация все равно побайтная, даже если работа возможна только по адресам, кратным 4?
В IDE побайтовая адрессация, а в МК 4 х Байтная?
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
02.05.2022, 19:35
Цитата Сообщение от getstm32 Посмотреть сообщение
В IDE побайтовая адрессация, а в МК 4 х Байтная?
что имеется в виду?
C
1
2
3
4
5
6
7
    uint8_t arr1[10]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
    uint8_t *  ch1=(uint8_t *)&arr1[0];
    uint16_t * ch2=(uint16_t *)&arr1[0];
    uint32_t * ch3=(uint32_t *)&arr1[0];
    ch1++;
    ch2++;
    ch3++;
равны ли адреса ch1,ch2,ch3? и если нет то почему?
0
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
02.05.2022, 20:04  [ТС]
Здесь будут равны
C
1
2
3
4
5
6
7
8
9
10
uint8_t arr1[10]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
        uint8_t *  ch1=(uint8_t *)&arr1[0];
        uint16_t * ch2=(uint16_t *)&arr1[0];
        uint32_t * ch3=(uint32_t *)&arr1[0];
        printf("%p\n", ch1);
        printf("%p\n", ch2);
        printf("%p\n", ch3);
        ch1++;
        ch2++;
        ch3++;
А здесь не равны
C
1
2
3
4
5
6
7
8
9
10
uint8_t arr1[10]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
        uint8_t *  ch1=(uint8_t *)&arr1[0];
        uint16_t * ch2=(uint16_t *)&arr1[0];
        uint32_t * ch3=(uint32_t *)&arr1[0];
        ch1++;
        ch2++;
        ch3++;
        printf("%p\n", ch1);
        printf("%p\n", ch2);
        printf("%p\n", ch3);
Потому что тип у каждого указателя разный. Шагают они по разному.

Но думаю это никак не связано о чём я говорю. Это тонкости языка.
А я имею в виду адрессацию.
В компьютере адрессация побайтовая. Слово==1 Байт.
А в МК я уже не знаю что думать.

Не знаю как в МК заменить функцию printf, тогда сам бы попытался выяснить.
discovery плата пришла сегодня, кажется работает, светодиоды моргают.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
02.05.2022, 20:26
Цитата Сообщение от getstm32 Посмотреть сообщение
Не знаю как в МК заменить функцию printf, тогда сам бы попытался выяснить.
переопределяется для вывода например USART портом или на экран
но по моему тебе это пока рано, есть такая фишка sprintf пишешь в буфер а потом буфер предаешь по тому же USART
но если пытаешься влезть внутрь МК используй отладчик
Цитата Сообщение от getstm32 Посмотреть сообщение
В компьютере адрессация побайтовая. Слово==1 Байт.
А в МК я уже не знаю что думать.
везде побайтовая байт это минимальная единица(ячейка) адресуемой памяти, а вот шаг может быть и разным, что я и показал примером
1
Эксперт по электронике
7199 / 3376 / 346
Регистрация: 28.10.2011
Сообщений: 13,289
Записей в блоге: 7
02.05.2022, 20:56
Цитата Сообщение от getstm32 Посмотреть сообщение
В компьютере адрессация побайтовая. Слово==1 Байт.
У вас комп с 8-ми битным процем?
Цитата Сообщение от getstm32 Посмотреть сообщение
Потому что тип у каждого указателя разный.
Сколько байт занимает адрес?
Какой размер адресного пространства STM32?

Не нужно путать разрядность проца с разрядностью переменных. В 8-ми битных AVR тоже поддерживаются 32-ух битные переменные, но это не значит что проц их поддерживает.
0
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
02.05.2022, 21:24  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
У вас комп с 8-ми битным процем?
64 bit
На компьютере это
C
1
2
3
4
5
6
int main()
{
char a[10];
printf("%p\n", &a[0]);
printf("%p\n", &a[1]);
}
два разных адреса.
Если в МК 4 Байтная адрессация, то это будет одинаковый адрес, я так думаю.
Цитата Сообщение от locm Посмотреть сообщение
Сколько байт занимает адрес?
Указатель занимает 8 Байт printf("%llu\n", sizeof(int*)); Это зачем?
Цитата Сообщение от locm Посмотреть сообщение
Какой размер адресного пространства STM32?
В RM для периферии нашёл для stm32f4:
От 0х4000 0000 до 0хA000 0000
0
Эксперт по электронике
7199 / 3376 / 346
Регистрация: 28.10.2011
Сообщений: 13,289
Записей в блоге: 7
02.05.2022, 21:46
Цитата Сообщение от getstm32 Посмотреть сообщение
Если в МК 4 Байтная адрессация, то это будет одинаковый адрес, я так думаю.
Цитата Сообщение от locm Посмотреть сообщение
Не нужно путать разрядность проца с разрядностью переменных.

Цитата Сообщение от getstm32 Посмотреть сообщение
В RM для периферии нашёл для stm32f4:
От 0х4000 0000 до 0хA000 0000
Вообще, а не только периферия.
Число 0х40000000 можно поместить в один байт?
0
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
02.05.2022, 22:25  [ТС]
4 Байта. Понятно. Поэтому и называется stm32
Цитата Сообщение от locm Посмотреть сообщение
Число 0х40000000 можно поместить в один байт?
Цитата Сообщение от locm Посмотреть сообщение
Не нужно путать разрядность проца с разрядностью переменных.
И сразу же противоречие. Сначала пишете что не надо путать, а потом спрашиваете поместится ли в 1 Байт в переменную.

Добавлено через 12 минут
Я не знаю где найти hex код для МК, который бы показывал однобайтную адрессацию.
STM32CubeProgrammer например показывает 16 битную адрессацию.
Нет доказательств.
Есть нормальный hex редактор в какой нибудь ide?
Такой как в Visual Studio
Или придётся на Visual Studio переходить
0
 Аватар для COKPOWEHEU
4149 / 2727 / 433
Регистрация: 09.09.2017
Сообщений: 12,084
02.05.2022, 22:41
Цитата Сообщение от getstm32 Посмотреть сообщение
В IDE побайтовая адрессация, а в МК 4 х Байтная?
Не знаю что там в вашей IDE, я про контроллер говорю. Адресация почти всегда побайтная. Другое дело что не всегда возможен доступ с произвольного адреса.
Цитата Сообщение от getstm32 Посмотреть сообщение
Потому что тип у каждого указателя разный. Шагают они по разному.
Это уже не важно, это адресная арифметика. Если бы вы писали на ассемблере, вам бы самому пришлось смотреть на сколько сдвигать указатель - на 1, 2, 4 или 8 байт.
Цитата Сообщение от getstm32 Посмотреть сообщение
Не знаю как в МК заменить функцию printf, тогда сам бы попытался выяснить.
Начните со светодиодов и бинарных проверок. Делаете предположение, что адрес переменной равен адресу первой плюс 4. Если это так, зажигаете диод, если нет - то нет. Это самый простой способ отладки, потом, когда разберетесь с UART, будете отлаживать через него.
Цитата Сообщение от getstm32 Посмотреть сообщение
два разных адреса.
Если в МК 4 Байтная адрессация, то это будет одинаковый адрес, я так думаю.
с чего бы? У второго будет адрес первого плюс sizeof(a[0])
Цитата Сообщение от getstm32 Посмотреть сообщение
Я не знаю где найти hex код для МК, который бы показывал однобайтную адрессацию.
Из hex выковыривать адреса замучаетесь, лучше дизассемблируйте бинарник.
arm-none-eabi-objdump main.out -D -S > main.lss
Если вы собирали с ключами отладки (-g), то даже метки и Си-шные функции сохранятся.
Цитата Сообщение от getstm32 Посмотреть сообщение
Есть нормальный hex редактор в какой нибудь ide?
В hex вы ничего не увидите. Дизассемблер нужен.
1
Эксперт по электронике
7199 / 3376 / 346
Регистрация: 28.10.2011
Сообщений: 13,289
Записей в блоге: 7
02.05.2022, 22:45
Цитата Сообщение от getstm32 Посмотреть сообщение
Сначала пишете что не надо путать, а потом спрашиваете поместится ли в 1 Байт в переменную.
Все верно. Количество байт под указатель это не тоже что разрядность переменных.

Цитата Сообщение от getstm32 Посмотреть сообщение
Я не знаю где найти hex код для МК, который бы показывал однобайтную адрессацию.
Напишите.

Цитата Сообщение от getstm32 Посмотреть сообщение
STM32CubeProgrammer например показывает 16 битную адрессацию.
Это всего лишь отображение данных в окне программы. К разрядности МК отношения не имеет. Например ST-LINK Utility отображает 4-ех байтные значения.

Цитата Сообщение от getstm32 Посмотреть сообщение
Нет доказательств.
Может не совсем понимаете что ищите?

Цитата Сообщение от getstm32 Посмотреть сообщение
Есть нормальный hex редактор в какой нибудь ide?
Зачем?
0
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
02.05.2022, 22:48  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Количество байт под указатель это не тоже что разрядность переменных.
https://blog.avislab.com/stm32-flash_ru/
Писать во Flash надо словами по 32 бита.
0
Эксперт по электронике
7199 / 3376 / 346
Регистрация: 28.10.2011
Сообщений: 13,289
Записей в блоге: 7
02.05.2022, 23:24
Цитата Сообщение от getstm32 Посмотреть сообщение
Писать во Flash надо словами по 32 бита.
Это частности и говорит об организации флеша.
Все о чем вы спрашиваете есть в документации.
0
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
02.05.2022, 23:58  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Это частности и говорит об организации флеша.
А с чего вы это решили?
Кстати да. Поэтому я и писал выше что может в IDE однобайтная адрессация, а в МК 4 х Байтная.
1 адрес==4 Байта.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Начните со светодиодов и бинарных проверок. Делаете предположение, что адрес переменной равен адресу первой плюс 4.
В хорошем hex редакторе можно было бы это без мигания сделать.
Но STM32CubeProgrammer почему то не по тем адресам записывает, которые я указываю.
Я хочу сохранить адрес по нужному мне адресу, но не получается.
Чем эти проверки делать с миганием диодов и проверкой адресов, которых не видно.
0
Эксперт по электронике
7199 / 3376 / 346
Регистрация: 28.10.2011
Сообщений: 13,289
Записей в блоге: 7
03.05.2022, 00:25
Цитата Сообщение от getstm32 Посмотреть сообщение
А с чего вы это решили?
Документацию нужно читать.



Цитата Сообщение от getstm32 Посмотреть сообщение
Поэтому я и писал выше что может в IDE однобайтная адрессация, а в МК 4 х Байтная.
1 адрес==4 Байта.
Причем здесь вообще IDE?
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
03.05.2022, 06:23
Цитата Сообщение от getstm32 Посмотреть сообщение
Я хочу сохранить адрес по нужному мне адресу, но не получается.
а в виндосе получается?
0
 Аватар для COKPOWEHEU
4149 / 2727 / 433
Регистрация: 09.09.2017
Сообщений: 12,084
03.05.2022, 06:23
Цитата Сообщение от getstm32 Посмотреть сообщение
Писать во Flash надо словами по 32 бита.
Вы лучше посмотрите как адресация устроена. То есть чтобы записать 4-байтное слово после 0x0800`0100, надо писать в 0x0800`0101 или 0x0800`0104?
Цитата Сообщение от getstm32 Посмотреть сообщение
может в IDE однобайтная адрессация, а в МК 4 х Байтная.
Да плевать что там в IDE, никакого значения это не имеет. В одной одна, в другой другая.
А в МК адресация определяется железом и как была байтовой, так и останется.
Цитата Сообщение от getstm32 Посмотреть сообщение
В хорошем hex редакторе можно было бы это без мигания сделать.
Каким образом? Я еще понимаю в дизассемблере посмотреть адреса. Но в hex мучиться с ручным декодированием... не то чтобы невозможно, но мазохизм редкий.
Цитата Сообщение от getstm32 Посмотреть сообщение
не по тем адресам записывает, которые я указываю.
Покажите где вы записываете по каким-то адресам.
Насколько я помню, сам по себе Си такого не позволяет. Либо пытаться через ассемблерные вставки, либо через секции линковщика.
Цитата Сообщение от getstm32 Посмотреть сообщение
Я хочу сохранить адрес по нужному мне адресу, но не получается.
Чего вы пытаетесь этим добиться?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.05.2022, 06:23

Сложить содержание регистров R1 и R4 текущего банка регистров и отразить результат на статическом индикаторе
Сложить содержание регистров R1 и R4 текущего банка регистров и отразить результат на статическом индикаторе. ORG 0 mov...

Вывод на экран двоичного содержимого двух регистров (ввести значения этих регистров требуется с клавиатуры)
требуется разработать программу вывода на экран двоичного содержимого двух регистров так, чтобы первоначальное содержимое этих регистров...

Структура таблицы для ввода номенклатуры в БД Аксесс 2003+ структура изделия
Доброго времени суток форумчане! Продолжаю писать свою самоделку, возник вопрос: Номенклатуру в БД надо вводить в одно поле (...

Конфигурация регистров для использования внешнего clock для таймера
Добрый день. N-ое количество дней уже не могу правильно сконфигурировать схему с подсчетом импульсов. Имеется мастер таймер, каждую секунду...

структура array предназначена для хранения строки типа char. Структура имеет функцию, которая позволяет изменить символ
структура array предназначена для хранения строки типа char. Структура имеет функцию, которая позволяет изменить символ с указанным...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
79
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru