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

[复制链接]
136|0
MCU学习帮 发表于 2025-10-9 09:47 | 显示全部楼层 |阅读模式
GPIO, ST, ni, ck, Tru, PE
Questions:如何将以下默认非GPIOPin设置为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);
  
注:如果要使用PD0PD1,则时钟初始化时不用使能HSEPLL时钟源不能选择为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) 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(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:如果要使用PC14PC15,则时钟初始化时不用使能LEXT
2:根据Datasheet描述,PC13 PC14PC15引脚通过电源开关进行供电,而这个电源开关只能够推动有限的电流(3 mA ,因此这三个引脚作为输出引脚时不能作为电流源(如驱动LED
适用型号:AT32F403,AT32F413, AT32F415, AT32F403A, AT32F407, AT32A403A

您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

7

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部