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 参考
以下 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 状态之间循环切换并观察被释放的调试引脚。
5.15.3.1 LedBlink LED 闪烁
工程目录: 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 引脚。 端口、引脚与时钟都通过参数传入,初始化结构体固定为推挽输出。
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。
void LED_On(GPIO_Module* GPIOx,uint16_t Pin)
{
GPIO_SetBits(GPIOx,Pin);
}
void LED_Off(GPIO_Module* GPIOx,uint16_t Pin)
{
GPIO_ResetBits(GPIOx,Pin);
}
void LED_Blink(GPIO_Module* GPIOx,uint16_t Pin)
{
GPIO_TogglePin(GPIOx,Pin);
}
3. 通过 SWJ 重映射释放被 JTAG 占用的引脚。 PA8 复位后默认属于 JTAG,作为 LED 前必须先把 SWJ 配置为 SWD。
/* 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 依次点亮的循环。
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 在其中循环,便于按顺序切换和打印。
#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。
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。
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 的引脚,用于示波器观察释放效果。
/*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 引脚。 |
用户手册 |