PIN设备实用注意事项

在潘多拉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)。

发布了323 篇原创文章 · 获赞 63 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/qq_27508477/article/details/102527037