|
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
|
||||||||||||||||||||||||||
Структура GPIO_TypeDef для регистров. STM3225.04.2022, 08:48. Показов 8032. Ответов 78
Метки нет (Все метки)
Застрял на регистрах stm32.
Может кто нибудь подскажет? Вопрос не в самих регистрах, а в языке Си. Немного об устройстве регистров как я это вижу: В файле stm32f10x.h находится структура:
Затем делаются указатели для каждого порта и регистров. #define GPIOA ((GPIO_TypeDef*)0x48000); Я думаю затем заполняется где то вся эта структура GPIO_TypeDef, но где я не нашёл. Затем идёт настройка регистров
В принципе то что выше можно не учитывать, я пример упрощу. У меня не получается заполнить структуру по указателю. Visual Studio выдаёт ошибку. МК у меня ещё нет, тренируюсь на обычных IDE. Этот способ является правильным для заполнения структуры?
Так не получается
0
|
||||||||||||||||||||||||||
| 25.04.2022, 08:48 | |
|
Ответы с готовыми решениями:
78
Структура регистров накоплений GPIO_TypeDef has no member named BSR Вывести состояние сегментных регистров и регистров флагов (ассемблерная вставка) |
|
4149 / 2727 / 433
Регистрация: 09.09.2017
Сообщений: 12,084
|
|
| 28.04.2022, 13:12 | |
|
0
|
|
|
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
|
||||||
| 28.04.2022, 14:17 [ТС] | ||||||
|
Я не так много видел, но из того что я видел,
define нулевого вывода везде определён как #define GPIO_Pin_0 ((uint16_t)0x0001) итп. Ок, есть может исключения. Кликните здесь для просмотра всего текста
Не вижу настройки каждого пина для Mode,Pull,Speed,Alternate. #define GPIO_MODE_INPUT 0x00000000U Как это приспособить для определённого пина? То есть настройка пинов порта происходит всех сразу, а не поотдельности. Как выбирают из 16 ти пинов нужный, чтоб дать модус нужный? Здесь GPIO_InitStruct.Pin информация сразу о 16 ти пинах передаётся. Как узнать для какого именно пина я хочу сделать это #define GPIO_MODE_INPUT 0x00000000U Здесь #define GPIO_MODE_INPUT 0x00000000U ведь нет информации о порядковом номере пина.
0
|
||||||
|
4149 / 2727 / 433
Регистрация: 09.09.2017
Сообщений: 12,084
|
|||||||||
| 28.04.2022, 15:51 | |||||||||
Два бита можно поменять и руками. Это и для вас проще, и для камня.
1
|
|||||||||
|
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
|
||||||||||||
| 28.04.2022, 16:50 [ТС] | ||||||||||||
|
Но у меня в хеадере сгенерированы уже эти структуры: Кликните здесь для просмотра всего текста
То что вы написали, GPIOA например, тоже ведь на структуре основано, почему чушь. Эти структуры использует HAL постоянно. Или это про другое Кликните здесь для просмотра всего текста
В эту структуру сохраняется временная информация о пинах порта GPIO_InitTypeDef. А из этой структуры передаётся информация в регистры порта через функцию HAL_GPIO_Init. То что сдвигами можно значение менять, это понятно, но когда имеешь 16 единичек одновременно, то непонятно какому именно выводу менять модус надо.И в одной переменной Alternate не может сохраниться одновременно 10 и 111 для двух разных пинов. Ок, мне наверное надо больше почитать.
0
|
||||||||||||
|
4149 / 2727 / 433
Регистрация: 09.09.2017
Сообщений: 12,084
|
||||||
| 28.04.2022, 21:08 | ||||||
|
В HAL же идет вызов каких-то мутных функций, которым передаются не менее мутные параметры, чтобы после пяти уровней вложенности получить тот же эффект, но с кучей ненужных проверок и накладных расходов. На Хабре есть статья по сравнению нормальной реализации USB и HAL'овской. Разница раза в полтора сами понимаете в чью пользу. Так что чушь это про вызов ненужных функций, которые переведут структуру настроек в биты регистров, а не про использование структур вообще. GPIOA->AFR = (GPIOA->AFRL &~(0b1111<<(5*4) | 0b1111<<(7*4))) | (0b0011<<(5*4) | (0b1100<<7*4);Просто обычно выводы настраиваются по одному, так человеку проще отслеживать. А на этапе инициализации неэффективность кода далеко не так критична.
1
|
||||||
|
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
|
|||
| 29.04.2022, 05:02 [ТС] | |||
|
Мне надо теорией запастись))
В эту структуру сохраняется временная информация о пинах порта GPIO_InitTypeDef. А из этой структуры GPIO_TypeDef передаётся информация в регистры порта через функцию HAL_GPIO_Init. char *screenPtr = (char*)(0xA0000000); screenPtr == указатель на одну переменную типа char, за её границы выходить нельзя screenPtr[1]. Как сделать указатель на массив по адресу я не нашёл. Должно быть наверное что то такого: char *screenPtr = (char[10]*)(0xA0000000); неправильный пример А может и правда нет специальной конструкции для массивов. Тогда непонятно как следить вышел ли я за границы или нет. Может здесь и не надо следить, просто надо быть уверенным что записываешь в ту область памяти где ничего другого нет И НЕ БУДЕТ.
0
|
|||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
|
||||||||
| 29.04.2022, 06:33 | ||||||||
![]()
0
|
||||||||
|
4149 / 2727 / 433
Регистрация: 09.09.2017
Сообщений: 12,084
|
|||||||||
| 29.04.2022, 10:20 | |||||||||
|
С другой стороны, если вы по определенному адресу накладываете структуру и точно знаете, что она туда накладывается правильно, чего вам опасаться? За пределы структуры просто так тоже не выйдете. Или тот же экранный буфер. Вам так и так проверять координаты выводимого пикселя по X,Y чтобы не пытаться рисовать точку, скажем, (10500, 2), она все равно за пределами экрана 320x200, но (10500 + 2*320 = 11140) в массив попадает.
0
|
|||||||||
|
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
|
||||
| 29.04.2022, 11:05 [ТС] | ||||
|
char *screenPtr = (char*)(0xA0000000); А здесь этих границ вообще не предусмотрено, на усмотрение программиста. char *screenPtr = (char*)(0xA0000000); Здесь этих границ нет. Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted. Это тоже повреждение данных за пределами переменной. Выделили память для одной переменной и вышли за её пределы. Ок, это инструмент, которым можно пользоваться в МК, я понял. Хороший инструмент.
0
|
||||
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
|
||||||||
| 29.04.2022, 11:29 | ||||||||
|
int это же массив 4 char ![]() вся память делается байтами, а байт в Си это char вот более правильное описание
1
|
||||||||
|
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
|
|
| 29.04.2022, 11:44 [ТС] | |
|
Ок. Не заметил что вы тип указателя сменили.
Маленький массив получился, ок.
0
|
|
|
4149 / 2727 / 433
Регистрация: 09.09.2017
Сообщений: 12,084
|
|||
| 29.04.2022, 12:00 | |||
|
В зависимости от вашей терминологии, можно считать, что либо и там и там выделены массивы, либо что указатели.
1
|
|||
|
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
|
||||||||||||
| 29.04.2022, 12:59 [ТС] | ||||||||||||
0
|
||||||||||||
|
4149 / 2727 / 433
Регистрация: 09.09.2017
Сообщений: 12,084
|
|||||||
| 29.04.2022, 13:36 | |||||||
0
|
|||||||
|
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
|
|
| 29.04.2022, 13:54 [ТС] | |
|
Каждый из портов МК занимает 1 Килобайт.
Куда так много памяти тратится? Один регистр ==32 бит==4 Байт. 1024/4=256 Получается можно хранить 256 регистров в одном Килобайте. Не думаю что столько регистров есть. Не знаю сколько их всего, но часто используемых я насчитал 9 штук. Про запас остальные Байты?
0
|
|
|
4149 / 2727 / 433
Регистрация: 09.09.2017
Сообщений: 12,084
|
||
| 29.04.2022, 14:45 | ||
|
1
|
||
|
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
|
|
| 30.04.2022, 04:29 [ТС] | |
|
Это странно, потому что написано 1 Килобайт.
Если речь бы шла о адресах, то указывалось бы в шестнадцатеричном виде 0х400 Я же не покупаю жёсткий диск на 1 террабайт, а мне говорят: знаете, у нас там не всё заполнено, поэтому диск реально на 1 килобайт. Слева указан диапазон адресов, правее объём памяти. Нигде не могу найти Memory Map для регистров, есть только разбросанные начальные адреса регистров(Address offset). Address offset - то есть смещение относительно начального адреса порта. Минимум информации о регистрах. Но регистр ведь состоит из 4 х Байт, а начальный адрес регистра это наверное первый Байт регистра. Ок, вы говорите что между регистрами есть большие пустоты, для этого я и ищу Memory Map для регистров чтоб узнать какие адреса реально заполнены и имеют адреса, а какие адреса пустые.
0
|
|
|
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
|
|
| 30.04.2022, 07:03 [ТС] | |
|
В некоторых datasheet есть register map, но тоже без адресов, только смещение.
Судя по этим смещениям каждый регистр занимает 4 Байта и все они идут по порядку. Где там промежутки то.
0
|
|
|
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
|
|
| 30.04.2022, 07:11 [ТС] | |
|
Moder ==Смещение 0 (Занимает 4 Байта)
Otyper ==Смещение 4 (Перед этим регистром были 4 Байта регистра Moder, значит смещение 4) Ospeedr ==Смещение 8(Перед этим регистром были 4 Байта регистра Moder+4 Байта регистра Otyper, значит смещение 8) Pupdr==Смещение 12 (Перед этим регистром были 4 Байта регистра Moder+4 Байта регистра Otyper+4 Байта регистра Ospeedr, значит смещение 12)
0
|
|
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
|
|||
| 30.04.2022, 08:47 | |||
|
0
|
|||
| 30.04.2022, 08:47 | |
|
Сложить содержание регистров R1 и R4 текущего банка регистров и отразить результат на статическом индикаторе Вывод на экран двоичного содержимого двух регистров (ввести значения этих регистров требуется с клавиатуры) Структура таблицы для ввода номенклатуры в БД Аксесс 2003+ структура изделия Конфигурация регистров для использования внешнего clock для таймера
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Скрипты 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
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|