在潘多拉stm32l475的drv_gpio.c
中,pin_index是这样定义的:
static const struct pin_index pins[] =
{
__STM32_PIN_DEFAULT,
__STM32_PIN(1, E, 2), // PE2 : SAI1_MCLK_A --> ES8388
__STM32_PIN(2, E, 3), // PE3 : SAI1_SD_B --> ES8388
__STM32_PIN(3, E, 4), // PE4 : SAI1_FS_A --> ES8388
__STM32_PIN(4, E, 5), // PE5 : SAI1_SCK_A --> ES8388
__STM32_PIN(5, E, 6), // PE6 : SAI1_SD_A --> ES8388
__STM32_PIN_DEFAULT, // : VBAT
__STM32_PIN(7, C, 13), // PC13: SD_CS --> SD_CARD
__STM32_PIN(8, C, 14), // PC14: OSC32_IN
__STM32_PIN(9, C, 15), // PC15: OSC32_OUT
__STM32_PIN_DEFAULT, // : VSS
__STM32_PIN_DEFAULT, // : VDD
__STM32_PIN_DEFAULT, // PH0 : OSC_IN
__STM32_PIN_DEFAULT, // PH1 : OSC_OUT
__STM32_PIN_DEFAULT, // : RESET
__STM32_PIN(15, C, 0), // PC0 : I2C_SCL --> ES8388
__STM32_PIN(16, C, 1), // PC1 : I2C_SDA --> ES8388
__STM32_PIN(17, C, 2), // PC2 : GBC_LED --> ATK MODULE
__STM32_PIN(18, C, 3), // PC3 : GBC_KEY --> ATK MODULE
__STM32_PIN_DEFAULT, // : VSSA
__STM32_PIN_DEFAULT, // : VREF-
__STM32_PIN_DEFAULT, // : VREF+
__STM32_PIN_DEFAULT, // : VDDA
__STM32_PIN(23, A, 0), // PA0 : MOTOR_A --> MOTOR
__STM32_PIN(24, A, 1), // PA1 : MOTOR_B --> MOTOR
__STM32_PIN(25, A, 2), // PA2 : UART2_TX --> EXTERNAL MODULE
__STM32_PIN(26, A, 3), // PA3 : UART2_RX --> EXTERNAL MODULE
__STM32_PIN_DEFAULT, // : VSS
__STM32_PIN_DEFAULT, // : VDD
__STM32_PIN(29, A, 4), // PA4 : ADC12_IN9 --> EXTERNAL MODULE
__STM32_PIN(30, A, 5), // PA5 : SPI1_SCK --> SD_CARD
__STM32_PIN(31, A, 6), // PA6 : SPI1_MISO --> SD_CARD
__STM32_PIN(32, A, 7), // PA7 : SPI1_MOSI --> SD_CARD
__STM32_PIN(33, C, 4), // PC4 : GBC_RX --> ATK MODULE
__STM32_PIN(34, C, 5), // PC5 : WIFI_INT --> WIFI
__STM32_PIN(35, B, 0), // PB0 : EMISSION --> INFRARED EMISSION
__STM32_PIN(36, B, 1), // PB1 : RECEPTION --> INFRARED EMISSION
__STM32_PIN(37, B, 2), // PB2 : BEEP --> BEEP
__STM32_PIN(38, E, 7), // PE7 : LED_R --> LED
__STM32_PIN(39, E, 8), // PE8 : LED_G --> LED
__STM32_PIN(40, E, 9), // PE9 : LED_B --> LED
__STM32_PIN(41, E, 10), // PE10: QSPI_BK1_CLK --> SPI_FLASH
__STM32_PIN(42, E, 11), // PE11: QSPI_BK1_NCS --> SPI_FLASH
__STM32_PIN(43, E, 12), // PE12: QSPI_BK1_IO0 --> SPI_FLASH
__STM32_PIN(44, E, 13), // PE13: QSPI_BK1_IO1 --> SPI_FLASH
__STM32_PIN(45, E, 14), // PE14: QSPI_BK1_IO2 --> SPI_FLASH
__STM32_PIN(46, E, 15), // PE15: QSPI_BK1_IO3 --> SPI_FLASH
__STM32_PIN(47, B, 10), // PB10: AP_INT --> ALS&PS SENSOR
__STM32_PIN(48, B, 11), // PB11: ICM_INT --> AXIS SENSOR
__STM32_PIN_DEFAULT, // : VSS
__STM32_PIN_DEFAULT, // : VDD
__STM32_PIN(51, B, 12), // PB12: SPI2_CS --> EXTERNAL MODULE
__STM32_PIN(52, B, 13), // PB13: SPI2_SCK --> EXTERNAL MODULE
__STM32_PIN(53, B, 14), // PB14: SPI2_MISO --> EXTERNAL MODULE
__STM32_PIN(54, B, 15), // PB15: SPI2_MOSI --> EXTERNAL MODULE
__STM32_PIN(55, D, 8), // PD8 : KEY0 --> KEY
__STM32_PIN(56, D, 9), // PD9 : KEY1 --> KEY
__STM32_PIN(57, D, 10), // PD10: KEY2 --> KEY
__STM32_PIN(58, D, 11), // PD11: WK_UP --> KEY
__STM32_PIN(59, D, 12), // PD12: IO_PD12 --> EXTERNAL MODULEL
__STM32_PIN(60, D, 13), // PD13: IO_PD13 --> EXTERNAL MODULE
__STM32_PIN(61, D, 14), // PD14: IO_PD14 --> EXTERNAL MODULE
__STM32_PIN(62, D, 15), // PD15: IO_PD15 --> EXTERNAL MODULE
__STM32_PIN(63, C, 6), // PC6 : TIM3_CH1 --> EXTERNAL MODULE
__STM32_PIN(64, C, 7), // PC7 : TIM3_CH2 --> EXTERNAL MODULE
__STM32_PIN(65, C, 8), // PC8 : SDIO_D0 --> WIFI
__STM32_PIN(66, C, 9), // PC9 : SDIO_D1 --> WIFI
__STM32_PIN(67, A, 8), // PA8 : IO_PA8 --> EXTERNAL MODULE
__STM32_PIN(68, A, 9), // PA9 : UART1_TX --> STLINK_RX
__STM32_PIN(69, A, 10), // PA10: UART1_RX --> STLINK_RX
__STM32_PIN(70, A, 11), // PA11: USB_D- --> USB OTG && EXTERNAL MODULE
__STM32_PIN(71, A, 12), // PA12: USB_D+ --> USB OTG && EXTERNAL MODULE
__STM32_PIN(72, A, 13), // PA13: T_JTMS --> STLINK
__STM32_PIN_DEFAULT, // : VDDUSB
__STM32_PIN_DEFAULT, // : VSS
__STM32_PIN_DEFAULT, // : VDD
__STM32_PIN(76, A, 14), // PA14: T_JTCK --> STLINK
__STM32_PIN(77, A, 15), // PA15: AUDIO_PWR --> AUDIO && POWER
__STM32_PIN(78, C, 10), // PC10: SDIO_D2 --> WIFI
__STM32_PIN(79, C, 11), // PC11: SDIO_D3 --> WIFI
__STM32_PIN(80, C, 12), // PC12: SDIO_CLK --> WIFI
__STM32_PIN(81, D, 0), //
__STM32_PIN(82, D, 1), // PD1 : WIFI_REG_ON --> WIFI
__STM32_PIN(83, D, 2), // PD2 : SDIO_CMD --> WIFI
__STM32_PIN(84, D, 3), // PD3 : IO_PD3 --> EXTERNAL MODULE
__STM32_PIN(85, D, 4), // PD4 : NRF_IRQ --> WIRELESS
__STM32_PIN(86, D, 5), // PD5 : NRF_CE --> WIRELESS
__STM32_PIN(87, D, 6), // PD6 : NRF_CS --> WIRELESS
__STM32_PIN(88, D, 7), // PD7 : LCD_CS --> LCD
__STM32_PIN(89, B, 3), // PB3 : LCD_SPI_SCK --> LCD
__STM32_PIN(90, B, 4), // PB4 : LCD_WR --> LCD
__STM32_PIN(91, B, 5), // PB5 : LCD_SPI_SDA --> LCD
__STM32_PIN(92, B, 6), // PB6 : LCD_RESET --> LCD
__STM32_PIN(93, B, 7), // PB7 : LCD_PWR --> LCD
__STM32_PIN_DEFAULT, // : BOOT0
__STM32_PIN(95, B, 8), // PB8 : I2C1_SCL --> EXTERNAL MODULE
__STM32_PIN(96, B, 9), // PB9 : I2C1_SDA --> EXTERNAL MODULE
__STM32_PIN(97, E, 0), // PE0 : IO_PE0 --> EXTERNAL MODULE
__STM32_PIN(98, E, 1), // PE1 : IO_PE1 --> EXTERNAL MODULE
__STM32_PIN_DEFAULT, // : VSS
__STM32_PIN_DEFAULT, // : VDD
};
其顺序是根据物理引脚的排序定义的,所以根据原理图中的引脚号直接编程。
如下就可以直接进行编程:
#define LED_PIN 38
int main(void)
{
unsigned int count = 1;
/* set LED pin mode to output */
rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);
while (count > 0)
{
/* led on */
rt_pin_write(LED_PIN, PIN_LOW);
rt_kprintf("led on, count: %d\n", count);
rt_thread_mdelay(500);
/* led off */
rt_pin_write(LED_PIN, PIN_HIGH);
rt_kprintf("led off\n");
rt_thread_mdelay(500);
count++;
}
return 0;
}
但在通用的drv_gpio.c
中,是这样定义的:
static const struct pin_index pins[] =
{
#ifdef GPIOA
__STM32_PIN(0 , A, 0 ),
__STM32_PIN(1 , A, 1 ),
__STM32_PIN(2 , A, 2 ),
__STM32_PIN(3 , A, 3 ),
__STM32_PIN(4 , A, 4 ),
__STM32_PIN(5 , A, 5 ),
__STM32_PIN(6 , A, 6 ),
__STM32_PIN(7 , A, 7 ),
__STM32_PIN(8 , A, 8 ),
__STM32_PIN(9 , A, 9 ),
__STM32_PIN(10, A, 10),
__STM32_PIN(11, A, 11),
__STM32_PIN(12, A, 12),
__STM32_PIN(13, A, 13),
__STM32_PIN(14, A, 14),
__STM32_PIN(15, A, 15),
#endif
#ifdef GPIOB
__STM32_PIN(16, B, 0),
__STM32_PIN(17, B, 1),
__STM32_PIN(18, B, 2),
__STM32_PIN(19, B, 3),
__STM32_PIN(20, B, 4),
__STM32_PIN(21, B, 5),
__STM32_PIN(22, B, 6),
__STM32_PIN(23, B, 7),
__STM32_PIN(24, B, 8),
__STM32_PIN(25, B, 9),
__STM32_PIN(26, B, 10),
__STM32_PIN(27, B, 11),
__STM32_PIN(28, B, 12),
__STM32_PIN(29, B, 13),
__STM32_PIN(30, B, 14),
__STM32_PIN(31, B, 15),
#endif
#ifdef GPIOC
__STM32_PIN(32, C, 0),
__STM32_PIN(33, C, 1),
__STM32_PIN(34, C, 2),
__STM32_PIN(35, C, 3),
__STM32_PIN(36, C, 4),
__STM32_PIN(37, C, 5),
__STM32_PIN(38, C, 6),
__STM32_PIN(39, C, 7),
__STM32_PIN(40, C, 8),
__STM32_PIN(41, C, 9),
__STM32_PIN(42, C, 10),
__STM32_PIN(43, C, 11),
__STM32_PIN(44, C, 12),
__STM32_PIN(45, C, 13),
__STM32_PIN(46, C, 14),
__STM32_PIN(47, C, 15),
#endif
#ifdef GPIOD
__STM32_PIN(48, D, 0),
__STM32_PIN(49, D, 1),
__STM32_PIN(50, D, 2),
__STM32_PIN(51, D, 3),
__STM32_PIN(52, D, 4),
__STM32_PIN(53, D, 5),
__STM32_PIN(54, D, 6),
__STM32_PIN(55, D, 7),
__STM32_PIN(56, D, 8),
__STM32_PIN(57, D, 9),
__STM32_PIN(58, D, 10),
__STM32_PIN(59, D, 11),
__STM32_PIN(60, D, 12),
__STM32_PIN(61, D, 13),
__STM32_PIN(62, D, 14),
__STM32_PIN(63, D, 15),
#endif
#ifdef GPIOE
__STM32_PIN(64, E, 0),
__STM32_PIN(65, E, 1),
__STM32_PIN(66, E, 2),
__STM32_PIN(67, E, 3),
__STM32_PIN(68, E, 4),
__STM32_PIN(69, E, 5),
__STM32_PIN(70, E, 6),
__STM32_PIN(71, E, 7),
__STM32_PIN(72, E, 8),
__STM32_PIN(73, E, 9),
__STM32_PIN(74, E, 10),
__STM32_PIN(75, E, 11),
__STM32_PIN(76, E, 12),
__STM32_PIN(77, E, 13),
__STM32_PIN(78, E, 14),
__STM32_PIN(79, E, 15),
#endif
#ifdef GPIOF
__STM32_PIN(80, F, 0),
__STM32_PIN(81, F, 1),
__STM32_PIN(82, F, 2),
__STM32_PIN(83, F, 3),
__STM32_PIN(84, F, 4),
__STM32_PIN(85, F, 5),
__STM32_PIN(86, F, 6),
__STM32_PIN(87, F, 7),
__STM32_PIN(88, F, 8),
__STM32_PIN(89, F, 9),
__STM32_PIN(90, F, 10),
__STM32_PIN(91, F, 11),
__STM32_PIN(92, F, 12),
__STM32_PIN(93, F, 13),
__STM32_PIN(94, F, 14),
__STM32_PIN(95, F, 15),
#endif
#ifdef GPIOG
__STM32_PIN(96, G, 0),
__STM32_PIN(97, G, 1),
__STM32_PIN(98, G, 2),
__STM32_PIN(99, G, 3),
__STM32_PIN(100, G, 4),
__STM32_PIN(101, G, 5),
__STM32_PIN(102, G, 6),
__STM32_PIN(103, G, 7),
__STM32_PIN(104, G, 8),
__STM32_PIN(105, G, 9),
__STM32_PIN(106, G, 10),
__STM32_PIN(107, G, 11),
__STM32_PIN(108, G, 12),
__STM32_PIN(109, G, 13),
__STM32_PIN(110, G, 14),
__STM32_PIN(111, G, 15),
#endif
#ifdef GPIOH
__STM32_PIN(112, H, 0),
__STM32_PIN(113, H, 1),
__STM32_PIN(114, H, 2),
__STM32_PIN(115, H, 3),
__STM32_PIN(116, H, 4),
__STM32_PIN(117, H, 5),
__STM32_PIN(118, H, 6),
__STM32_PIN(119, H, 7),
__STM32_PIN(120, H, 8),
__STM32_PIN(121, H, 9),
__STM32_PIN(122, H, 10),
__STM32_PIN(124, H, 11),
__STM32_PIN(125, H, 12),
__STM32_PIN(126, H, 13),
__STM32_PIN(127, H, 14),
__STM32_PIN(128, H, 15),
#endif
#ifdef GPIOI
__STM32_PIN(129, I, 0),
__STM32_PIN(130, I, 1),
__STM32_PIN(131, I, 2),
__STM32_PIN(132, I, 3),
__STM32_PIN(133, I, 4),
__STM32_PIN(134, I, 5),
__STM32_PIN(135, I, 6),
__STM32_PIN(136, I, 7),
__STM32_PIN(137, I, 8),
__STM32_PIN(138, I, 9),
__STM32_PIN(139, I, 10),
__STM32_PIN(140, I, 11),
__STM32_PIN(141, I, 12),
__STM32_PIN(142, I, 13),
__STM32_PIN(143, I, 14),
__STM32_PIN(144, I, 15),
#endif
#ifdef GPIOJ
__STM32_PIN(145, J, 0),
__STM32_PIN(146, J, 1),
__STM32_PIN(147, J, 2),
__STM32_PIN(148, J, 3),
__STM32_PIN(149, J, 4),
__STM32_PIN(150, J, 5),
__STM32_PIN(151, J, 6),
__STM32_PIN(152, J, 7),
__STM32_PIN(153, J, 8),
__STM32_PIN(154, J, 9),
__STM32_PIN(155, J, 10),
__STM32_PIN(156, J, 11),
__STM32_PIN(157, J, 12),
__STM32_PIN(158, J, 13),
__STM32_PIN(159, J, 14),
__STM32_PIN(160, J, 15),
#endif
#ifdef GPIOK
__STM32_PIN(161, K, 0),
__STM32_PIN(162, K, 1),
__STM32_PIN(163, K, 2),
__STM32_PIN(164, K, 3),
__STM32_PIN(165, K, 4),
__STM32_PIN(166, K, 5),
__STM32_PIN(167, K, 6),
__STM32_PIN(168, K, 7),
__STM32_PIN(169, K, 8),
__STM32_PIN(170, K, 9),
__STM32_PIN(171, K, 10),
__STM32_PIN(172, K, 11),
__STM32_PIN(173, K, 12),
__STM32_PIN(174, K, 13),
__STM32_PIN(175, K, 14),
__STM32_PIN(176, K, 15),
#endif
};
因为不同封装的引脚号是不同的,如果按照第一种方式,就需要对不同的引脚数进行不同的定义。而采用这种方式,一来可以快速寻找索引,二来不用针对不同容量进行多种适配。
使用过程如下:
#define LED0_PIN GET_PIN(C, 0)
int main(void)
{
int count = 1;
/* set LED0 pin mode to output */
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
while (count++)
{
rt_pin_write(LED0_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED0_PIN, PIN_LOW);
rt_thread_mdelay(500);
}
return RT_EOK;
}
通过调用GET_PIN
的宏,可以快速找到索引号,然后再根据索引号对实际IO进行操作。
由于文件的引入是有先后顺序的,所以在#include "drv_gpio.h"
之前使用GET_PIN
是无法被识别的,如在rtconfig.h
中对模拟I2C1的脚号定义:
#define BSP_USING_I2C1
#define BSP_I2C1_SCL_PIN 22//GET_PIN(B, 6)
#define BSP_I2C1_SDA_PIN 23//GET_PIN(B, 7)
就无法直接用,必须进行查表或口算(16+6)。