Я попытаюсь разобрать его, то, что у вас есть, представляет собой набор макросов, манипулирующих битами, переворачивающих / устанавливающих / очищающих один бит в порту, они представляют собой общий вид макросов, а не специфичный для драйвера SPI.
битовая чистка (сброс)
#define _XRS(x,y) PORT(x) &= ~(1<<y)
И порт с каждым битом ожидает бит y
на порту x
.
установлен бит
#define _XS(x,y) PORT(x) |= (1<<y)
ИЛИ порт только с установленным битом y. Это установит бит y
и не затронет остальные.
переключить
#define _XT(x,y) PORT(x) ^= (1<<y)
Бит XOR с 1 изменит свое значение, 0 сохранит свое состояние.
Этот список макросов принимает только один аргумент
#define RESET(x) _XRS(x)
#define SET(x) _XS(x)
#define TOGGLE(x) _XT(x)
#define SET_OUTPUT(x) _XSO(x)
#define SET_INPUT(x) _XSI(x)
#define IS_SET(x) _XR(x)
поэтому эти макросы не выглядят совместимыми с , поскольку они принимают один параметр вместо двух, но с помощью магии макросов можно создать вывод, например, x,y
#define GPIO1_PIN4 1,4
#define POWER_LED GPIO0,PIN2
сделает SET(POWER_LED);
законным назначением.
Макросы #
и ##
#define _port2(x) PORT ## x
Используются для объединения выходных данных макросов для создания новых структур подробнее здесь
Таким образом, использование всех макросов _XT(2,15);
расширится до
PORT2 = PORT2 ^ (1<<15)
Лично я не являюсь поклонником макросов такого типа, так как они ломают принцип работы обычного ванильного C, скрывая назначения внутри макросов, например, этот стиль не может устанавливать несколько битов на один и тот же порт с одной записью. Однако это разрешенный C, и он распространен среди некоторых сред разработки встраиваемых систем.
Вероятно, было бы проще игнорировать указанные выше макросы и просто записывать конфигурацию и данные непосредственно в регистры слово за словом.
person
Simson
schedule
01.10.2019