打印
[应用相关]

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

[复制链接]
4047|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hoop|  楼主 | 2021-3-13 10:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ArterySW 于 2021-5-31 09:31 编辑

Questions如何将以下默认非GPIOPin设置为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 Enabled
GPIO_PinsRemapConfig(GPIO_Remap_PD01,ENABLE);
注:如果要使用PD0PD1,则时钟初始化时不用使能HSEPLL时钟源不能选择为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);
注:如果要使用PC14PC15,则时钟初始化时不用使能LSE
注:个别型号(比如F415/F421)无独立的BKP时钟使能位,当要使用BKP时,开启PWR时钟并取消后备域写保护使能即可。

类型:MCU 应用
适用型号:全系列(AT32F403, AT32F403A, AT32F413,AT32F415, AT32F407
主功能:GPIO

FAQ0016_ How_to_set_the_default_non-GPIO_Pin_as_GPIO_CH_V1.0.1.pdf

239.15 KB

使用特权

评论回复
沙发
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中;

使用特权

评论回复
5
hoop|  楼主 | 2021-5-31 17:57 | 只看该作者
tuzheng 发表于 2021-5-31 12:56
好的。在开发板AT_START_F415的开发包中,还发现两个用到的函数只有声明没有定义:
1,void PWR_BackupAcc ...

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

使用特权

评论回复
6
tuzheng| | 2021-5-31 19:49 | 只看该作者
hoop 发表于 2021-5-31 17:57
PWR_BackupAccessCtrl——这个是有原型的哦;
BKP_TamperPinCmd——这个好像如你所说,我再去看看 ...

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

使用特权

评论回复
7
hoop|  楼主 | 2021-6-1 09:04 | 只看该作者
tuzheng 发表于 2021-5-31 19:49
你说的函数原型是指函数声明吧?这个是有的,但函数定义没有,无法调用这两个函数 ...

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

使用特权

评论回复
8
tuzheng| | 2021-6-1 14:23 | 只看该作者
hoop 发表于 2021-6-1 09:04
有再去搜了一边,确认这两个函数都有定义,在其对应的.c里面。你搜不到是不是因为没有添加对应的.c文件? ...

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

使用特权

评论回复
9
单片小菜| | 2021-6-1 19:19 | 只看该作者
我忘记是什么指令了,可以直接的屏蔽掉。

使用特权

评论回复
10
sky8023| | 2021-9-3 15:37 | 只看该作者

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

使用特权

评论回复
11
勇敢的大白菜| | 2021-9-3 17:43 | 只看该作者
这个写的特别好。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

80

主题

322

帖子

0

粉丝