Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: объясните логику дефайна
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Метценгерштейн
#define GPIO_OSPEEDER_OSPEEDR0 ((uint32_t)0x00000003)
#define GPIO_OSPEEDER_OSPEEDR0_0 ((uint32_t)0x00000001)
#define GPIO_OSPEEDER_OSPEEDR0_1 ((uint32_t)0x00000002)

текст
00: 400 kHz Very low speed
01: 2 MHz Low speed
10: 10 MHz Medium speed
11: 40 MHz High speed on 50 pF (50 MHz output max speed on 30 pF)

и так по всему файлу они дефайнят.
т.е., допустим, я в нулевом пине хочу выставить скорость 2 Мгц.
почему по их логике это режим ...OSPEEDR0_0 ?
Получается, мне надо все время в голове держать, что
_OSPEEDR0 - это bin 11
_OSPEEDR0_0 bin 01
_OSPEEDR0_1 bin 10
?
SSerge
Такие дефайны обычно "для внутренного потребления" делают, а уже с их помощью определяют нормальные, читабельные.

добавлено
В файле stm32f2xx_gpio.h или stm32f4xx_gpio.h есть такие определения, вот они для человека.
Код
typedef enum
{
  GPIO_Speed_2MHz   = 0x00, /*!< Low speed */
  GPIO_Speed_25MHz  = 0x01, /*!< Medium speed */
  GPIO_Speed_50MHz  = 0x02, /*!< Fast speed */
  GPIO_Speed_100MHz = 0x03  /*!< High speed on 30 pF (80 MHz Output max speed on 15 pF) */
}GPIOSpeed_TypeDef;

Метценгерштейн
ну, например, объявите скорость порта как тут
Код
GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR7;
SSerge
По их (авторов StdPerifLib) логике Вы должны завести структуру, заполнить ей нужные поля и позвать функцию, которая сконфигурирует пин.
где-то так:
Код
{
  GPIO_InitTypeDef GPIO_InitStructure;
//...............
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_Pin = COM_TX_PIN[COM];
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(COM_TX_PORT[COM], &GPIO_InitStructure);


А те определения - это их внутреннее дело, Вам туда смотреть не обязательно.
Безобразно, конечно, но хотя бы единообразно.
Метценгерштейн
а если я на др cortex перенесу проект? не STM например.
какой стиль программирования легче будет адаптировать?

И как на скорости сказывается дополнительный вызов ф-ий и прочего при использовании StdPerifLib?
maksimp
Цитата(Метценгерштейн @ Jan 3 2013, 17:53) *
#define GPIO_OSPEEDER_OSPEEDR0 ((uint32_t)0x00000003)
#define GPIO_OSPEEDER_OSPEEDR0_0 ((uint32_t)0x00000001)
#define GPIO_OSPEEDER_OSPEEDR0_1 ((uint32_t)0x00000002)

00: 400 kHz Very low speed
01: 2 MHz Low speed
10: 10 MHz Medium speed
11: 40 MHz High speed on 50 pF (50 MHz output max speed on 30 pF)

Здесь больше всего подходит обычное арифметическое умножение.
Если z - это число 0, 1, 2 или 3, которое характеризует желаемую скорость от 400 кГц до 40 МГц, то в регистр нужно записывать GPIO_OSPEEDER_OSPEEDR0_0 * z .
Нужно умножать всегда константу для бита 0 (то есть у которой имя заканчивается на "_0") на число - значение битового поля.
Цитата(Метценгерштейн @ Jan 3 2013, 20:17) *
а если я на др cortex перенесу проект? не STM например.
какой стиль программирования легче будет адаптировать?

По любому пргорамму сильно переделывать. Например у другого процессора набор этих частот будет другой. Например (чисто например) если 1 МГц, 3 МГц, 15 МГц и 50 МГц? Тогда если у вас было 2 МГц, то на что его заменить - на 1 МГц или на 3 МГц? Всё равно придётся смотреть конкретно вашу задачу в каждом месте.
Цитата(Метценгерштейн @ Jan 3 2013, 20:17) *
И как на скорости сказывается дополнительный вызов ф-ий и прочего при использовании StdPerifLib?

Плохо сказывается на скорости. И ещё плохо сказывается на том, что программу с StdPerifLib трудно сопоставить с даташитом на процессор. В даташите написано, что будет если в определённом регистре выставлены определённые биты. А StdPerifLib этот регистр прячет, какие там биты выставлены - трудно может быть выяснить.
Метценгерштейн
да, я тоже так думаю, что из-за того, что в даташите нет StdPerifLib, могут быть проблемы с пониманием. А то, что проще писать с StdPerifLib, так это каждый раз в нее надо смотреть, как записать тот или иной бит в формате ихнем.

А логика там такая-
два бита на порт- и если надо выставить биты 01
т.е. в нулевой бит записать, то пишем
...MODER |= GPIO_MODER_MODER_0
Marto
Цитата(Метценгерштейн @ Jan 4 2013, 00:55) *
А то, что проще писать с StdPerifLib, так это каждый раз в нее надо смотреть, как записать тот или иной бит в формате ихнем.


Ну как бэ читать документацию StdPeriphLib проше, чем каждый раз лазить в даташит и вручную побитам выставлять режим в голом CMSIS.
Cosmojam
Цитата(Метценгерштейн @ Jan 3 2013, 20:17) *
а если я на др cortex перенесу проект? не STM например.
какой стиль программирования легче будет адаптировать?

И как на скорости сказывается дополнительный вызов ф-ий и прочего при использовании StdPerifLib?

У NXP, например, аналогичным образом сделана настройка периферии. На мой взгляд такой код читается лучше, а следовательно и портируется легче чем напрямую запись в регистры, которые ещё надо смотреть в даташите что означают и какие битики туда надо писать.
А насчёт скорости смотрите сами. Если это делается 1 раз при старте девайса, то уж лишние пару наносекунд инициализации устройтсва не сильно огорчат пользователя. Посмотрте дизассемблер что Ваш компилятор генерируется, посчитайте кол-во тактов и прикиньте подходит это под заданные нужды или нет.
Например, для NXP функцию GPIO_ReadValue из фирменной библиотеки gcc с -O1 компилит менее 20 инструкций (точно не помню сейчас) что на 100МГц для M3 примерно 200нс. Можно точно посчитать и измерить если критчино. Мне не было критично sm.gif
Метценгерштейн
Цитата(SSerge @ Jan 3 2013, 20:57) *
По их (авторов StdPerifLib) логике Вы должны завести структуру, заполнить ей нужные поля и позвать функцию, которая сконфигурирует пин.
где-то так:
Код
{
  GPIO_InitTypeDef GPIO_InitStructure;
//...............
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_Pin = COM_TX_PIN[COM];
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(COM_TX_PORT[COM], &GPIO_InitStructure);


А те определения - это их внутреннее дело, Вам туда смотреть не обязательно.
Безобразно, конечно, но хотя бы единообразно.


один раз создавать объект типа надо? ( GPIO_InitStructure)
т.е. если ножки две мне надо описать? или на каждую ножку свой объект базовой структуры заводить?

а где мне указать в данной структуре, что у меня GPIOB , пин 7, например?
Allregia
Цитата(Метценгерштейн @ Jan 4 2013, 12:05) *
один раз создавать объект типа надо? ( GPIO_InitStructure)


Надо.

Цитата
т.е. если ножки две мне надо описать? или на каждую ножку свой объект базовой структуры заводить?


Если ножки одного типа, т.е. например обе выходы, обе РР, обе 50Мгц, то их мжоно в одной структуре указать и одновременно проинитить.
Если разные, то обьект структуры не надо на каждую ножку отдельный создавать, можно использовать один и тот-же последовательно:
Код
  /* Configure SPI2 pins: SCK, MISO and MOSI */
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

   /* Configure PA.4 as Output push-pull, used as  Chip select */
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOA, &GPIO_InitStructure);


Цитата
а где мне указать в данной структуре, что у меня GPIOB , пин 7, например?


Например так:
Код
#define  MyPinNumber  GPIO_Pin_7
#define  MyPinPort      GPIOB

.....
   GPIO_InitStructure.GPIO_Pin = MyPinNumber;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_Init(MyPinPort, &GPIO_InitStructure);
Метценгерштейн
а что где раскомментирвоать надо или дописать?
Error[Pe413]: no suitable conversion function from "GPIO_InitTypeDef" to "GPIO_InitTypeDef *" exists D:\works\projects\M3_test\main.cpp 58

на строку
GPIO_Init(GPIOB, &GPIO_InitStructure);

разобрался- у меня в библиотеке не было
stm32l1xx_conf.h

а почему ее там не было- надо выяснить, т.к. все вроде целиком выкачивал.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.