5.15 GPIO 使用说明

本章说明 N32H49x 标准外设库中 GPIO/AFIO 驱动的文件组成、38 个公开函数,以及 LedBlink、IORemap 两个示例。GPIO 端口与复用功能的电气特性、复用功能映射与 JTAG 重映射请配合用户手册的“AFIO”章节阅读。

5.15.1 相关文件

相对路径 作用
firmware/n32h49x_std_periph_driver/inc/n32h49x_gpio.h 定义 GPIO 端口枚举、GPIO_InitType 结构体、引脚/模式/上下拉/驱动能力/速率/复用功能选择宏,以及 SPI NSS、XSPI、ETH、EMC 等 AFIO 配置宏,并按初始化、数据读写、锁定与重映射、AFIO 配置等区段声明 38 个公开函数
firmware/n32h49x_std_periph_driver/src/n32h49x_gpio.c 实现上述函数:端口与引脚复位、外设初始化、输入/输出数据读写、位置位/复位/写/翻转、引脚锁定、EXTI 线选择、引脚重映射,以及一组 AFIO 复用、滤波与 EMC 配置
projects/n32h49x_EVAL/examples/GPIO/ GPIO 示例根目录,含 LedBlink、IORemap 2 个示例
projects/n32h49x_EVAL/examples/GPIO/LedBlink/ LedBlink 示例的工程目录组成:MDK-ARM/、EWARM/、inc/、src/、readme.txt
projects/n32h49x_EVAL/bsp/ 该示例使用的板级支持文件:日志初始化与打印串口重映射、毫秒延时

5.15.2 API 参考

搜索 API共 38 个函数

以下 38 个公开函数按 n32h49x_gpio.h 的声明顺序分为 6 组;每个条目给出功能摘要与 n32h49x_gpio.c 中该函数正上方的注释原文。

初始化与复位

GPIO_DeInit、GPIO_DeInitPin、GPIO_AFIOInitDefault、GPIO_InitPeripheral、GPIO_InitStruct

输入数据读取

GPIO_ReadInputDataBit、GPIO_ReadInputData

输出数据读取

GPIO_ReadOutputDataBit、GPIO_ReadOutputData

输出写入与翻转

GPIO_SetBits、GPIO_ResetBits、GPIO_WriteBits、GPIO_Write、GPIO_TogglePin

引脚锁定、EXTI 线选择与重映射

GPIO_ConfigPinLock、GPIO_ConfigEXTILine、GPIO_ConfigPinRemap

AFIO 复用、滤波与 EMC 配置

AFIO_Config_SPI_NSS_Mode、AFIO_ConfigIOFilter、AFIO_Config_FEMC_NADV_Pin、AFIO_Config_EXTI_Filter、AFIO_Config_XSPI_XIP_BigEndian、AFIO_Config_XSPI_HalfDuplexMode、AFIO_Config_XSPI_DualQuadMode、AFIO_Config_ETH_Mode、AFIO_Config_XSPI_NSS_Input、AFIO_Config_XSPI_RXDS_SampleDelay、AFIO_Config_XSPI_BigEndian_Read、AFIO_Config_XSPI_BigEndian_Write、AFIO_Config_XSPI_TimeExtension、AFIO_Config_XSPI_NSS_HighTime、AFIO_ConfigPinAnalogSignalChannel、SDRAM_EnableClockInversion、AFIO_ConfigPinFilter、AFIO_Config_SHRTIM_EXEV_Pin、AFIO_Config_EMC_Funtion、AFIO_Set_EMC_Cnt、AFIO_Get_EMC_Cnt

void GPIO_DeInit(GPIO_Module* GPIOx)将 GPIOx 外设寄存器复位为默认值。
源码注释
name   GPIO_DeInit.
fun    Reset the GPIOx peripheral registers to their default reset values.
param  GPIOx :
          - GPIOA
          - GPIOB
          - GPIOC
          - GPIOD
          - GPIOE
          - GPIOF
          - GPIOG
          - GPIOH
return none
void GPIO_DeInitPin(GPIO_Module* GPIOx, uint32_t Pin)将 GPIOx 指定引脚恢复为默认复位状态。
源码注释
name   GPIO_DeInitPin.
fun    Deinitializes the GPIOx pin to the default reset state.
param   GPIOx :
          - GPIOA
          - GPIOB
          - GPIOC
          - GPIOD
          - GPIOE
          - GPIOF
          - GPIOG
          - GPIOH
param  Pin :
          - GPIO_PIN_0
          - GPIO_PIN_1
          - GPIO_PIN_2
          - GPIO_PIN_3
          - GPIO_PIN_4
          - GPIO_PIN_5
          - GPIO_PIN_6
          - GPIO_PIN_7
          - GPIO_PIN_8
          - GPIO_PIN_9
          - GPIO_PIN_10
          - GPIO_PIN_11
          - GPIO_PIN_12
          - GPIO_PIN_13
          - GPIO_PIN_14
          - GPIO_PIN_15
          - GPIO_PIN_ALL
return none
void GPIO_AFIOInitDefault(void)将 AFIO 外设寄存器复位为默认值。
源码注释
name   GPIO_AFIOInitDefault.
fun    Reset the AFIO peripheral registers to their default reset values.
param  none
return none
void GPIO_InitPeripheral(GPIO_Module* GPIOx, GPIO_InitType * GPIO_InitStruct)按 GPIO_InitStruct 结构体的值初始化 GPIOx 外设。
源码注释
name   GPIO_InitPeripheral.
fun    Initialize the GPIOx peripheral with the value of the GPIO_InitStruct structure.
param  GPIOx :
          - GPIOA
          - GPIOB
          - GPIOC
          - GPIOD
          - GPIOE
          - GPIOF
          - GPIOG
          - GPIOH
param  GPIO_InitStructure :
            - Pin
               - GPIO_PIN_0
               - GPIO_PIN_1
               - GPIO_PIN_2
               - GPIO_PIN_3
               - GPIO_PIN_4
               - GPIO_PIN_5
               - GPIO_PIN_6
               - GPIO_PIN_7
               - GPIO_PIN_8
               - GPIO_PIN_9
               - GPIO_PIN_10
               - GPIO_PIN_11
               - GPIO_PIN_12
               - GPIO_PIN_13
               - GPIO_PIN_14
               - GPIO_PIN_15
               - GPIO_PIN_ALL
            - GPIO_Mode
               - GPIO_MODE_INPUT
               - GPIO_MODE_OUTPUT_PP
               - GPIO_MODE_OUTPUT_OD
               - GPIO_MODE_AF_PP
               - GPIO_MODE_AF_OD
               - GPIO_MODE_ANALOG
            - GPIO_Pull
               - GPIO_NO_PULL
               - GPIO_PULL_UP
               - GPIO_PULL_DOWN
            - GPIO_Slew_Rate
               - GPIO_SLEW_RATE_FAST
               - GPIO_SLEW_RATE_SLOW
            - GPIO_Current
               - GPIO_DC_2mA
               - GPIO_DC_8mA
               - GPIO_DC_4mA
               - GPIO_DC_12mA
            - GPIO_Alternate
               - This parameter can be GPIO_AFx where x can be (0..31)
return none
note  If PC13,PC14,PC15 used as GPIO or Alternate IO, the clock of GPIOF must be enabled:
           Set IOPFEN(RCC_AHB1PCLKEN register bit[5]) bit to '1'.
void GPIO_InitStruct(GPIO_InitType* GPIO_InitStruct)为 InitStruct 各成员赋默认值。
源码注释
name   GPIO_InitStruct.
fun    Assign default values to each InitStruct member.
param  InitStruct :
           pointer to GPIO_InitType structure.
return none
uint8_t GPIO_ReadInputDataBit(GPIO_Module* GPIOx, uint16_t Pin)读取指定输入引脚的电平状态。
源码注释
name   GPIO_ReadInputDataBit.
fun    Get the pin status on the specified input pin.
param  GPIOx :
          - GPIOA
          - GPIOB
          - GPIOC
          - GPIOD
          - GPIOE
          - GPIOF
          - GPIOG
          - GPIOH
param  Pin :
          - GPIO_PIN_0
          - GPIO_PIN_1
          - GPIO_PIN_2
          - GPIO_PIN_3
          - GPIO_PIN_4
          - GPIO_PIN_5
          - GPIO_PIN_6
          - GPIO_PIN_7
          - GPIO_PIN_8
          - GPIO_PIN_9
          - GPIO_PIN_10
          - GPIO_PIN_11
          - GPIO_PIN_12
          - GPIO_PIN_13
          - GPIO_PIN_14
          - GPIO_PIN_15
return the state on the input pin.
uint16_t GPIO_ReadInputData(GPIO_Module* GPIOx)读取指定 GPIO 端口的输入数据。
源码注释
name   GPIO_ReadInputData.
fun    Get the input data on the designated GPIO port.
param  GPIOx :
          - GPIOA
          - GPIOB
          - GPIOC
          - GPIOD
          - GPIOE
          - GPIOF
          - GPIOG
          - GPIOH
return the data value on the GPIO input port.
uint8_t GPIO_ReadOutputDataBit(GPIO_Module* GPIOx, uint16_t Pin)读取指定输出引脚的电平状态。
源码注释
name   GPIO_ReadOutputDataBit.
fun    Get the pin status on the specified output pin.
param  GPIOx :
          - GPIOA
          - GPIOB
          - GPIOC
          - GPIOD
          - GPIOE
          - GPIOF
          - GPIOG
          - GPIOH
param  Pin :
          - GPIO_PIN_0
          - GPIO_PIN_1
          - GPIO_PIN_2
          - GPIO_PIN_3
          - GPIO_PIN_4
          - GPIO_PIN_5
          - GPIO_PIN_6
          - GPIO_PIN_7
          - GPIO_PIN_8
          - GPIO_PIN_9
          - GPIO_PIN_10
          - GPIO_PIN_11
          - GPIO_PIN_12
          - GPIO_PIN_13
          - GPIO_PIN_14
          - GPIO_PIN_15
return the state on the output pin.
uint16_t GPIO_ReadOutputData(GPIO_Module* GPIOx)读取指定 GPIO 端口的输出数据。
源码注释
name   GPIO_ReadOutputData.
fun    Get the output data on the designated GPIO port.
param  GPIOx :
          - GPIOA
          - GPIOB
          - GPIOC
          - GPIOD
          - GPIOE
          - GPIOF
          - GPIOG
          - GPIOH
return the data value on the GPIO output port.
void GPIO_SetBits(GPIO_Module* GPIOx, uint16_t Pin)置位选定的数据端口位。
源码注释
name   GPIO_SetBits.
fun    Sets the selected data port bits.
param  GPIOx :
          - GPIOA
          - GPIOB
          - GPIOC
          - GPIOD
          - GPIOE
          - GPIOF
          - GPIOG
          - GPIOH
param  Pin :
          - GPIO_PIN_0
          - GPIO_PIN_1
          - GPIO_PIN_2
          - GPIO_PIN_3
          - GPIO_PIN_4
          - GPIO_PIN_5
          - GPIO_PIN_6
          - GPIO_PIN_7
          - GPIO_PIN_8
          - GPIO_PIN_9
          - GPIO_PIN_10
          - GPIO_PIN_11
          - GPIO_PIN_12
          - GPIO_PIN_13
          - GPIO_PIN_14
          - GPIO_PIN_15
return none
void GPIO_ResetBits(GPIO_Module* GPIOx, uint16_t Pin)复位选定的数据端口位。
源码注释
name   GPIO_ResetBits.
fun    Reset the selected data port bits.
param  GPIOx :
          - GPIOA
          - GPIOB
          - GPIOC
          - GPIOD
          - GPIOE
          - GPIOF
          - GPIOG
          - GPIOH
param  Pin :
          - GPIO_PIN_0
          - GPIO_PIN_1
          - GPIO_PIN_2
          - GPIO_PIN_3
          - GPIO_PIN_4
          - GPIO_PIN_5
          - GPIO_PIN_6
          - GPIO_PIN_7
          - GPIO_PIN_8
          - GPIO_PIN_9
          - GPIO_PIN_10
          - GPIO_PIN_11
          - GPIO_PIN_12
          - GPIO_PIN_13
          - GPIO_PIN_14
          - GPIO_PIN_15
return none
void GPIO_WriteBits(GPIO_Module* GPIOx, uint16_t Pin, Bit_OperateType BitCmd)复位选定的数据端口位。
源码注释
name   GPIO_WriteBit.
fun    Reset the selected data port bits.
param  GPIOx :
          - GPIOA
          - GPIOB
          - GPIOC
          - GPIOD
          - GPIOE
          - GPIOF
          - GPIOG
          - GPIOH
param  Pin :
          - GPIO_PIN_0
          - GPIO_PIN_1
          - GPIO_PIN_2
          - GPIO_PIN_3
          - GPIO_PIN_4
          - GPIO_PIN_5
          - GPIO_PIN_6
          - GPIO_PIN_7
          - GPIO_PIN_8
          - GPIO_PIN_9
          - GPIO_PIN_10
          - GPIO_PIN_11
          - GPIO_PIN_12
          - GPIO_PIN_13
          - GPIO_PIN_14
          - GPIO_PIN_15
param  BitCmd :
          - Bit_RESET
          - Bit_SET
return none
void GPIO_Write(GPIO_Module* GPIOx, uint16_t data_value)向指定 GPIO 数据端口写入数据。
源码注释
name   GPIO_Write.
fun    Write data on the designated GPIO data port.
param  GPIOx :
          - GPIOA
          - GPIOB
          - GPIOC
          - GPIOD
          - GPIOE
          - GPIOF
          - GPIOG
          - GPIOH
param  data_value :
          the value to be written to the port output data register.
          - 0~0xFFFF
return none
void GPIO_TogglePin(GPIO_Module *GPIOx, uint16_t Pin)翻转指定端口引脚的电平。
源码注释
name   GPIO_Pin_Toggle.
fun    Toggle the specified port pin level.
param  GPIOx :
          - GPIOA
          - GPIOB
          - GPIOC
          - GPIOD
          - GPIOE
          - GPIOF
          - GPIOG
          - GPIOH
param  Pin :
          - GPIO_PIN_0
          - GPIO_PIN_1
          - GPIO_PIN_2
          - GPIO_PIN_3
          - GPIO_PIN_4
          - GPIO_PIN_5
          - GPIO_PIN_6
          - GPIO_PIN_7
          - GPIO_PIN_8
          - GPIO_PIN_9
          - GPIO_PIN_10
          - GPIO_PIN_11
          - GPIO_PIN_12
          - GPIO_PIN_13
          - GPIO_PIN_14
          - GPIO_PIN_15
return none
void GPIO_ConfigPinLock(GPIO_Module* GPIOx, uint16_t Pin)配置 GPIO 端口锁定寄存器。
源码注释
name   GPIO_ConfigPinLock.
fun    GPIO port lock register configuration.
param  GPIOx :
          - GPIOA
          - GPIOB
          - GPIOC
          - GPIOD
          - GPIOE
          - GPIOF
          - GPIOG
          - GPIOH
param  Pin :
          - GPIO_PIN_0
          - GPIO_PIN_1
          - GPIO_PIN_2
          - GPIO_PIN_3
          - GPIO_PIN_4
          - GPIO_PIN_5
          - GPIO_PIN_6
          - GPIO_PIN_7
          - GPIO_PIN_8
          - GPIO_PIN_9
          - GPIO_PIN_10
          - GPIO_PIN_11
          - GPIO_PIN_12
          - GPIO_PIN_13
          - GPIO_PIN_14
          - GPIO_PIN_15
return none
void GPIO_ConfigEXTILine(uint8_t LineSource, uint8_t PortSource, uint8_t PinSource)选择用作 EXTI 线的 GPIO 引脚。
源码注释
name   GPIO_ConfigEXTILine.
fun    Selects the GPIO pin used as EXTI Line.
param  LineSource :
          - EXTI_LINE_SOURCE0
          - EXTI_LINE_SOURCE1
          - EXTI_LINE_SOURCE2
          - EXTI_LINE_SOURCE3
          - EXTI_LINE_SOURCE4
          - EXTI_LINE_SOURCE5
          - EXTI_LINE_SOURCE6
          - EXTI_LINE_SOURCE7
          - EXTI_LINE_SOURCE8
          - EXTI_LINE_SOURCE9
          - EXTI_LINE_SOURCE10
          - EXTI_LINE_SOURCE11
          - EXTI_LINE_SOURCE12
          - EXTI_LINE_SOURCE13
          - EXTI_LINE_SOURCE14
          - EXTI_LINE_SOURCE15
param  PortSource :
          - GPIOA_PORT_SOURCE
          - GPIOB_PORT_SOURCE
          - GPIOC_PORT_SOURCE
          - GPIOD_PORT_SOURCE
          - GPIOE_PORT_SOURCE
          - GPIOF_PORT_SOURCE
          - GPIOG_PORT_SOURCE
          - GPIOH_PORT_SOURCE
param  PinSource :
          - GPIO_PIN_SOURCE0
          - GPIO_PIN_SOURCE1
          - GPIO_PIN_SOURCE2
          - GPIO_PIN_SOURCE3
          - GPIO_PIN_SOURCE4
          - GPIO_PIN_SOURCE5
          - GPIO_PIN_SOURCE6
          - GPIO_PIN_SOURCE7
          - GPIO_PIN_SOURCE8
          - GPIO_PIN_SOURCE9
          - GPIO_PIN_SOURCE10
          - GPIO_PIN_SOURCE11
          - GPIO_PIN_SOURCE12
          - GPIO_PIN_SOURCE13
          - GPIO_PIN_SOURCE14
          - GPIO_PIN_SOURCE15
return none
void GPIO_ConfigPinRemap(uint8_t PortSource, uint8_t PinSource, uint32_t AlternateFunction)引脚重映射配置。
源码注释
name   GPIO_ConfigPinRemap.
fun    Pin remapping configuration.
param  PortSource :
          - GPIOA_PORT_SOURCE
          - GPIOB_PORT_SOURCE
          - GPIOC_PORT_SOURCE
          - GPIOD_PORT_SOURCE
          - GPIOE_PORT_SOURCE
          - GPIOF_PORT_SOURCE
          - GPIOG_PORT_SOURCE
          - GPIOH_PORT_SOURCE
param  PinSource :
          - GPIO_PIN_SOURCE0
          - GPIO_PIN_SOURCE1
          - GPIO_PIN_SOURCE2
          - GPIO_PIN_SOURCE3
          - GPIO_PIN_SOURCE4
          - GPIO_PIN_SOURCE5
          - GPIO_PIN_SOURCE6
          - GPIO_PIN_SOURCE7
          - GPIO_PIN_SOURCE8
          - GPIO_PIN_SOURCE9
          - GPIO_PIN_SOURCE10
          - GPIO_PIN_SOURCE11
          - GPIO_PIN_SOURCE12
          - GPIO_PIN_SOURCE13
          - GPIO_PIN_SOURCE14
          - GPIO_PIN_SOURCE15
param  AlternateFunction :
          - This parameter can be GPIO_AFx where x can be (0..31)
          - This parameter can also be one of the following parameter(PortSource and PinSource is ignored):
               - GPIO_RMP_SWJ_JTAG:            Full SWJ Enabled (JTAG-DP + SW-DP)
               - GPIO_RMP_SWJ_JTAG_NO_NJTRST:  Full SWJ Enabled (JTAG-DP + SW-DP) but without NJTRST
               - GPIO_RMP_SWJ_SWD:   JTAG-DP Disabled and SW-DP Enabled
               - GPIO_RMP_SWJ_DISABLE:     Full SWJ Disabled (JTAG-DP + SW-DP)
return none
void AFIO_Config_SPI_NSS_Mode(uint32_t AFIO_SPIx_NSS, uint32_t NSS_Mode)配置空闲时 SPIx 的 NSS 模式。
源码注释
name   AFIO_Config_SPI_NSS_Mode.
fun    Configure the SPIx NSS mode during idle.
param  AFIO_SPIx_NSS :
          choose which SPI configuration.
          - AFIO_SPI1_NSS
          - AFIO_SPI2_NSS
          - AFIO_SPI3_NSS
          - AFIO_SPI4_NSS
          - AFIO_SPI5_NSS
          - AFIO_SPI6_NSS
param  NSS_Mode :
          specifies the SPI_NSS mode to be configured.
          - AFIO_SPI_NSS_HIGH_IMPEDANCE
          - AFIO_SPI_NSS_HIGH_LEVEL
return none
void AFIO_ConfigIOFilter(uint32_t Filter_Cycle)配置以 AHB 时钟计数的 IO 滤波周期。
源码注释
name   AFIO_ConfigIOFilter.
fun    Configure IO filter cycle which is counted in AHB clock.
param  Filter_Cycle :
        - 1~64
return none
void AFIO_Config_FEMC_NADV_Pin(uint32_t NADV_Pin)使能或禁用 FEMC NADV 引脚。
源码注释
name   AFIO_Config_FEMC_NADV_Pin.
fun    Enable or disable the FEMC NADV pin.
param  NADV_Pin :
        - AFIO_FEMC_NADV_PIN_USED
        - AFIO_FEMC_NADV_PIN_NOT_USED
return none
void AFIO_Config_EXTI_Filter(uint32_t EXTI_Filter)使能或禁用 EXTI 模拟滤波。
源码注释
name   AFIO_Config_EXTI_Filter.
fun    Enable or disable EXTI analog filter.
param  EXTI_Filter :
        - AFIO_EXTI_FILTER_ENABLE
        - AFIO_EXTI_FILTER_DISABLE
return none
void AFIO_Config_XSPI_XIP_BigEndian(uint32_t Endian)使能或禁用 XSPI XIP 模式的大端序。
源码注释
name   AFIO_Config_XSPI_XIP_BigEndian.
fun    Enable or disable the big endian for XSPI XIP mode.
param  Endian :
          - AFIO_XSPI_XIP_LITTLE_ENDIAN
          - AFIO_XSPI_XIP_BIG_ENDIAN
return none
void AFIO_Config_XSPI_HalfDuplexMode(uint32_t HalfDuplex)使能或禁用 XSPI 半双工模式。
源码注释
name   AFIO_Config_XSPI_HalfDuplexMode.
fun    Enable or disable the XSPI Half-Duplex mode.
param  HalfDuplex :
          - AFIO_XSPI_HALF_DUPLEX_DISABLE
          - AFIO_XSPI_HALF_DUPLEX_ENABLE
return none
void AFIO_Config_XSPI_DualQuadMode(uint32_t DualQuad)使能或禁用 XSPI 双四线模式。
源码注释
name   AFIO_Config_XSPI_DualQuadMode.
fun    Enable or disable the XSPI Dual-Quad mode.
param  DualQuad :
          - AFIO_XSPI_DUAL_QUAD_DISABLE
          - AFIO_XSPI_DUAL_QUAD_ENABLE
return none
void AFIO_Config_ETH_Mode(uint32_t ETH_Mode)配置 ETH 接口模式。
源码注释
name   AFIO_Config_ETH_Mode.
fun    Config the ETH interface mode
param  ETH_Mode :
          - AFIO_ETH_MODE_MII
          - AFIO_ETH_MODE_RMII
return none
void AFIO_Config_XSPI_NSS_Input(uint32_t InputEnable, uint32_t InputPin)使能或禁用 XSPI NSS 输入功能,并选择所用 NSS 引脚。
源码注释
name   AFIO_Config_XSPI_NSS_Input.
fun    Enable or disable XSPI NSS input function, and select which NSS pin is used
param  InputEnable :
          - AFIO_XSPI_NSS_INPUT_DISABLE
          - AFIO_XSPI_NSS_INPUT_ENABLE
param  InputPin :
          - AFIO_XSPI_NSS_INPUT_NSS0
          - AFIO_XSPI_NSS_INPUT_NSS1
return none
void AFIO_Config_XSPI_RXDS_SampleDelay(uint32_t Delay)配置 RXDS 采样点与 RXDS 上升/下降沿之间的延时。
源码注释
name   AFIO_Config_XSPI_RXDS_SampleDelay.
fun    Config the delay time between RXDS sample point and RXDS rising/falling edge.
param  Delay :
          - AFIO_XSPI_RXDS_DELAY_NONE
          - AFIO_XSPI_RXDS_DELAY_1HCLK
          - AFIO_XSPI_RXDS_DELAY_2HCLK
return none
void AFIO_Config_XSPI_BigEndian_Read(uint32_t Endian)使能或禁用普通模式(非 XIP)下 XSPI 的大端读取。
源码注释
name   AFIO_Config_XSPI_BigEndian_Read.
fun    Enable or disable XSPI Big Endian read in normal mode(not XIP)
param  Endian :
          - AFIO_XSPI_READ_LITTLE_ENDIAN
          - AFIO_XSPI_READ_BIG_ENDIAN
return none
void AFIO_Config_XSPI_BigEndian_Write(uint32_t Endian)使能或禁用普通模式(非 XIP)下 XSPI 的大端写入。
源码注释
name   AFIO_Config_XSPI_BigEndian_Write.
fun    Enable or disable XSPI Big Endian write in normal mode(not XIP)
param  Endian :
          - AFIO_XSPI_WRITE_LITTLE_ENDIAN
          - AFIO_XSPI_WRITE_BIG_ENDIAN
return none
void AFIO_Config_XSPI_TimeExtension(uint32_t Extension)使能或禁用 XSPI 建立时间或保持时间的时间扩展功能。
源码注释
name   AFIO_Config_XSPI_TimeExtension.
fun    Enable or disable XSPI time extension funtion for setup time or hold time.
param  Extension :
          - AFIO_XSPI_NO_TIME_EXTENSION
          - AFIO_XSPI_SETUP_TIME_EXTENSION
          - AFIO_XSPI_HOLD_TIME_EXTENSION
          - AFIO_XSPI_SETUP_HOLD_TIME_EXTENSION
return none
void AFIO_Config_XSPI_NSS_HighTime(uint32_t clk)当 XSPI_CTRL0.SSTE 位置位时,配置 XSPI NSS 引脚的高电平时间。
源码注释
name   AFIO_Config_XSPI_NSS_HighTime.
fun    Config the high-level time of XSPI NSS pin when XSPI_CTRL0.SSTE bit is set.
param  clk :
          - AFIO_XSPI_NSS_HIGH_1CLK
          - AFIO_XSPI_NSS_HIGH_2CLK
          - AFIO_XSPI_NSS_HIGH_3CLK
          - AFIO_XSPI_NSS_HIGH_4CLK
          - AFIO_XSPI_NSS_HIGH_5CLK
          - AFIO_XSPI_NSS_HIGH_6CLK
          - AFIO_XSPI_NSS_HIGH_7CLK
          - AFIO_XSPI_NSS_HIGH_8CLK
          - AFIO_XSPI_NSS_HIGH_9CLK
          - AFIO_XSPI_NSS_HIGH_10CLK
          - AFIO_XSPI_NSS_HIGH_11CLK
          - AFIO_XSPI_NSS_HIGH_12CLK
          - AFIO_XSPI_NSS_HIGH_13CLK
          - AFIO_XSPI_NSS_HIGH_14CLK
          - AFIO_XSPI_NSS_HIGH_15CLK
          - AFIO_XSPI_NSS_HIGH_16CLK
return none
void AFIO_ConfigPinAnalogSignalChannel(GPIO_Module* GPIOx, uint32_t Pin,FunctionalState cmd)使能或禁用 GPIOx 引脚的模拟信号通道。
源码注释
name   AFIO_ConfigPinAnalogSignalChannel.
fun    Enable or disable the analog signal channel for GPIOx pin.
param   GPIOx :
          - GPIOA
          - GPIOB
          - GPIOC
          - GPIOD
          - GPIOE
          - GPIOF
          - GPIOG
          - GPIOH
param  Pin :
          - GPIO_PIN_0
          - GPIO_PIN_1
          - GPIO_PIN_2
          - GPIO_PIN_3
          - GPIO_PIN_4
          - GPIO_PIN_5
          - GPIO_PIN_6
          - GPIO_PIN_7
          - GPIO_PIN_8
          - GPIO_PIN_9
          - GPIO_PIN_10
          - GPIO_PIN_11
          - GPIO_PIN_12
          - GPIO_PIN_13
          - GPIO_PIN_14
          - GPIO_PIN_15
          - GPIO_PIN_ALL
param  cmd :
          - DISABLE
          - ENABLE
return none
void SDRAM_EnableClockInversion(FunctionalState cmd)使能或禁用 SDRAM 时钟反相。
源码注释
name   SDRAM_EnableClockInversion.
fun    Enable or disable the clock inversion of SDRAM.
param  cmd :
          - DISABLE
          - ENABLE
return none
void AFIO_ConfigPinFilter(GPIO_Module* GPIOx, uint32_t Pin,FunctionalState cmd)使能或禁用 GPIOx 引脚的数字滤波功能。
源码注释
name   AFIO_ConfigPinFilter.
fun    Enable or disable the digital filter function for GPIOx pin.
param   GPIOx :
          - GPIOA
          - GPIOB
          - GPIOC
          - GPIOD
          - GPIOE
          - GPIOF
          - GPIOG
          - GPIOH
param  Pin :
          - GPIO_PIN_0
          - GPIO_PIN_1
          - GPIO_PIN_2
          - GPIO_PIN_3
          - GPIO_PIN_4
          - GPIO_PIN_5
          - GPIO_PIN_6
          - GPIO_PIN_7
          - GPIO_PIN_8
          - GPIO_PIN_9
          - GPIO_PIN_10
          - GPIO_PIN_11
          - GPIO_PIN_12
          - GPIO_PIN_13
          - GPIO_PIN_14
          - GPIO_PIN_15
          - GPIO_PIN_ALL
param  cmd :
          - DISABLE
          - ENABLE
return none
void AFIO_Config_SHRTIM_EXEV_Pin(uint8_t EXEV_Line, uint8_t PortSource, uint8_t PinSource)该函数在驱动头文件中声明,当前 SDK 未提供对应实现。
源码注释
name    AFIO_Config_SHRTIM_EXEV_Pin
fun     (declared in the driver header; no implementation in this SDK)
void AFIO_Config_EMC_Funtion(uint32_t EMC_fun, FunctionalState cmd)使能或禁用某项 EMC 功能。
源码注释
name   AFIO_Config_EMC_Funtion.
fun    Enable or disable some EMC function.
param  EMC_fun :
          - AFIO_EMC_CLAMP1_RST
          - AFIO_EMC_CLAMP2_RST
          - AFIO_EMC_CLAMP3_RST
          - AFIO_EMC_CLAMP4_RST
          - AFIO_EMC_GBN1_RST
          - AFIO_EMC_GBN2_RST
          - AFIO_EMC_GBN3_RST
          - AFIO_EMC_GBN4_RST
          - AFIO_EMC_GB1_RST
          - AFIO_EMC_GB2_RST
          - AFIO_EMC_GB3_RST
          - AFIO_EMC_GB4_RST
          - AFIO_EMC_CLAMP1_DET
          - AFIO_EMC_CLAMP2_DET
          - AFIO_EMC_CLAMP3_DET
          - AFIO_EMC_CLAMP4_DET
          - AFIO_EMC_GBN1_DET
          - AFIO_EMC_GBN2_DET
          - AFIO_EMC_GBN3_DET
          - AFIO_EMC_GBN4_DET
          - AFIO_EMC_GB1_DET
          - AFIO_EMC_GB2_DET
          - AFIO_EMC_GB3_DET
          - AFIO_EMC_GB4_DET
param  cmd :
          - DISABLE
          - ENABLE
return none
void AFIO_Set_EMC_Cnt(uint32_t cnt)设置 EMC 计数值。
源码注释
name   AFIO_Set_EMC_Cnt.
fun    Set the EMC counter value.
param  cnt :
        - 0~1023
return none
uint32_t AFIO_Get_EMC_Cnt(void)获取 EMC 计数值。
源码注释
name   AFIO_Get_EMC_Cnt.
fun    Get the EMC counter value.
param  none
return Current counter value.

5.15.3 Demo 示例说明

本节说明 GPIO 的 2 个示例:LedBlink 演示 GPIO 推挽输出与 SWJ 重映射释放 PA8,IORemap 演示按键在四种 SWJ 状态之间循环切换并观察被释放的调试引脚。

工程目录: projects/n32h49x_EVAL/examples/GPIO/LedBlink/

使能三路 LED 的 GPIO 时钟并把 PA3、PB3、PA8 配为推挽输出→LED1 与 LED3 交替闪烁 4 次→用 SWJ 重映射把 PA8 从 JTAG 释放为普通 IO→三个 LED 依次点亮并在主循环中循环

项目 源码解读
功能 以 PA3、PB3、PA8 三路 LED 演示 GPIO 输出控制;
先让 LED1 与 LED3 闪烁,再通过 SWJ 重映射把被 JTAG 占用的 PA8 释放为普通 IO,最后三路 LED 依次点亮并循环。
源码组成 src/main.c:main 以及 LED_Init、LED_On、LED_Off、LED_Blink;
inc/main.h:LED1/LED2/LED3 的端口、引脚、时钟宏与函数声明;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 LED1 为 PA3、LED2 为 PB3、LED3 为 PA8,均配置为 GPIO_MODE_OUTPUT_PP、GPIO_AF0、GPIO_NO_PULL、GPIO_DS_8mA;
系统时钟为 HSI+PLL,240 MHz。
程序与数据路径 main 先三次调用 LED_Init 初始化三路 LED,随后 8 次循环用 LED_Blink 轮流翻转 LED1 与 LED3,间隔 systick_delay_ms(500);
接着使能 AFIO 时钟并调用 GPIO_ConfigPinRemap(0,0,GPIO_RMP_SWJ_SWD) 释放 PA8,最后在主循环中依次点亮 LED1、LED2、LED3。
主要 API GPIO_InitPeripheral、GPIO_SetBits、GPIO_ResetBits、GPIO_TogglePin、GPIO_ConfigPinRemap
验证方法 复位运行后 LED1 与 LED3 同步闪烁 4 次;
之后 PA8 被重映射为 GPIO,三个 LED 依次点亮,每个间隔 500 ms,循环往复。
使用提示 PA8 复位后默认用于 JTAG,作为 LED 使用前必须先使能 AFIO 时钟并调用 GPIO_ConfigPinRemap 切换到 SWD;
切换后调试器需改用 SWD 连接。
开发环境为 KEIL MDK-ARM V5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例用三路 GPIO 推挽输出控制 LED,并演示如何通过 SWJ 重映射把被 JTAG 占用的 PA8 释放为普通 IO。

数据路径: LED_Init 使能 GPIO 时钟并把 PA3/PB3/PA8 配为推挽输出 → LED_Blink 用 GPIO_TogglePin 让 LED1 与 LED3 交替闪烁 → GPIO_ConfigPinRemap 把 SWJ 切到 SWD 以释放 PA8 → 主循环用 LED_On、LED_Off 依次点亮三路 LED

1. 统一初始化 LED 引脚。 端口、引脚与时钟都通过参数传入,初始化结构体固定为推挽输出。

src/main.csrc/main.c · LED_Init
void LED_Init(GPIO_Module* GPIOx,uint16_t Pin, uint32_t clock)
{
    GPIO_InitType InitStruct;
    
    /* Enable GPIO clock */
    RCC_EnableAHB1PeriphClk(clock,ENABLE);
    
    /* Init GPIO as output push-pull mode */
    InitStruct.Pin            = Pin;
    InitStruct.GPIO_Slew_Rate = GPIO_SLEW_RATE_FAST;
    InitStruct.GPIO_Mode      = GPIO_MODE_OUTPUT_PP;
    InitStruct.GPIO_Alternate = GPIO_AF0;
    InitStruct.GPIO_Pull      = GPIO_NO_PULL;
    InitStruct.GPIO_Current   = GPIO_DS_8mA;
    
    GPIO_InitPeripheral(GPIOx, &InitStruct);
}

GPIO_Alternate = GPIO_AF0 表示不使用复用功能,GPIO_Current = GPIO_DS_8mA 决定输出驱动能力。

2. 用 Set/Reset/Toggle 三个封装读写引脚。 三个函数分别对应置位、复位与翻转,便于在主循环中直观控制 LED。

src/main.csrc/main.c · LED_On
void LED_On(GPIO_Module* GPIOx,uint16_t Pin)
{
    GPIO_SetBits(GPIOx,Pin);
}
src/main.csrc/main.c · LED_Off
void LED_Off(GPIO_Module* GPIOx,uint16_t Pin)
{
    GPIO_ResetBits(GPIOx,Pin);
}
src/main.csrc/main.c · LED_Blink
void LED_Blink(GPIO_Module* GPIOx,uint16_t Pin)
{
    GPIO_TogglePin(GPIOx,Pin);
}

3. 通过 SWJ 重映射释放被 JTAG 占用的引脚。 PA8 复位后默认属于 JTAG,作为 LED 前必须先把 SWJ 配置为 SWD。

src/main.csrc/main.c · main
    /* LED3 port is default used for JTAG, must remap first */
    RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPHEN_AFIO,ENABLE);
    GPIO_ConfigPinRemap(0,0,GPIO_RMP_SWJ_SWD);

GPIO_RMP_SWJ_SWD 对应 SWJ_CFG 的“关闭 JTAG-DP、保留 SW-DP”,PA13/PA14 仍用于调试,其余 JTAG 引脚被释放为普通 IO。

4. 主循环依次点亮三路 LED。 复位运行后先闪烁,再进入三路 LED 依次点亮的循环。

src/main.csrc/main.c · main
    while (1)
    {
        /* Turn on LED1 and turn off LED3*/
        LED_Off(LED3_PORT, LED3_PIN);
        LED_On(LED1_PORT, LED1_PIN);
        systick_delay_ms(500);
        
        /* Turn on LED2 and turn off LED1*/
        LED_Off(LED1_PORT, LED1_PIN);
        LED_On(LED2_PORT, LED2_PIN);
        systick_delay_ms(500);
        
        /* Turn on LED3 and turn off LED2 */
        LED_Off(LED2_PORT, LED2_PIN);
        LED_On(LED3_PORT, LED3_PIN);
        systick_delay_ms(500);
    }

每步只点亮一个 LED 并熄灭上一个,间隔由 systick_delay_ms(500) 决定,三路循环往复。

对应源码: src/main.c、inc/main.h

5.15.3.2 IORemap JTAG 端口重映射

工程目录: projects/n32h49x_EVAL/examples/GPIO/IORemap/

初始化打印串口与两路 LED,并把 JTAG 引脚配为输出、按键配为输入→主循环按固定节奏翻转 PA13/PA14/PA15 与 PB3/PB4 的电平→按键按下并消抖后切换 SWJ 状态→在 JTAG、无 NJTRST 的 JTAG、SWD、禁用之间循环→串口打印当前状态并由 LED 指示

项目 源码解读
功能 演示 JTAG 端口的 SWJ 重映射:按键按下并消抖后,SWJ_CFG 在完整 JTAG、无 NJTRST 的 JTAG、仅 SWD、完全禁用之间循环;
被释放的调试引脚输出方波,串口打印当前状态并用 LED 指示。
源码组成 src/main.c:main、LED_Init/LED_On/LED_Off、Key_Init、JTAG_IO_Init、JTAG_switch 与 Delay;
inc/main.h:LED1/LED3、KEY 的端口/引脚/时钟宏、KEY_READ 宏与函数声明;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 LED1 为 PA3、LED3 为 PA8;
KEY 为 PA0,配置为 GPIO_MODE_INPUT、GPIO_PULL_DOWN;
JTAG 引脚 PA13/PA14/PA15 与 PB3/PB4 配为 GPIO_MODE_OUTPUT_PP、GPIO_NO_AF、GPIO_DS_2mA;
打印串口为 USART,TX-PA9、RX-PA10,115200;
系统时钟 240 MHz。
程序与数据路径 main 调用 log_init 打印 IO remaping demo! 与初始 JTAG 状态,随后使能 AFIO 时钟、初始化 LED、调用 JTAG_IO_Init 与 Key_Init;
主循环用 KEY_READ() 读取 PA0,按键释放且消抖计数超过 KEY_DEBOUCING 后递增 sts_cnt 并调用 JTAG_switch,同时按 SystemCoreClock/100 翻转调试引脚。
主要 API GPIO_InitPeripheral、GPIO_TogglePin、GPIO_SetBits、GPIO_ResetBits、GPIO_ConfigPinRemap
验证方法 复位后串口打印初始状态为 JTAG,PB4/PA15/PA14/PA13 无方波;
按键依次切换到 JTAG without TRST(释放 PB4)、SWD(释放 PB4/PA15)、Disabled(全部释放),被释放引脚输出方波;
LED1/LED3 随状态点亮作为指示。
使用提示 切换 SWJ 状态后调试器连接方式随之改变,测试完全禁用 JTAG/SWD 时需重新上电或复位恢复;
JTAG_switch 会先熄灭 LED 再调用 GPIO_ConfigPinRemap,状态回绕由 sts_cnt 与 MAX_JTAG_STS 控制。
开发环境为 KEIL MDK-ARM V5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例用按键在四种 SWJ 状态之间循环,并把被 JTAG 占用的引脚释放为可翻转的普通输出。

数据路径: JTAG_IO_Init 把 PA13/PA14/PA15 与 PB3/PB4 配为推挽输出 → 主循环用 KEY_READ() 检测按键并消抖 → JTAG_switch 调用 GPIO_ConfigPinRemap 切换 SWJ_CFG → GPIO_TogglePin 让已释放的调试引脚输出方波并由串口打印当前状态

1. 用两个数组登记四种 SWJ 状态。 状态值与显示名一一对应,sts_cnt 在其中循环,便于按顺序切换和打印。

src/main.csrc/main.c
#define MAX_JTAG_STS    (4)
uint32_t jtag_sts[MAX_JTAG_STS]={GPIO_RMP_SWJ_JTAG,GPIO_RMP_SWJ_JTAG_NO_NJTRST,GPIO_RMP_SWJ_SWD,GPIO_RMP_SWJ_DISABLE};
char *sts[] = {"JTAG","JTAG without TRST","SWD","Disabled"};

jtag_sts[] 依次对应完整 JTAG、无 NJTRST 的 JTAG、仅 SWD、完全禁用四种配置,sts[] 提供串口打印用的名称。

2. JTAG_switch 切换状态并点亮指示 LED。 函数先熄灭两个 LED,再调用重映射接口切换 SWJ,并根据状态点亮 LED。

src/main.csrc/main.c · JTAG_switch
    LED_Off(LED1_PORT, LED1_PIN);
    LED_Off(LED3_PORT, LED3_PIN);

    GPIO_ConfigPinRemap(0,0,jtag_sts[sts_cnt]);
    printf("JTAG status changed to %s\r\n",sts[sts_cnt]);

    if(sts_cnt & 0x1)
    {
        LED_On(LED1_PORT, LED1_PIN);
    }

    if(sts_cnt > 1)
    {
        LED_On(LED3_PORT, LED3_PIN);
    }

sts_cnt & 0x1 与 sts_cnt > 1 两个条件分别驱动 LED1 与 LED3,从而用两个 LED 的亮灭组合指示当前处于第几种状态。

3. 主循环消抖检测按键。 按键按下时累加 KeyDelay,释放且计数超过 KEY_DEBOUCING 才视为一次有效操作,随后递增并按 MAX_JTAG_STS 回绕 sts_cnt。

src/main.csrc/main.c · main
        if( KEY_READ() != 0) /* Key pressed */
        {
            KeyDelay++;
        }
        else if(KeyDelay > KEY_DEBOUCING)   /* Key released */
        {
            if(sts_cnt >= (MAX_JTAG_STS-1))
            {
                sts_cnt = 0;
            }
            else
            {
                sts_cnt++;
            }
            
            
            JTAG_switch(sts_cnt);   /* Change JTAG status by remapping */
            KeyDelay = 0;
        }

只有先按下再释放、且按下持续时间足够长时才切换到下一状态,避免抖动导致状态乱跳。

4. 翻转被释放的调试引脚。 以 SystemCoreClock/100 为间隔,用 GPIO_TogglePin 同时翻转 GPIOA 与 GPIOB 上原属 JTAG 的引脚,用于示波器观察释放效果。

src/main.csrc/main.c · main
        /*Toggle JTAG IO port*/
        if(IODelay < (SystemCoreClock/100))
        {
            IODelay++;
        }
        else
        {
            IODelay = 0;
            GPIO_TogglePin(GPIOA,GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
            GPIO_TogglePin(GPIOB,GPIO_PIN_3|GPIO_PIN_4);
        }

未释放的引脚仍受调试端口控制,不会响应翻转;只有被当前 SWJ 状态释放的引脚才会输出方波。

对应源码: src/main.c、inc/main.h

5.15.4 注意与排障

场景 检查与建议 来源
IO 寄存器访问位宽 对 GPIO 与 AFIO 寄存器必须按 32 位字访问,禁止按半字或字节访问;
否则可能读到非预期值或写入无效。
用户手册
复位后的默认状态 复位后除 JTAG 调试引脚外,大多数 IO 处于模拟模式;
作为数字输入或输出使用前,必须先通过 GPIO_InitPeripheral 配置为对应模式。
用户手册
PC13/PC14/PC15 的时钟 将 PC13、PC14、PC15 用作 GPIO 或复用功能时,必须使能 GPIOF 时钟(把 RCC_AHB1PCLKEN 的 IOPFEN 位,即 bit[5],置 1);
GPIO_InitPeripheral 的注释已就此给出提示。
用户手册
备份域引脚的优先级 LSE 使能时 PC14、PC15 被强制为模拟模式;
PC13 受备份域控制,仅在 LSE 关闭、VDD 供电且不停留在 STANDBY/STOP0 时才能作 GPIO 使用。
用户手册
配置锁定 GPIO 端口配置锁定寄存器对被锁定的引脚位仅能由系统复位清除;
锁定后该引脚的配置不能再被修改。
用户手册
复用输出与外设 把引脚配置为复用输出(GPIO_MODE_AF_PP/GPIO_MODE_AF_OD)时,所对应的外设必须已使能并处于激活状态;
外设未激活时输出电平未定义。
用户手册
调试端口重映射 通过 GPIO_ConfigPinRemap 以 GPIO_RMP_SWJ_* 配置 SWJ_CFG(000 全 JTAG、001 无 NJTRST、010 关闭 JTAG 保留 SWD、100 全部关闭);
释放 PB4/PA15/PA14/PA13 作普通 IO,例如把 PA15 用作 I2C1_SCL 时须选择 010 或 100。
用户手册
EXTI 输入线配置 用作 EXTI 或唤醒源的引脚须配置为输入模式,并通过 AFIO_EXTI_CFGy 映射到对应 EXTI 线;
同一根 EXTI 线同一时刻只能映射到一个 GPIO 引脚。
用户手册
国民技术开发套件文档中心

按芯片系列在线查阅国民技术 MCU 开发套件的芯片资料、SDK、驱动 API 与 Demo 示例说明。

© 2026 国民技术股份有限公司 版权所有粤ICP备11069485号本站使用不含 Cookie 的匿名访问统计