ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
24 декабря
722625
Молодой коллега (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); } Может сгодится кому..