Перейти к содержанию
    

Как дефайнами задать порт и бит?

1 час назад, ViKo сказал:

// Определение бита порта

#define PIN B, 9

// Использование

GPIO_BITN(PIN), GPIO_PORT(PIN)

Так?

Для STM32 так:

определение пинов:
#define PIN_DFLASH_CS     F, 6

определение макросов:

#define PIOIX_A 0
#define PIOIX_B 1
#define PIOIX_C 2
#define PIOIX_D 3
#define PIOIX_E 4
#define PIOIX_F 5
#define PIOIX_G 6
#define PIOIX_H 7
#define PIOIX_I 8
#define PIOIX_J 9
#define PIOIX_K 10

#define concatAB_(a, b) a##b
#define concatABC_(a, b, c) a##b##c
#define concatABCD_(a, b, c, d) a##b##c##d
#define concatABCDE_(a, b, c, d, e) a##b##c##d##e
#define concatABCDEF_(a, b, c, d, e, f) a##b##c##d##e##f
#define concatAB(a, b) concatAB_(a, b)
#define concatABC(a, b, c) concatABC_(a, b, c)
#define concatABCD(a, b, c, d) concatABCD_(a, b, c, d)
#define concatABCDE(a, b, c, d, e) concatABCDE_(a, b, c, d, e)
#define concatABCDEF(a, b, c, d, e, f) concatABCDEF_(a, b, c, d, e, f)

#define Pdat2(port, pin)    (GPIO[concatAB(PIOIX_, port)].IDR & 1u << pin)
#define Pval2(port, pin)    (GPIO[concatAB(PIOIX_, port)].IDR >> pin & 1)
#define Pdato2(port, pin)   (GPIO[concatAB(PIOIX_, port)].ODR & 1u << pin)
#define Pvalo2(port, pin)   (GPIO[concatAB(PIOIX_, port)].ODR >> pin & 1)
#define Pclr2(port, pin)    (GPIO[concatAB(PIOIX_, port)].BRR = 1u << pin)
#define Pset2(port, pin)    (GPIO[concatAB(PIOIX_, port)].BSR = 1u << pin)
#define Ptog2(port, pin)    ((Pdato2(port, pin)) ? Pclr2(port, pin): Pset2(port, pin))
#define PdatM2(port, mask)  (GPIO[concatAB(PIOIX_, port)].IDR & (mask))
#define PdatoM2(port, mask) (GPIO[concatAB(PIOIX_, port)].ODR & (mask))
#define PclrM2(port, mask)  (GPIO[concatAB(PIOIX_, port)].BRR = (mask))
#define PsetM2(port, mask)  (GPIO[concatAB(PIOIX_, port)].BSR = (mask))

#define Pdat(port_pin)     Pdat2(port_pin)
#define Pval(port_pin)     Pval2(port_pin)
#define Pdato(port_pin)    Pdato2(port_pin)
#define Pvalo(port_pin)    Pvalo2(port_pin)
#define Pclr(port_pin)     Pclr2(port_pin)
#define Pset(port_pin)     Pset2(port_pin)
#define Ptog(port_pin)     Ptog2(port_pin)
#define PdatM(port, mask)  PdatM2(port, mask)
#define PdatoM(port, mask) PdatoM2(port, mask)
#define PclrM(port, mask)  PclrM2(port, mask)
#define PsetM(port, mask)  PsetM2(port, mask)


использование:

установка пина GPIO в "1":
Pset(PIN_DFLASH_CS);
установка пина GPIO в "0":
Pclr(PIN_DFLASH_CS);
чтение значения пина GPIO  состоянии input):
int i = Pval(PIN_DFLASH_CS);
чтение значения пина GPIO  состоянии output):
int i = Pvalo(PIN_DFLASH_CS);
...и т.д.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, ViKo сказал:

Тогда что мешает его использовать как номер везде, где нужно?

Используйте. Потом расскажите, что получилось. Он ожидает два параметра, (порт и бит), а вы хотите передавать ему один (описание вывода).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отмечусь со своим колхозом. :buba:


gpio_macro.h:

#ifndef __GPIO_MACRO_H_
#define __GPIO_MACRO_H_

/*******************************************************************************
  port
*******************************************************************************/
// port A
#define A0_PORT                 GPIOA
#define A1_PORT                 GPIOA
#define A2_PORT                 GPIOA
#define A3_PORT                 GPIOA
#define A4_PORT                 GPIOA
#define A5_PORT                 GPIOA
#define A6_PORT                 GPIOA
#define A7_PORT                 GPIOA
#define A8_PORT                 GPIOA
#define A9_PORT                 GPIOA
#define A10_PORT                GPIOA
#define A11_PORT                GPIOA
#define A12_PORT                GPIOA
#define A13_PORT                GPIOA
#define A14_PORT                GPIOA
#define A15_PORT                GPIOA
// port B
#define B0_PORT                 GPIOB
#define B1_PORT                 GPIOB
#define B2_PORT                 GPIOB
#define B3_PORT                 GPIOB
#define B4_PORT                 GPIOB
#define B5_PORT                 GPIOB
#define B6_PORT                 GPIOB
#define B7_PORT                 GPIOB
#define B8_PORT                 GPIOB
#define B9_PORT                 GPIOB
#define B10_PORT                GPIOB
#define B11_PORT                GPIOB
#define B12_PORT                GPIOB
#define B13_PORT                GPIOB
#define B14_PORT                GPIOB
#define B15_PORT                GPIOB
// port C
#define C0_PORT                 GPIOC
#define C1_PORT                 GPIOC
#define C2_PORT                 GPIOC
#define C3_PORT                 GPIOC
#define C4_PORT                 GPIOC
#define C5_PORT                 GPIOC
#define C6_PORT                 GPIOC
#define C7_PORT                 GPIOC
#define C8_PORT                 GPIOC
#define C9_PORT                 GPIOC
#define C10_PORT                GPIOC
#define C11_PORT                GPIOC
#define C12_PORT                GPIOC
#define C13_PORT                GPIOC
#define C14_PORT                GPIOC
#define C15_PORT                GPIOC
// port D
#define D0_PORT                 GPIOD
#define D1_PORT                 GPIOD
#define D2_PORT                 GPIOD
#define D3_PORT                 GPIOD
#define D4_PORT                 GPIOD
#define D5_PORT                 GPIOD
#define D6_PORT                 GPIOD
#define D7_PORT                 GPIOD
#define D8_PORT                 GPIOD
#define D9_PORT                 GPIOD
#define D10_PORT                GPIOD
#define D11_PORT                GPIOD
#define D12_PORT                GPIOD
#define D13_PORT                GPIOD
#define D14_PORT                GPIOD
#define D15_PORT                GPIOD
// port E
#define E0_PORT                 GPIOE
#define E1_PORT                 GPIOE
#define E2_PORT                 GPIOE
#define E3_PORT                 GPIOE
#define E4_PORT                 GPIOE
#define E5_PORT                 GPIOE
#define E6_PORT                 GPIOE
#define E7_PORT                 GPIOE
#define E8_PORT                 GPIOE
#define E9_PORT                 GPIOE
#define E10_PORT                GPIOE
#define E11_PORT                GPIOE
#define E12_PORT                GPIOE
#define E13_PORT                GPIOE
#define E14_PORT                GPIOE
#define E15_PORT                GPIOE

/*******************************************************************************
  pin
*******************************************************************************/
// port A
#define A0_PIN                  GPIO_PIN_0
#define A1_PIN                  GPIO_PIN_1
#define A2_PIN                  GPIO_PIN_2
#define A3_PIN                  GPIO_PIN_3
#define A4_PIN                  GPIO_PIN_4
#define A5_PIN                  GPIO_PIN_5
#define A6_PIN                  GPIO_PIN_6
#define A7_PIN                  GPIO_PIN_7
#define A8_PIN                  GPIO_PIN_8
#define A9_PIN                  GPIO_PIN_9
#define A10_PIN                 GPIO_PIN_10
#define A11_PIN                 GPIO_PIN_11
#define A12_PIN                 GPIO_PIN_12
#define A13_PIN                 GPIO_PIN_13
#define A14_PIN                 GPIO_PIN_14
#define A15_PIN                 GPIO_PIN_15
// port B
#define B0_PIN                  GPIO_PIN_0
#define B1_PIN                  GPIO_PIN_1
#define B2_PIN                  GPIO_PIN_2
#define B3_PIN                  GPIO_PIN_3
#define B4_PIN                  GPIO_PIN_4
#define B5_PIN                  GPIO_PIN_5
#define B6_PIN                  GPIO_PIN_6
#define B7_PIN                  GPIO_PIN_7
#define B8_PIN                  GPIO_PIN_8
#define B9_PIN                  GPIO_PIN_9
#define B10_PIN                 GPIO_PIN_10
#define B11_PIN                 GPIO_PIN_11
#define B12_PIN                 GPIO_PIN_12
#define B13_PIN                 GPIO_PIN_13
#define B14_PIN                 GPIO_PIN_14
#define B15_PIN                 GPIO_PIN_15
// port C
#define C0_PIN                  GPIO_PIN_0
#define C1_PIN                  GPIO_PIN_1
#define C2_PIN                  GPIO_PIN_2
#define C3_PIN                  GPIO_PIN_3
#define C4_PIN                  GPIO_PIN_4
#define C5_PIN                  GPIO_PIN_5
#define C6_PIN                  GPIO_PIN_6
#define C7_PIN                  GPIO_PIN_7
#define C8_PIN                  GPIO_PIN_8
#define C9_PIN                  GPIO_PIN_9
#define C10_PIN                 GPIO_PIN_10
#define C11_PIN                 GPIO_PIN_11
#define C12_PIN                 GPIO_PIN_12
#define C13_PIN                 GPIO_PIN_13
#define C14_PIN                 GPIO_PIN_14
#define C15_PIN                 GPIO_PIN_15
// port D
#define D0_PIN                  GPIO_PIN_0
#define D1_PIN                  GPIO_PIN_1
#define D2_PIN                  GPIO_PIN_2
#define D3_PIN                  GPIO_PIN_3
#define D4_PIN                  GPIO_PIN_4
#define D5_PIN                  GPIO_PIN_5
#define D6_PIN                  GPIO_PIN_6
#define D7_PIN                  GPIO_PIN_7
#define D8_PIN                  GPIO_PIN_8
#define D9_PIN                  GPIO_PIN_9
#define D10_PIN                 GPIO_PIN_10
#define D11_PIN                 GPIO_PIN_11
#define D12_PIN                 GPIO_PIN_12
#define D13_PIN                 GPIO_PIN_13
#define D14_PIN                 GPIO_PIN_14
#define D15_PIN                 GPIO_PIN_15
// port E
#define E0_PIN                  GPIO_PIN_0
#define E1_PIN                  GPIO_PIN_1
#define E2_PIN                  GPIO_PIN_2
#define E3_PIN                  GPIO_PIN_3
#define E4_PIN                  GPIO_PIN_4
#define E5_PIN                  GPIO_PIN_5
#define E6_PIN                  GPIO_PIN_6
#define E7_PIN                  GPIO_PIN_7
#define E8_PIN                  GPIO_PIN_8
#define E9_PIN                  GPIO_PIN_9
#define E10_PIN                 GPIO_PIN_10
#define E11_PIN                 GPIO_PIN_11
#define E12_PIN                 GPIO_PIN_12
#define E13_PIN                 GPIO_PIN_13
#define E14_PIN                 GPIO_PIN_14
#define E15_PIN                 GPIO_PIN_15

#define GPIO_PORT(x)            x##_PORT
#define GPIO_PIN(x)             x##_PIN

#define GPIO_READ_PIN(pin)          HAL_GPIO_ReadPin(GPIO_PORT(pin), GPIO_PIN(pin))
#define GPIO_WRITE_PIN(pin, state)  HAL_GPIO_WritePin(GPIO_PORT(pin), GPIO_PIN(pin), state)
#define GPIO_TOGGLE_PIN(pin)        HAL_GPIO_TogglePin(GPIO_PORT(pin), GPIO_PIN(pin))


#endif //__GPIO_MACRO_H_

main.c:

#define LED_IND_GREEN_PIN       B5

GPIO_WRITE_PIN(LED_IND_GREEN_PIN, GPIO_PIN_SET); 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 часов назад, Сергей Борщ сказал:

Используйте. Потом расскажите, что получилось. Он ожидает два параметра, (порт и бит), а вы хотите передавать ему один (описание вывода).

Тогда как перeдается в 

#define PIN_BITNUM_(port, bit)    (bit) 

описание вывода

#define PIN  B, 9

?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 minutes ago, ViKo said:

Тогда как перeдается в 

#define PIN_BITNUM_(port, bit)    (bit) 

описание вывода

#define PIN  B, 9

Это ж очевидно. Скриптом на Python-е.
Теперь все делается через скрипты.
Каждый раз при запуске компиляции скрипты формируют нужные хидеры из device tree file (.dts) файлов.
Теперь модно для своего железа создавать Device-tree.

Не отставайте от моды!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не модный

Зато свободный

:biggrin:

Мне бы в классике разобраться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, AlexandrY said:

Скриптом на Python-е.

 

10 minutes ago, AlexandrY said:

Не отставайте от моды!

Ну-ну :dirol:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 часов назад, Forger сказал:

pinIndex = (name % 16);

А port как определяете? Не нашел в вашем коде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

35 minutes ago, ViKo said:

Я не модный
Мне бы в классике разобраться.

А есть ли классика? 
В нашем деле что не модно, то obsolete

У меня, например, определения пинов создаются  скриптом прямо из схемы сделанной в Altium. 
Могу даже дать ссылку на скрипт на основе которого делал свой

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 минут назад, AlexandrY сказал:

А есть ли классика? 
В нашем деле что не модно, то obsolete

У меня, например, определения пинов создаются  скриптом прямо из схемы сделанной в Altium. 
Могу даже дать ссылку на скрипт на основе которого делал свой

Вы правы, но отвечаете не по теме. Здесь чисто по макросам вопрос. Конкретно, сводится к "запятая в макросе".

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ViKo, приведу свой пример. Написал так, чтобы было понятно (ИМХО, конечно же).

#include <stdio.h>
#include <conio.h>

// стандартные определения CMSIS (упрощенно)
#define GPIOA       1
#define GPIOB       2

#define GPIO_Pin_7  7
#define GPIO_Pin_12 12



#define HW_WIRE_EXPAND(WIRE_GPIO, WIRE_PIN) GPIO##WIRE_GPIO, GPIO_Pin_##WIRE_PIN
#define HW_WIRE(WIRE_NAME) HW_WIRE_EXPAND(WIRE_NAME)                             // макрос для получения полной строки вида GPIOx, GPIO_Pin_x

#define HW_WIRE_GPIO_EXPAND(WIRE_GPIO, WIRE_PIN) GPIO##WIRE_GPIO
#define HW_WIRE_GPIO(WIRE_NAME) HW_WIRE_GPIO_EXPAND(WIRE_NAME)                   // макрос для извлечения модуля GPIOx

#define HW_WIRE_PIN_EXPAND(WIRE_GPIO, WIRE_PIN) GPIO_Pin_##WIRE_PIN
#define HW_WIRE_PIN(WIRE_NAME) HW_WIRE_PIN_EXPAND(WIRE_NAME)                     // макрос для извлечения номера линии GPIO_Pin_x

// описание межсоединений аппаратного обеспечения
#define HW_WIRE_RELAY_1 A, 7  // управление реле 1
#define HW_WIRE_RELAY_2 B, 12 // управление реле 2



// тестовый пример
void GPIO_SetBit(int GPIO, int Pin)
{
  if(GPIO == 1 && Pin == 7)
    printf("Relay 1 ON\n");
  else if(GPIO == 2 && Pin == 12)
    printf("Relay 2 ON\n");
  
  return;
}

int main(void)
{
  GPIO_SetBit(HW_WIRE(HW_WIRE_RELAY_1));            // включение реле 1
	
  GPIO_SetBit(GPIOB, HW_WIRE_PIN(HW_WIRE_RELAY_2)); // включение реле 2 (использование отедльного макроса)
	
  getchar();
	
  return 0;
}

 

Результат работы программы:

image.png.d42b92f70430dbebeff2213d8074c534.png

 

Как видно, имя порта и пина задается именно в том формате, который Вы хотите - через запятую.

Изменено пользователем Arlleex

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, ViKo said:

Вы правы, но отвечаете не по теме. Здесь чисто по макросам вопрос. Конкретно, сводится к "запятая в макросе".

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

Либо более конкретно сформулируйте вопрос. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

28 минут назад, AlexandrY сказал:

Либо более конкретно сформулируйте вопрос. 

Так в стартовом сообщении конкретно задал. Сергей Борщ & Co правильно определили вопрос, но мне разобраться нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, ViKo said:

А port как определяете? Не нашел в вашем коде.

Вот так:

// stm32f1


stm32f1::AbstractPin::AbstractPin(PinName name)
{

....
	switch (name / 16)
	{
		case (0):
			port = reinterpret_cast<Port>(GPIOA_BASE);
			if (READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN) == 0)
			{ 
				SET_BIT(RCC->APB2RSTR, RCC_APB2RSTR_IOPARST); 
				CLEAR_BIT(RCC->APB2RSTR, RCC_APB2RSTR_IOPARST); 
				SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPAEN);
			}
			break;
....

Хотя есть мысли, как урезать эту самую объемную часть из всего Pin.cpp ... через препроцессор и его "фишку" - ##

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В-общем, посмотрел показанное, сделал по Сергею Борщу. Проверять не на чем, а специально - нет времени, будущее покажет, должно работать. Спасибо всем! 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...