Молодой коллега (24.12.2016 01:39 - 28.12.2016 19:31, просмотров: 10046)
Помогите пожалуйста макрос написать. На этапе компиляции всё известно и вроде нет преград для существования макроса. Вот так вот устанавливается вывод порта в "1" в tms320:
GpioDataRegs.GPASET.bit.GPIO8 = 1;
GpioDataRegs.GPBSET.bit.GPIO40 = 1;
Я хочу писать так:
#define RED_LED 8
GPIO_SET(RED_LED);
Если GPIO0 - GPIO31, то это GPASET, если GPIO32 - GPIO63, то это GPBSET. Т.е. нужно меняить номер GPIO, это я вроде сделал, а вот как менять A и B в зависимости от номера GPIO?
#define GLUE( x, y ) x ## y
#define GPIO_SET(x) GpioDataRegs.GPASET.bit.GLUE(GPIO, x) = 1;
________________________________________________________________________________________________________________
В итоге:
#define GLUE( x, y ) x ## y
#define GLUEE( x, y, z ) x ## y ## z
#define GLUEEE( x, y, z, a ) x ## y ## z ## a
// Port letter
#define GPIO0_PORT A
#define GPIO1_PORT A
#define GPIO2_PORT A
#define GPIO3_PORT A
#define GPIO4_PORT A
#define GPIO5_PORT A
#define GPIO6_PORT A
#define GPIO7_PORT A
#define GPIO8_PORT A
#define GPIO9_PORT A
#define GPIO10_PORT A
#define GPIO11_PORT A
#define GPIO12_PORT A
#define GPIO13_PORT A
#define GPIO14_PORT A
#define GPIO15_PORT A
#define GPIO16_PORT A
#define GPIO17_PORT A
#define GPIO18_PORT A
#define GPIO19_PORT A
#define GPIO20_PORT A
#define GPIO21_PORT A
#define GPIO22_PORT A
#define GPIO23_PORT A
#define GPIO24_PORT A
#define GPIO25_PORT A
#define GPIO26_PORT A
#define GPIO27_PORT A
#define GPIO28_PORT A
#define GPIO29_PORT A
#define GPIO30_PORT A
#define GPIO31_PORT A
#define GPIO32_PORT B
#define GPIO33_PORT B
#define GPIO34_PORT B
#define GPIO35_PORT B
#define GPIO36_PORT B
#define GPIO37_PORT B
#define GPIO38_PORT B
#define GPIO39_PORT B
#define GPIO40_PORT B
#define GPIO41_PORT B
#define GPIO42_PORT B
#define GPIO43_PORT B
#define GPIO44_PORT B
// Port mux
#define GPIO0_MUX 1
#define GPIO1_MUX 1
#define GPIO2_MUX 1
#define GPIO3_MUX 1
#define GPIO4_MUX 1
#define GPIO5_MUX 1
#define GPIO6_MUX 1
#define GPIO7_MUX 1
#define GPIO8_MUX 1
#define GPIO9_MUX 1
#define GPIO10_MUX 1
#define GPIO11_MUX 1
#define GPIO12_MUX 1
#define GPIO13_MUX 1
#define GPIO14_MUX 1
#define GPIO15_MUX 1
#define GPIO16_MUX 2
#define GPIO17_MUX 2
#define GPIO18_MUX 2
#define GPIO19_MUX 2
#define GPIO20_MUX 2
#define GPIO21_MUX 2
#define GPIO22_MUX 2
#define GPIO23_MUX 2
#define GPIO24_MUX 2
#define GPIO25_MUX 2
#define GPIO26_MUX 2
#define GPIO27_MUX 2
#define GPIO28_MUX 2
#define GPIO29_MUX 2
#define GPIO30_MUX 2
#define GPIO31_MUX 2
#define GPIO32_MUX 1
#define GPIO33_MUX 1
#define GPIO34_MUX 1
#define GPIO35_MUX 1
#define GPIO36_MUX 1
#define GPIO37_MUX 1
#define GPIO38_MUX 1
#define GPIO39_MUX 1
#define GPIO40_MUX 1
#define GPIO41_MUX 1
#define GPIO42_MUX 1
#define GPIO43_MUX 1
#define GPIO44_MUX 1
// GPIO Multiplexing
#define _GPIO_MUX(GPION, PORT, MX) GpioCtrlRegs.GLUEEE(GP, PORT, MUX, MX).bit.GPION = 0;
#define GPIO_MUX(GPION) _GPIO_MUX(GPION, GLUE(GPION, _PORT), GLUE(GPION, _MUX))
// Direction out
#define _GPIO_DRO(PORT, GPION) GpioCtrlRegs.GLUEE(GP, PORT, DIR).bit.GPION = 1;
#define GPIO_DRO(GPION) _GPIO_DRO(GLUE(GPION, _PORT), GPION)
// Direction in
#define _GPIO_DRI(PORT, PIN) GpioCtrlRegs.GLUEE(GP, PORT, DIR).bit.GPION = 0;
#define GPIO_DRI(GPION) _GPIO_DRI(GLUE(GPION, _PORT), GPION)
// Set pin
#define _GPIO_SET(PORT, GPION) GpioDataRegs.GLUEE(GP, PORT, SET).bit.GPION = 1;
#define GPIO_SET(GPION) _GPIO_SET(GLUE(GPION, _PORT), GPION)
// Clear pin
#define _GPIO_CLR(PORT, GPION) GpioDataRegs.GLUEE(GP, PORT, CLEAR).bit.GPION = 1;
#define GPIO_CLR(GPION) _GPIO_CLR(GLUE(GPION, _PORT), GPION)
// Toggle pin
#define _GPIO_TGL(PORT, GPION) GpioDataRegs.GLUEE(GP, PORT, TOGGLE).bit.GPION = 1;
#define GPIO_TGL(GPION) _GPIO_TGL(GLUE(GPION, _PORT), GPION)
// Read pin
#define _GPIO_DAT(PORT, GPION) (GpioDataRegs.GLUEE(GP, PORT, DAT).bit.GPION)
#define GPIO_DAT(GPION) (_GPIO_DAT(GLUE(GPION, _PORT), GPION))
// LEDs
#define LED_RED GPIO8
#define LED_GREEN GPIO9
void LedInit(void)
{
EALLOW ;
// Enable GPIO peripheral clock
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;
// Configure LED pins
GPIO_MUX(LED_RED);
GPIO_MUX(LED_GREEN);
// Preinit
GPIO_SET(LED_RED);
GPIO_SET(LED_GREEN);
// Dir
GPIO_DRO(LED_RED);
GPIO_DRO(LED_GREEN);
EDIS ;
}
void LedRedTogle(void)
{
GPIO_TGL(LED_RED);
}
Может сгодится кому..