|
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
|
||||||||||||||||||||||||||
Структура GPIO_TypeDef для регистров. STM3225.04.2022, 08:48. Показов 7934. Ответов 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 Вывести состояние сегментных регистров и регистров флагов (ассемблерная вставка) |
|
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,062
|
|
| 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
|
||||||
|
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,062
|
|||||||||
| 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
|
||||||||||||
|
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,062
|
||||||
| 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,875
|
||||||||
| 29.04.2022, 06:33 | ||||||||
![]()
0
|
||||||||
|
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,062
|
|||||||||
| 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,875
|
||||||||
| 29.04.2022, 11:29 | ||||||||
|
int это же массив 4 char ![]() вся память делается байтами, а байт в Си это char вот более правильное описание
1
|
||||||||
|
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
|
|
| 29.04.2022, 11:44 [ТС] | |
|
Ок. Не заметил что вы тип указателя сменили.
Маленький массив получился, ок.
0
|
|
|
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,062
|
|||
| 29.04.2022, 12:00 | |||
|
В зависимости от вашей терминологии, можно считать, что либо и там и там выделены массивы, либо что указатели.
1
|
|||
|
4 / 4 / 1
Регистрация: 24.04.2022
Сообщений: 79
|
||||||||||||
| 29.04.2022, 12:59 [ТС] | ||||||||||||
0
|
||||||||||||
|
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,062
|
|||||||
| 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
|
|
|
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,062
|
||
| 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,875
|
|||
| 30.04.2022, 08:47 | |||
|
0
|
|||
| 30.04.2022, 08:47 | |
|
Сложить содержание регистров R1 и R4 текущего банка регистров и отразить результат на статическом индикаторе Вывод на экран двоичного содержимого двух регистров (ввести значения этих регистров требуется с клавиатуры) Структура таблицы для ввода номенклатуры в БД Аксесс 2003+ структура изделия Конфигурация регистров для использования внешнего clock для таймера
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов.
Логика кажется понятной:
1. Находим ключевые слова.
2. Добавляем их на. . .
|
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302
Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
|
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс
Ссылка на сгенерированную музыкальную композицию:
https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013
Я говорю, что Время- как вода
течет. . .
|
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла:
Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
|
|
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет
Салют, шампанское, овации!
:drink:
|
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр.
Дословно, отклонённая. . .
|
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы
Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
|
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
|