MCU学习帮 发表于 2025-10-9 09:47

如何将默认非GPIO的Pin设置为GPIO

Questions:如何将以下默认非GPIO的Pin设置为GPIO?

HEXT_IN: PD0
HEXT_OUT:PD1
JTMS-SWDIO:PA13
JTCK-SWCLK:PA14
JTDI:PA15
JTDO:PB3
NJTRST:PB4
TAMPER-RTC:PC13
LEXT_IN:PC14
LEXT_OUT:PC15
Answer:将以上IO设置为GPIO,需要开启对应GPIO时钟、开启复用时钟、将IO配置为输入/输出/复用功能、设置重映射、关闭入侵检测、关闭外部时钟等相应的操作。1.      将HEXT_IN、HEXT_OUT设置为GPIO此处以AT32F403A为例
gpio_init_type gpio_init_struct; /* enable the clock of gpiod, iomux */crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK, TRUE);crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, TRUE); crm_clock_source_enable(CRM_CLOCK_SOURCE_HEXT, FALSE);crm_hext_bypass(FALSE); /* set default parameter */gpio_default_para_init(&gpio_init_struct); /* configure pd0 (hext_in) and pd1 (hext_out) as output push-pull */gpio_init_struct.gpio_pins = GPIO_PINS_0 | GPIO_PINS_1;gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;gpio_init(GPIOD, &gpio_init_struct); gpio_pin_remap_config(PD01_GMUX, TRUE);
注:如果要使用PD0、PD1,则时钟初始化时不用使能HSE,PLL时钟源不能选择为HEXT。1.      将SWJ设置为GPIO此处以AT32F403A为例
gpio_init_type gpio_init_struct; /* enable the clock of gpioa, gpiob, iomux */crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK, TRUE);crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE); /* set default parameter */gpio_default_para_init(&gpio_init_struct); /* configure pa13 (jtms/swdat), pa14 (jtck/swclk) and pa15 (jtdi) asoutput push-pull */gpio_init_struct.gpio_pins = GPIO_PINS_13 | GPIO_PINS_14 |GPIO_PINS_15;gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;gpio_init(GPIOA, &gpio_init_struct); /* configure pb3 (jtdo) and pb4 (jtrst) as output push-pull */gpio_init_struct.gpio_pins = GPIO_PINS_3 | GPIO_PINS_4;gpio_init(GPIOB, &gpio_init_struct); /* disable the serial wire jtag debug port swj-dp */gpio_pin_remap_config(SWJTAG_MUX_100, TRUE);
关于SWJ重映射说明:
/* full swj enabled (jtag-dp + sw-dp) but without jtrst */#define SWJTAG_MUX_001                   SWJTAG_GMUX_001/* jtag-dp disabled and sw-dp enabled */#define SWJTAG_MUX_010                   SWJTAG_GMUX_010/* full swj disabled (jtag-dp + sw-dp) */#define SWJTAG_MUX_100                   SWJTAG_GMUX_100
2.      将TAMPER-RTC、LEXT_IN、LEXT_OUT设置为GPIO此处以AT32F403A为例
gpio_init_type gpio_init_struct; /* enable the clock of gpioc, bpr, pwc */crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);crm_periph_clock_enable(CRM_BPR_PERIPH_CLOCK, TRUE);crm_periph_clock_enable(CRM_PWC_PERIPH_CLOCK,TRUE); pwc_battery_powered_domain_access(TRUE);bpr_tamper_pin_enable(FALSE);crm_lext_bypass(FALSE);crm_clock_source_enable(CRM_CLOCK_SOURCE_LEXT,FALSE);pwc_battery_powered_domain_access(FALSE); /*configure pc13 (tamper-rtc), pc14 (lext_in) and pc15 (lext_out) as output push-pull */gpio_init_struct.gpio_pins= GPIO_PINS_13 | GPIO_PINS_14 | GPIO_PINS_15;gpio_init_struct.gpio_mode= GPIO_MODE_OUTPUT;gpio_init_struct.gpio_out_type= GPIO_OUTPUT_PUSH_PULL;gpio_init_struct.gpio_drive_strength= GPIO_DRIVE_STRENGTH_STRONGER;gpio_init(GPIOC, &gpio_init_struct);
注1:如果要使用PC14、PC15,则时钟初始化时不用使能LEXT。注2:根据Datasheet描述,PC13, PC14和PC15引脚通过电源开关进行供电,而这个电源开关只能够推动有限的电流(3 mA) ,因此这三个引脚作为输出引脚时不能作为电流源(如驱动LED) 。 适用型号:AT32F403,AT32F413, AT32F415, AT32F403A, AT32F407, AT32A403A
页: [1]
查看完整版本: 如何将默认非GPIO的Pin设置为GPIO