hoop 发表于 2021-3-13 10:33

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

本帖最后由 ArterySW 于 2021-5-31 09:31 编辑

Questions:如何将以下默认非GPIO的Pin设置为GPIO Answer:将以上IO设置为GPIO,需要开启对应GPIO时钟、开启复用时钟、将IO配置为输入/输出/复用功能、设置重映射、关闭入侵检测、关闭外部时钟等相应的操作。1.将OSC_IN、OSC_OUT设置为GPIO输出,需要设置如下://开启GPIOD时钟、开启复用时钟RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOD| RCC_APB2PERIPH_AFIO, ENABLE);//关闭外部高速时钟RCC_HSEConfig(RCC_HSE_DISABLE);//设置PD0、PD1为推挽输出GPIO_InitStructure.GPIO_Pins = GPIO_Pins_0| GPIO_Pins_1;GPIO_InitStructure.GPIO_MaxSpeed =GPIO_MaxSpeed_2MHz;GPIO_InitStructure.GPIO_Mode =GPIO_Mode_OUT_PP;GPIO_Init(GPIOD, &GPIO_InitStructure);//设置重映射 JTAG-DP Disabled and SW-DP EnabledGPIO_PinsRemapConfig(GPIO_Remap_PD01,ENABLE);注:如果要使用PD0、PD1,则时钟初始化时不用使能HSE、PLL时钟源不能选择为HSE。2.将SWJ设置为GPIO,例如将JTDI、JTDO、NJTRST设置为GPIO输出,需要设置如下://开启GPIOA、GPIOB时钟、开启复用时钟RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOA | RCC_APB2PERIPH_GPIOB | RCC_APB2PERIPH_AFIO,ENABLE);//设置PA15、PB3、PB4为推挽输出         GPIO_InitStructure.GPIO_Pins = GPIO_Pins_15;       GPIO_InitStructure.GPIO_MaxSpeed= GPIO_MaxSpeed_2MHz;       GPIO_InitStructure.GPIO_Mode= GPIO_Mode_OUT_PP;       GPIO_Init(GPIOA,&GPIO_InitStructure);        GPIO_InitStructure.GPIO_Pins= GPIO_Pins_3 | GPIO_Pins_4;       GPIO_Init(GPIOB,&GPIO_InitStructure);//设置重映射 JTAG-DPDisabled and SW-DP Enabled       GPIO_PinsRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

关于SWJ重映射说明:/*!< Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST */#define GPIO_Remap_SWJ_NoJNTRST    ((uint32_t)0x01000000)/*!< JTAG-DP Disabled and SW-DP Enabled */#define GPIO_Remap_SWJ_JTAGDisable ((uint32_t)0x02000000)/*!< Full SWJ Disabled (JTAG-DP + SW-DP) */#define GPIO_Remap_SWJ_AllDisable((uint32_t)0x04000000)3.将TAMPER-RTC、OSC32_IN、OSC32_OUT设置为GPIO输出,需要设置如下://开启GPIOC时钟、开启备份接口时钟、开启电源接口时钟RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOC,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_BKP,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_PWR,ENABLE);//关闭入侵检测和外部低速时钟PWR_BackupAccessCtrl(ENABLE);BKP_TamperPinCmd(DISABLE);       //关闭入侵检测RCC_LSEConfig(RCC_LSE_DISABLE);   //关闭外部低速时钟PWR_BackupAccessCtrl(DISABLE);//设置PC13、PC14、PC15为推挽输出GPIO_InitStructure.GPIO_Pins = GPIO_Pins_13| GPIO_Pins_14 | GPIO_Pins_15;GPIO_InitStructure.GPIO_MaxSpeed =GPIO_MaxSpeed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT_PP;GPIO_Init(GPIOC, &GPIO_InitStructure);注:如果要使用PC14、PC15,则时钟初始化时不用使能LSE。注:个别型号(比如F415/F421)无独立的BKP时钟使能位,当要使用BKP时,开启PWR时钟并取消后备域写保护使能即可。
类型:MCU 应用适用型号:全系列(AT32F403, AT32F403A, AT32F413,AT32F415, AT32F407)主功能:GPIO

tuzheng 发表于 2021-5-30 20:44

AT32F415按以上设置发现如下问题,请帮忙解决一下,谢谢!
1,GPIO_PinsRemapConfig(GPIO_Remap_PTD01, ENABLE); ------我改为: GPIO_PinsRemapConfig(GPIO_Remap_PD01, ENABLE); 好像编译就不提示错误了,是否文档笔误还是其他原因?
2,RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_BKP, ENABLE);------编译时提示未定义,我查了AT32F415的APB1中好像是没有备份接口时钟的使能位,那么在哪里呢?

ArterySW 发表于 2021-5-31 09:31

tuzheng 发表于 2021-5-30 20:44
AT32F415按以上设置发现如下问题,请帮忙解决一下,谢谢!
1,GPIO_PinsRemapConfig(GPIO_Remap_PTD01, ENAB ...

谢谢提醒!
1.确为笔误,已修正;
2.如文档所述,部分型号无独立的BKP时钟,此时若使用BKP时,开启PWR时钟并取消后备域写保护使能即可。

tuzheng 发表于 2021-5-31 12:56

本帖最后由 tuzheng 于 2021-5-31 13:11 编辑

ArterySW 发表于 2021-5-31 09:31
谢谢提醒!
1.确为笔误,已修正;
2.如文档所述,部分型号无独立的BKP时钟,此时若使用BKP时,开启PWR时 ...
好的。在开发板AT_START_F415的开发包中,还发现两个用到的函数只有声明没有定义:
1,void PWR_BackupAccessCtrl(FunctionalState NewState);声明在at32f4xx_pwr.h中;
2,void BKP_TamperPinCmd(FunctionalState NewState);声明在at32f4xx_bkp.h中;

hoop 发表于 2021-5-31 17:57

tuzheng 发表于 2021-5-31 12:56
好的。在开发板AT_START_F415的开发包中,还发现两个用到的函数只有声明没有定义:
1,void PWR_BackupAcc ...

PWR_BackupAccessCtrl——这个是有原型的哦;
BKP_TamperPinCmd——这个好像如你所说,我再去看看

tuzheng 发表于 2021-5-31 19:49

hoop 发表于 2021-5-31 17:57
PWR_BackupAccessCtrl——这个是有原型的哦;
BKP_TamperPinCmd——这个好像如你所说,我再去看看 ...

你说的函数原型是指函数声明吧?这个是有的,但函数定义没有,无法调用这两个函数

hoop 发表于 2021-6-1 09:04

tuzheng 发表于 2021-5-31 19:49
你说的函数原型是指函数声明吧?这个是有的,但函数定义没有,无法调用这两个函数 ...

有再去搜了一边,确认这两个函数都有定义,在其对应的.c里面。你搜不到是不是因为没有添加对应的.c文件?

tuzheng 发表于 2021-6-1 14:23

hoop 发表于 2021-6-1 09:04
有再去搜了一边,确认这两个函数都有定义,在其对应的.c里面。你搜不到是不是因为没有添加对应的.c文件? ...

是的,确实没有包含进来,谢谢提醒!

单片小菜 发表于 2021-6-1 19:19

我忘记是什么指令了,可以直接的屏蔽掉。

sky8023 发表于 2021-9-3 15:37


void BKP_TamperPinCmd(FunctionalState NewState);声明在at32f4xx_bkp.h中;
AT32F415芯片,这个函数虽然在at32f4xx_bkp.c 文件里面有,但是宏定义没有定义。函数是灰色的。

勇敢的大白菜 发表于 2021-9-3 17:43

这个写的特别好。
页: [1]
查看完整版本: FAQ0016_默认非GPIO的Pin如何设置为GPIO