jcxz 234 28 ноября, 2018 Опубликовано 28 ноября, 2018 · Жалоба 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); ...и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 28 ноября, 2018 Опубликовано 28 ноября, 2018 · Жалоба 2 часа назад, ViKo сказал: Тогда что мешает его использовать как номер везде, где нужно? Используйте. Потом расскажите, что получилось. Он ожидает два параметра, (порт и бит), а вы хотите передавать ему один (описание вывода). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skripach 6 29 ноября, 2018 Опубликовано 29 ноября, 2018 · Жалоба Отмечусь со своим колхозом. 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 29 ноября, 2018 Опубликовано 29 ноября, 2018 · Жалоба 15 часов назад, Сергей Борщ сказал: Используйте. Потом расскажите, что получилось. Он ожидает два параметра, (порт и бит), а вы хотите передавать ему один (описание вывода). Тогда как перeдается в #define PIN_BITNUM_(port, bit) (bit) описание вывода #define PIN B, 9 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 29 ноября, 2018 Опубликовано 29 ноября, 2018 · Жалоба 20 minutes ago, ViKo said: Тогда как перeдается в #define PIN_BITNUM_(port, bit) (bit) описание вывода #define PIN B, 9 Это ж очевидно. Скриптом на Python-е. Теперь все делается через скрипты. Каждый раз при запуске компиляции скрипты формируют нужные хидеры из device tree file (.dts) файлов. Теперь модно для своего железа создавать Device-tree. Не отставайте от моды! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 29 ноября, 2018 Опубликовано 29 ноября, 2018 · Жалоба Я не модный Зато свободный Мне бы в классике разобраться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 29 ноября, 2018 Опубликовано 29 ноября, 2018 · Жалоба 9 minutes ago, AlexandrY said: Скриптом на Python-е. 10 minutes ago, AlexandrY said: Не отставайте от моды! Ну-ну Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 29 ноября, 2018 Опубликовано 29 ноября, 2018 · Жалоба 18 часов назад, Forger сказал: pinIndex = (name % 16); А port как определяете? Не нашел в вашем коде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 29 ноября, 2018 Опубликовано 29 ноября, 2018 · Жалоба 35 minutes ago, ViKo said: Я не модный Мне бы в классике разобраться. А есть ли классика? В нашем деле что не модно, то obsolete У меня, например, определения пинов создаются скриптом прямо из схемы сделанной в Altium. Могу даже дать ссылку на скрипт на основе которого делал свой Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 29 ноября, 2018 Опубликовано 29 ноября, 2018 · Жалоба 9 минут назад, AlexandrY сказал: А есть ли классика? В нашем деле что не модно, то obsolete У меня, например, определения пинов создаются скриптом прямо из схемы сделанной в Altium. Могу даже дать ссылку на скрипт на основе которого делал свой Вы правы, но отвечаете не по теме. Здесь чисто по макросам вопрос. Конкретно, сводится к "запятая в макросе". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 29 ноября, 2018 Опубликовано 29 ноября, 2018 (изменено) · Жалоба 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; } Результат работы программы: Как видно, имя порта и пина задается именно в том формате, который Вы хотите - через запятую. Изменено 29 ноября, 2018 пользователем Arlleex Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 29 ноября, 2018 Опубликовано 29 ноября, 2018 · Жалоба 1 hour ago, ViKo said: Вы правы, но отвечаете не по теме. Здесь чисто по макросам вопрос. Конкретно, сводится к "запятая в макросе". Ничего, новичкам думаю будет полезно знать альтернативные подходы. Не забывайте, что это форум, а не частная консультация. Либо более конкретно сформулируйте вопрос. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 29 ноября, 2018 Опубликовано 29 ноября, 2018 · Жалоба 28 минут назад, AlexandrY сказал: Либо более конкретно сформулируйте вопрос. Так в стартовом сообщении конкретно задал. Сергей Борщ & Co правильно определили вопрос, но мне разобраться нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 29 ноября, 2018 Опубликовано 29 ноября, 2018 · Жалоба 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 ... через препроцессор и его "фишку" - ## Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 29 ноября, 2018 Опубликовано 29 ноября, 2018 · Жалоба В-общем, посмотрел показанное, сделал по Сергею Борщу. Проверять не на чем, а специально - нет времени, будущее покажет, должно работать. Спасибо всем! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться