Skip to main content

Port使用指南

基本概述

Port子系统是MCU上对PIN的功能和属性进行配置的子系统。

Port_Func模块PIN号对应的PIN名称列表

下表中各列含义如下:

  • PIN序号:Port子模块中使用的PIN序号
  • PIN Name:PIN的命名;
  • GPIO编号:用于获取GPIO控制器地址偏移及GPIO控制器寄存器偏移的编号;
PIN序号PIN NameGPIO编号
0FUSA_ERR0GPIO_MCU[0]
1FUSA_ERR1GPIO_MCU[1]
2PPS_INOUTGPIO_MCU[2]
3LIN1_TXDGPIO_MCU[3]
4LIN2_TXDGPIO_MCU[4]
5CAN0_TXGPIO_MCU[5]
6CAN1_TXGPIO_MCU[6]
7CAN2_TXGPIO_MCU[7]
8CAN3_TXGPIO_MCU[8]
9CAN4_TXGPIO_MCU[9]
10CAN5_TXGPIO_MCU[10]
11CAN6_TXGPIO_MCU[11]
12CAN7_TXGPIO_MCU[12]
13CAN8_TXGPIO_MCU[13]
14CAN9_TXGPIO_MCU[14]
15SPI2_CSN1GPIO_MCU[15]
16SPI2_CSN0GPIO_MCU[16]
17SPI2_MOSIGPIO_MCU[17]
18SPI2_MISOGPIO_MCU[18]
19SPI2_SCLKGPIO_MCU[19]
20SPI3_CSN0GPIO_MCU[20]
21SPI3_CSN1GPIO_MCU[21]
22SPI3_MOSIGPIO_MCU[22]
23SPI3_MISOGPIO_MCU[23]
24SPI3_SCLKGPIO_MCU[24]
25SPI4_CSN0GPIO_MCU[25]
26SPI4_CSN1GPIO_MCU[26]
27SPI4_MOSIGPIO_MCU[27]
28SPI4_MISOGPIO_MCU[28]
29SPI4_SCLKGPIO_MCU[29]
30SPI5_CSN0GPIO_MCU[30]
31SPI5_CSN1GPIO_MCU[31]
32SPI5_MOSIGPIO_MCU[32]
33SPI5_MISOGPIO_MCU[33]
34SPI5_SCLKGPIO_MCU[34]
35SPI6_CSN0GPIO_MCU[35]
36SPI6_CSN1GPIO_MCU[36]
37SPI6_MOSIGPIO_MCU[37]
38SPI6_MISOGPIO_MCU[38]
39SPI6_SCLKGPIO_MCU[39]
40XSPI_MOSI_IO0GPIO_MCU[40]
41XSPI_MISO_IO1GPIO_MCU[41]
42XSPI_WP_IO2GPIO_MCU[42]
43XSPI_HOLD_IO3GPIO_MCU[43]
44XSPI_OCT_IO4GPIO_MCU[44]
45XSPI_OCT_IO5GPIO_MCU[45]
46XSPI_OCT_IO6GPIO_MCU[46]
47XSPI_OCT_IO7GPIO_MCU[47]
48XSPI_SCLKGPIO_MCU[48]
49XSPI_SCLK_INVGPIO_MCU[49]
50XSPI_DQSGPIO_MCU[50]
51EMAC_TX_CLKGPIO_MCU[51]
52EMAC_TX_ENGPIO_MCU[52]
53EMAC_TX_D3GPIO_MCU[53]
54EMAC_TX_D2GPIO_MCU[54]
55EMAC_TX_D1GPIO_MCU[55]
56EMAC_TX_D0GPIO_MCU[56]
57EMAC_RX_CLKGPIO_MCU[57]
58EMAC_RX_DVGPIO_MCU[58]
59EMAC_RX_D3GPIO_MCU[59]
60EMAC_RX_D2GPIO_MCU[60]
61EMAC_RX_D1GPIO_MCU[61]
62EMAC_RX_D0GPIO_MCU[62]
63XSPI_CSNGPIO_MCU[63]
64XSPI_RST_NGPIO_MCU[64]
65XSPI_ECC_FAILGPIO_MCU[65]
66XSPI_HYP_INTGPIO_MCU[66]
67BIFSPI_CSNGPIO_MCU[67]
68BIFSPI_SCLKGPIO_MCU[68]
69BIFSPI_MOSIGPIO_MCU[69]
70BIFSPI_MISOGPIO_MCU[70]
71PMIC_ERR0GPIO_MCU[71]
72JTG_TCKGPIO_MCU[72]
73JTG_TRSTNGPIO_MCU[73]
74JTG_TMSGPIO_MCU[74]
75JTG_TDIGPIO_MCU[75]
76JTG_TDOGPIO_MCU[76]
77EMAC_MDCGPIO_MCU[77]
78EMAC_MDIOGPIO_MCU[78]
79ReservedN/A
80I2C6_SCLGPIO_MCU[79]
81I2C6_SDAGPIO_MCU[80]
82I2C7_SCLGPIO_MCU[81]
83I2C7_SDAGPIO_MCU[82]
84I2C8_SCLGPIO_MCU[83]
85I2C8_SDAGPIO_MCU[84]
86PWM0_IOGPIO_MCU[85]
87PWM1_IOGPIO_MCU[86]
88CAN0_RXGPIO_AON[0]
89CAN1_RXGPIO_AON[1]
90CAN2_RXGPIO_AON[2]
91CAN3_RXGPIO_AON[3]
92CAN4_RXGPIO_AON[4]
93CAN5_RXGPIO_AON[5]
94CAN6_RXGPIO_AON[6]
95CAN7_RXGPIO_AON[7]
96CAN8_RXGPIO_AON[8]
97CAN9_RXGPIO_AON[9]
98LIN1_RXDGPIO_AON[10]
99LIN2_RXDGPIO_AON[11]
100ReservedN/A
101ReservedN/A
102ReservedN/A
103ReservedN/A
104ReservedN/A
105WAKEUP_IOGPIO_AON[12]

Port_Func模块

Port_Func模块是地瓜提供的针对功能模块对该功能模块下属所有PIN进行初始化配置/操作GPIO的模块。

Port_Func模块配置PIN功能使用示例

代码示例

使用示例可以参考samples/Spi/SPI_sample/Spi_sample.c,基本使用逻辑为:

...
#include <Port_Func.h>

...

/* Configure Pin for SPI5 */
Port_SetFunctionPins(PORT_FUNC_SPI5);

...

Port_Func模块提供的外设配置

地瓜提供的默认外设PIN配置被记录在:McalCdd/Port/inc/Port_Func.h文件内,通过一个由enum类型定义记录:

...

typedef enum PinFunctions {
PORT_FUNC_UART4,
PORT_FUNC_UART5,
PORT_FUNC_UART6,
PORT_FUNC_SPI2,
PORT_FUNC_SPI3,
PORT_FUNC_SPI4,
PORT_FUNC_SPI5,
PORT_FUNC_SPI6,
PORT_FUNC_SPI7,
PORT_FUNC_CAN0,
PORT_FUNC_CAN1,
PORT_FUNC_CAN2,
PORT_FUNC_CAN3,
PORT_FUNC_CAN4,
PORT_FUNC_CAN5,
PORT_FUNC_CAN6,
PORT_FUNC_CAN7,
PORT_FUNC_CAN8,
PORT_FUNC_CAN9,
PORT_FUNC_I2C6,
PORT_FUNC_I2C7,
PORT_FUNC_I2C8,
PORT_FUNC_I2C9,
PORT_FUNC_PWM0,
PORT_FUNC_PWM1,
PORT_FUNC_PWM2,
PORT_FUNC_PWM3,
PORT_FUNC_PWM4,
PORT_FUNC_PWM5,
PORT_FUNC_PWM6,
PORT_FUNC_PWM7,
PORT_FUNC_PWM8,
PORT_FUNC_PWM9,
PORT_FUNC_PWM10,
PORT_FUNC_PWM11,
PORT_FUNC_PPS_IN0,
PORT_FUNC_PPS_IN1,
PORT_FUNC_PPS_IN2,
PORT_FUNC_PPS_OUT,
PORT_FUNC_EMAC,
PORT_FUNC_MAX,
} PinFunc_e;

...

Port_Func操作GPIO使用示例

Port_Func提供的GPIO接口,使用的PinIdx为Port_Func模块PIN号对应的PIN名称列表

代码示例

使用示例可以参考samples/Gpio/src/Gpio_sample.c,基本使用逻辑为:

    /* 配置"PinIdx" PIN为GPIO功能 */
RetVal = Port_SetGpioByIndex(PinIdx);

/* 配置"PinIdx" PIN方向为 OUTPUT 并配置输出电平为Level */
RetVal = Port_GpioDirectionOutput(PinIdx, Level);

/* 配置"PinIdx" PIN方向为 INPUT */
RetVal = Port_GpioDirectionInput(PinIdx);

/* 读取"PinIdx" PIN的值 */
RetVal = Port_GpioGetValue(PinIdx);

...

注意
  • "Port_GpioGetValue"函数返回的值,在外部PIN脚悬空时,会受到PinCtrl的配置影响,从而读出来的值可能有变化;
  • Port_Func模块提供的GPIO接口,会对具体操作的GPIO进行检查,部分PIN不允许操作,具体请参考McalCdd/Port/src/Port_Func.c文件内的Gpio_Blacklist数组:
    const uint8_t Gpio_Blacklist[] = {
    0, /* S100 Power related pins */
    5, /* S100 debug uart tx */
    38, /* S100 Power related pins */
    15, /* S100 Power related pins */
    68, /* S100 Power related pins */
    69, /* S100 Power related pins */
    71, /* S100 Power related pins */
    80, /* S100 Power related pins */
    81, /* S100 Power related pins */
    82, /* S100 Power related pins */
    83, /* S100 Power related pins */
    AON_PIN_NUM(0), /* S100 debug uart rx */
    AON_PIN_NUM(12), /* S100 Power related pins */
    };

Port开发指南

基本概述

Port整体分为对外接口和"Low Level Driver(LLD)"两大部分,这里只介绍用户接口开发部分。

Port_Func模块

地瓜MCU系统提供针对功能整体配置的Port_Func模块。

在McalCdd的路径中,定义了Port_Func模块的对外接口:

# Driver source code:
McalCdd/Port/inc/Port_Func.h
McalCdd/Port/src/Port_Func.c

在Config目录下,定义了MCU提供的外设的PIN的具体PinCtrl配置。

# PIN definition source code:
Config/McalCdd/gen_s100_sip_B_mcu1/Port/inc/Port_FuncCfg.h
Config/McalCdd/gen_s100_sip_B_mcu1/Port/src/Port_FuncCfg.c

PinCtrl配置说明

Config/McalCdd/gen_s100_sip_B_mcu1/Port/inc/Port_FuncCfg.h中,提供了方便定义PIN属性的宏:

#define PORT_FUNC_MCU_PIN(Pin_Idx, Pin_Name, Pin_Func, Schmitt, Input_En, SlewRate, Pull_Type, Drive_Strength) { \
(uint8)(Pin_Idx), /**< Pin Id */ \
(Pin_Name), /**< Pin name */ \
(boolean)(TRUE), /**< IsUsed */ \
{ \
(boolean)(TRUE), /**< ModeChang */ \
(boolean)(Schmitt), /**< Schmitt Trigger */ \
(boolean)(Input_En), /**< Input Enable*/ \
(boolean)(FALSE), /**< Is Used GPIO */ \
(boolean)(FALSE), /**< Direciton change allowed */ \
(Pin_Func), /**< Pin Function */ \
(SlewRate), /**< Slew Rate */ \
(Pull_Type), /**< Pin Pull Type */ \
(Drive_Strength), /**< Pin Drive Strength */ \
(PORT_PIN_DIR_IN), /**< GPIO Direction */ \
(PORT_PIN_LEVEL_LOW) /**< GPIO Output Value */ \
} \
}

...


#define PORT_FUNC_AON_PIN(Pin_Idx, Pin_Name, Pin_Func, Schmitt, Input_En, SlewRate, Pull_Type, Drive_Strength) { \
(uint8)((Pin_Idx) + (S100_PORT_MCU_PIN_NUM)), /**< Pin Id Converted */ \
(Pin_Name), /**< Pin name */ \
(boolean)(TRUE), /**< IsUsed */ \
{ \
(boolean)(TRUE), /**< ModeChang */ \
(boolean)(Schmitt), /**< Schmitt Trigger */ \
(boolean)(Input_En), /**< Input Enable*/ \
(boolean)(FALSE), /**< Is Used GPIO */ \
(boolean)(FALSE), /**< Direciton change allowed */ \
(Pin_Func), /**< Pin Function */ \
(SlewRate), /**< Slew Rate */ \
(Pull_Type), /**< Pin Pull Type */ \
(Drive_Strength), /**< Pin Drive Strength */ \
(PORT_PIN_DIR_IN), /**< GPIO Direction */ \
(PORT_PIN_LEVEL_LOW) /**< GPIO Output Value */ \
} \
}

...

地瓜根据各个功能的实际情况,提供了一套默认的PIN属性定义,在Config/McalCdd/gen_s100_sip_B_mcu1/Port/src/Port_FuncCfg.c文件内,客户可以根据自己的实际需求进行修改。