|
|
  |
объясните логику дефайна |
|
|
|
Jan 3 2013, 16:32
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Такие дефайны обычно "для внутренного потребления" делают, а уже с их помощью определяют нормальные, читабельные. добавленоВ файле 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;
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Jan 3 2013, 16:57
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
По их (авторов 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); А те определения - это их внутреннее дело, Вам туда смотреть не обязательно. Безобразно, конечно, но хотя бы единообразно.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Jan 3 2013, 18:29
|
Местный
  
Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023

|
Цитата(Метценгерштейн @ 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 этот регистр прячет, какие там биты выставлены - трудно может быть выяснить.
Сообщение отредактировал maksimp - Jan 3 2013, 18:35
|
|
|
|
|
Jan 3 2013, 19:00
|

Частый гость
 
Группа: Свой
Сообщений: 103
Регистрация: 17-05-09
Из: Ижевск
Пользователь №: 49 190

|
Цитата(Метценгерштейн @ Jan 4 2013, 00:55)  А то, что проще писать с StdPerifLib, так это каждый раз в нее надо смотреть, как записать тот или иной бит в формате ихнем. Ну как бэ читать документацию StdPeriphLib проше, чем каждый раз лазить в даташит и вручную побитам выставлять режим в голом CMSIS.
--------------------
Шизоидный холерик
|
|
|
|
|
Jan 3 2013, 21:14
|
Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 12-01-11
Из: Калининград (Koenigsberg)
Пользователь №: 62 182

|
Цитата(Метценгерштейн @ Jan 3 2013, 20:17)  а если я на др cortex перенесу проект? не STM например. какой стиль программирования легче будет адаптировать?
И как на скорости сказывается дополнительный вызов ф-ий и прочего при использовании StdPerifLib? У NXP, например, аналогичным образом сделана настройка периферии. На мой взгляд такой код читается лучше, а следовательно и портируется легче чем напрямую запись в регистры, которые ещё надо смотреть в даташите что означают и какие битики туда надо писать. А насчёт скорости смотрите сами. Если это делается 1 раз при старте девайса, то уж лишние пару наносекунд инициализации устройтсва не сильно огорчат пользователя. Посмотрте дизассемблер что Ваш компилятор генерируется, посчитайте кол-во тактов и прикиньте подходит это под заданные нужды или нет. Например, для NXP функцию GPIO_ReadValue из фирменной библиотеки gcc с -O1 компилит менее 20 инструкций (точно не помню сейчас) что на 100МГц для M3 примерно 200нс. Можно точно посчитать и измерить если критчино. Мне не было критично
--------------------
typedef enum { no, yes, maybe } bool; | блог тут
|
|
|
|
|
Jan 4 2013, 10:05
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
Цитата(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, например?
Сообщение отредактировал Метценгерштейн - Jan 4 2013, 10:12
|
|
|
|
|
Jan 4 2013, 16:38
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(Метценгерштейн @ 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);
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|