реклама на сайте
подробности

 
 
> объясните логику дефайна
Метценгерштейн
сообщение Jan 3 2013, 14:53
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



#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
?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 11)
SSerge
сообщение Jan 3 2013, 16:32
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 3 2013, 16:34
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



ну, например, объявите скорость порта как тут
Код
GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR7;
Go to the top of the page
 
+Quote Post
SSerge
сообщение Jan 3 2013, 16:57
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 3 2013, 17:17
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



а если я на др cortex перенесу проект? не STM например.
какой стиль программирования легче будет адаптировать?

И как на скорости сказывается дополнительный вызов ф-ий и прочего при использовании StdPerifLib?
Go to the top of the page
 
+Quote Post
maksimp
сообщение Jan 3 2013, 18:29
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 3 2013, 18:55
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



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

А логика там такая-
два бита на порт- и если надо выставить биты 01
т.е. в нулевой бит записать, то пишем
...MODER |= GPIO_MODER_MODER_0
Go to the top of the page
 
+Quote Post
Marto
сообщение Jan 3 2013, 19:00
Сообщение #8


Частый гость
**

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



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


Ну как бэ читать документацию StdPeriphLib проше, чем каждый раз лазить в даташит и вручную побитам выставлять режим в голом CMSIS.


--------------------
Шизоидный холерик
Go to the top of the page
 
+Quote Post
Cosmojam
сообщение Jan 3 2013, 21:14
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 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нс. Можно точно посчитать и измерить если критчино. Мне не было критично sm.gif


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 4 2013, 10:05
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Allregia
сообщение Jan 4 2013, 16:38
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 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);
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 4 2013, 18:02
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



а что где раскомментирвоать надо или дописать?
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

а почему ее там не было- надо выяснить, т.к. все вроде целиком выкачивал.

Сообщение отредактировал Метценгерштейн - Jan 4 2013, 23:22
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 15:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01454 секунд с 7
ELECTRONIX ©2004-2016