Включаем подтяжку на неиспользуемых пинах с помощью макросов (STM8)

Началось все с того, что надоело прописывать вручную такие вещи:


PA_CR1 = (1 << 0) | (1 << 1) |(0 << 2) | (0 << 3) | (0 << 4) | (1 << 5) | (1 << 6) | (1 << 7)
//И так далее для всех портов


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


Работает довольно просто:
  • Если не определен USES_PORT_x, то у всех пинов порта x включается подтяжка.
  • Если определен UNUSED_PIN_Pxy, то у пина y порта x включается подтяжка.
  • Если определен USES_PIN_Pxy, то у пина y порта x отключается подтяжка.
  • Все условия размещены по возрастанию приоритета.
    Т. е. если, например, определены USES_PORT_B и UNUSED_PIN_PB5, то у подтяжка включится у всех пинов порта B, кроме 5-го.

Теперь можно сделать так:


#include<iostm8l152c6.h>

#define USES_PIN_PA2
#define USES_PIN_PA3
#define USES_PIN_PA4

#include "STM8_GPIO_Init.h"
void main() {
INIT_PULLUP
//-------------------------Полезный код--------------------------
};


UPD: Инопланетный код заменил человеческим, спасибо angel5a .
Файлы в топике: STM8_GPIO_Init.zip

Комментарии (9)

RSS свернуть / развернуть
"+" за желание что-то полезное сделать, "-" — за описание… итого «0».
0
#include внутри функции? Я понимаю когда такое применяют в играх на Си (без ООП), когда однообразные действия делаются в нескольких местах. Но тут, думается мне, красивее было бы организовать хедер после дефайнов, и использовать макрос.
0
Да, конструкции в файле… :)
Могу предложить вместо вашего:
#ifndef USES_PORT_A
#define PORTA_bits_0 1
#define PORTA_bits_1 1
#define PORTA_bits_2 1
#define PORTA_bits_3 1
#define PORTA_bits_4 1
#define PORTA_bits_5 1
#define PORTA_bits_6 1
#define PORTA_bits_7 1
#else
#define PORTA_bits_0 1
#define PORTA_bits_1 0
#define PORTA_bits_2 0
#define PORTA_bits_3 0
#define PORTA_bits_4 0
#define PORTA_bits_5 0
#define PORTA_bits_6 0
#define PORTA_bits_7 0
#endif

#ifdef UNUSED_PIN_PA0
#ifdef PORTA_bits_0
#undef PORTA_bits_0
#endif
#define PORTA_bits_0 1
#endif

#ifdef USES_PIN_PA0
#ifdef PORTA_bits_0
#undef PORTA_bits_0
#endif
#define PORTA_bits_0 0
#endif

Использовать нечто менее грандиозное...
/* По одному на порт*/
#ifndef USES_PORT_A
#define PORTA_bits_all 1
#else
#define PORTA_bits_all 0
#endif

/* только для пина PA0 */
#if	defined USES_PIN_PA0
# define PORTA_bits_0 0
#else
# define PORTA_bits_0 1
#endif

/* для каждого пина каждого порта кроме PA0 */
#if	defined USES_PIN_PA1
# define PORTA_bits_1 0
#elif 	defined UNUSED_PIN_PA1
# define PORTA_bits_1 1
#else 	defined USES_PORT_A
# define PORTA_bits_1 PORTA_bits_all
#else

Или мение понятное:
/* только для пина PA0 */
#if	defined USES_PIN_PA0
# define PORTA_bits_0 0
#else
# define PORTA_bits_0 1
#endif

/* для каждого пина каждого порта */
#if	defined USES_PIN_PA1 || (defined USES_PORT_A && !defined UNUSED_PIN_PA1)
# define PORTA_bits_1 0
#else
# define PORTA_bits_1 1
#endif

Потом добавляем
/* для каждого порта (с поправкой на нулевой пин PA0) */
#if ! ( PORTA_bits_0 == 1 && PORTA_bits_1 == 0 && PORTA_bits_2 == 0 && PORTA_bits_3 == 0 && PORTA_bits_4 == 0 && PORTA_bits_5 == 0 && PORTA_bits_6 == 0 && PORTA_bits_7 == 0 )
# define MACRO_LINE_PA	PA_CR1 = ( PORTA_bits_0 << 0 ) | ( PORTA_bits_1 << 1 ) | ( PORTA_bits_2 << 2 ) | ( PORTA_bits_3 << 3 ) | ( PORTA_bits_4 << 4 ) | ( PORTA_bits_5 << 5 ) | ( PORTA_bits_6 << 6 ) | ( PORTA_bits_7 << 7 );
#else
# define MACRO_LINE_PA	/* nothing */;
#endif

/* и наконец финальный макрос */
#define INIT_PULLUP	do {	\
	MACRO_LINE_PA	\
	/* ... */	\
	MACRO_LINE_PF	\
} while(0)

Надеюсь ни где не ошибся
0
Спасибо огромное. Ваш вариант намного компактнее/ А то у меня китайские методы :)

Вот только тут вместо первого #else должно быть #elif
#else   defined USES_PORT_A
# define PORTA_bits_1 PORTA_bits_all
#else


А так вроде все правильно/
0
А, еще в конце #endif
0
Ни в коем случае, там другая ошибка! последний else должен быть endif. копипаст подвел.
/* для каждого пина каждого порта кроме PA0 */
#if     defined USES_PIN_PA1
# define PORTA_bits_1 0
#elif   defined UNUSED_PIN_PA1
# define PORTA_bits_1 1
#else   defined USES_PORT_A
# define PORTA_bits_1 PORTA_bits_all
#endif

Спасибо за поправку. Раза 3 просмотрел, не увидел.
0
Да что со мной сегодня. defined USES_PORT_A
— лишнее
. По этому определению уде вычислено PORTA_bits_all в начале. В макросах портов оно не нужно.
0
Да, бывает такое)
Я недавно случайно наткнулся на это.
Взрывает мозг.
0
Ну, это потому, что шаблоны вообще говоря предназначены не для метапрограммирования, а для обобщенного программирования. Но поскольку нормального метапрограммирования нет, а очень хочется — приходится костылять на том, что есть. Получается страшно, но получается.
В языках с поддержкой метапрограммирования, вроде лиспа, питона или немерле все получается просто и красиво.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.