STM32F103_GPIO&AFIO_MYNOTE

本文详细介绍了STM32F103C8T6的GPIO配置、BOOT选项、JTAG与SW-DP调试接口的使用与禁用、GPIO-Speed的影响以及AFIO的复用功能。还探讨了GPIO的不同模式、上拉电阻的应用和库函数使用实例,包括GPIO_Init和GPIO_DeInit等。
摘要由CSDN通过智能技术生成

以STM32F103C8T6为例,参考《参考手册》《数据手册》《标准库函数手册》,个人学习笔记,供参考和指正。

·所有GPIO均可配置8种模式,在配置GPIO模式时参考《参考手册》的推荐配置 

·配置BOOT的状态选择启动方式,内嵌的自举程序存放在系统存储区,STM32F10xxx自举程序支持的外设仅UART1

·开漏输出模式若想要输出高电平必须接外部上拉电阻

·JTAG调试接口是默认的调试接口

·JTAG是一种基于边界扫描的调试技术,JTAG-DP比SW-DP强,但是SW-DP操作简单

1)关于GPIO的一些基本知识

2)将室友的SW和JTAG调试端口禁用,让他发狂

3)不小心把SW和JTAG调试端口禁用了怎么办?

4)如果系统频率不能满足GPIO_Speed会怎样?

5)GPIO库函数解释

6)VCC端口不够用,对VCC端口的扩展

·结尾附引脚定义表,引脚分布图


1)关于GPIO的一些基本知识

ce9f21276219248227a755f4eaccdef4.png

f18043e09af48a79c24d94de8234f6a1.png·所有GPIO端口位均可配置8种模式(4种输入模式,4中输出模式),在配置模式时,对特定功能如TIM1/8_CHx引脚配置参考手册的推荐配置。

·GPIO复位后的状态(参考手册106业)

复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式(CNFx[1:0]=01b, MODEx[1:0]=00b),JTAG引脚被置于输入上拉或下拉模式(详情见手册); 

1.1输入模式。 1.1.1保护二极管(二极管的单向导通特性,理想二极管的施加正向电压电阻为0,施加反向电阻电阻无穷大,电压信号通过I/O流入,如果输入信号大于VDD,信号会直接通过保护二极管从VDD流出;如果信号小于VSS,下方的保护二极管导通,保护二极管利用了二极管的单向导通将过高和过低的电压拦截掉);  1.1.2施密特触发器(施密特触发器通常用于数字信号的处理,它有两个稳定状态(高电平状态和低电平状态),并且具有阈值电压。当输入信号超过或低于这些阈值电压时,触发器的输出状态会发生变化。这种特性使得施密特触发器能够消除输入信号中的噪声,并提供更稳定的数字输出);  1.1.3模拟输入模式(模拟信号是连续变化的,不能直接通过施密特触发器,如果需要通过施密特触发器处理模拟信号,通常需要先将其转换为数字信号,然后再进行逻辑电平转换,模拟输入模式常用于ADC); 1.1.4浮空输入模式(无信号输入时引脚电平状态不确定); 1.1.5上拉输入模式(通常用于确保当没有有效信号输入时,引脚处于一个确定的电平状态,即高电平状态); 1.1.6下拉输入模式(通常用于确保当没有有效信号输入时,引脚处于一个确定的电平状态,即低电平状态);

1.2输出模式。1.2.1三极管和mos管的区别(三极管为电流控制器件,便宜耐高压大电流;MOS管为电压控制器件,静态电流小,导通阻抗低mos管功耗低);1.2.2P-MOS和N-MOS(NMOS的栅极高电平(VGS > Vt)时导通,低电平断开,适合用于与地之间的导通。而PMOS则是栅极低电平(VGS < Vt)时导通,高电平断开,适合用于与电源之间的导通); 1.2.3推挽输出模式(驱动能力强;输出高电平时,PMOS导通,NMOS截止;输出低电平时PMOS截止,NMOS导通) 1.2.4开漏输出模式(PMOS始终为截止,施加负电压NMOS导通时输出低电,NMOS截止时输出呈高阻态,) 1.2.5复用推挽输出模式(与1.2.3相同,但输出由片上外设控制)  1.2.6复用开漏输出模式(与1.2.4相同,但输出由片上外设控制)

1.3开漏输出

1.3.1在开漏输出模式下,设备只能将输出端口连接到地(GND)或者不连接,而不能主动输出高电平。当设备需要输出高电平时,它会将输出端口置于高阻抗状态,也就是不连接到电源电压,从而允许外部电路通过上拉电阻将电平拉到高电平。开漏输出模式下,引脚本身并不直接输出高电平,而是需要依赖外部的上拉电阻来实现高电平输出。所以,开漏输出时引脚不是必须接高电平。事实上,开漏输出的特性使得多个设备可以共享同一信号线,通过拉低线来表示逻辑1,或者不拉低线表示逻辑0。这种输出模式在多设备共享同一信号线的情况下非常有用,尤其适用于一线双向通信总线,如I2C(Inter-Integrated Circuit)和One-Wire总线。

1.3.2开漏输出,外部接上拉电阻,上拉电阻上的电压不会涌入IO?当IO口输出低电平时,IO与NMOS的VSS相连。这意味着IO口和地之间形成了一个低阻抗通路,使得电流能够轻松地从IO口流向地。而上拉电阻这条路对这条路来说呈高阻抗。


2)AFIO怎么将你室友的SW和JTAG调试端口禁用,让他发狂

2.1SW-DP和JTAG-DP在STM32F103xx参考手册的第734业详细的讲解了SW-DP和JTAG-DP;STM32F10xxx内核集成了串行/JTAG调试接口(SWJ-DP)。这是标准的ARM CoreSight调试接口,包括JTAG-DP接口(5个引脚)和SW-DP接口(2个引脚)。JTAG是一种基于边界扫描的调试技术,JTAG调试接口是默认的调试接口,JTAG-DP比SW-DP强,但是SW-DP操作简单

2.2在kile的debug界面选择调试器,点击右旁的setting,可以选择使用SW或JTAG,不用在程序代码中进行配置,非常方便,选择SW或JTAG时确保硬件之间正确连接

4ef75f0f2c25d8fc976a7f394da182ff.png

/*外设时钟使能,AFIO*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
/*关闭SWD,JTAG调试功能后,为普通GPIO*/
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);

 2.3AFIO

复用 != 重映射 ,复用指一个引脚同时具有多个功能,重映射指将一个引脚的功能映射到另一个引脚上。

2.3.1为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些 脚上。这可以通过软件配置相应的寄存器来完成(参考AFIO寄存器描述)。这时,复用功能就不再映射到它们的原始引脚上了,即映射后原来的引脚不在具有默认的对应复用功能。复用功能重映射时如果目标引脚没有重定义功能则不能重映射;

2.3.2一个IO本身具有多个复用功能,但在同一时间,它只能用作一种复用功能,否则会发生冲突。这是因为微控制器在设计时,为了确保IO引脚的稳定性和可靠性,不允许一个引脚在同一时间执行多个功能。每个时刻,引脚只能以一种特定的模式工作,无论是作为普通的IO口,还是作为某个外设的接口。

2.3.3在进行复用功能重映射时,如果目标IO的默认IO的主功能不是IO,比如目标IO的主功能是JTDI若要将PA0的TIM2_CH1_ETR映射到PA15,先要将JTDI功能关闭。


3)不小心把SW-DP,JTAG-DP调试端口给禁用了怎么办?

使用UART1通过内部自举程序启用SW-DP和JTAG-DP。内嵌的自举程序存放在系统存储区,由ST在生产线上写入,用于通过可用的串行接口对闪存存 储器进行重新编程: ● 对于小容量、中容量和大容量的产品而言,可以通过USART1接口启用自举程序。进一步的细节请查询AN2606文档。

在AN2006文档中描述到:STM32F10xxx自举程序支持的外设仅UART1

df2c01dd9a220bcfac40eb843b63d163.png

df8e9b8e205545a7e6e5b8a5ffc9a384.png

配置启动模式,选择启动模式为系统存储器,从而启用自举模式1 》通过UART1(STM32F103C8T6的UART-TX-PA9,UART-RX-PA10)烧录hex文件重新启用SW-D和JTAG-DP,需要使用STM32串口下载助手,代码如下: 

/*外设时钟使能,AFIO*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
/*启用SWD,JTAG调试功能*/
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,DISABLE);

4)如果系统频率不能达到GPIO设定的频率会怎样?

/*最小系统仿真,草稿,草稿,草稿,草稿,草稿,购买示波器中*/


5)库函数应用例子

4be12d03cb04a7066620598f1b8f1002.png

5.1GPIO_SetBits与GPIO_ResetBits与GPIO_WriteBit与GPIO_Write

/***参考手册113业端口配置低寄存器(GPIOx_CRL)、端口配置高寄存器(GPIOx_CRH)、端口输入数据寄存器(GPIOx_IDR)、端口输出数据寄存器(GPIOx_ODR)、端口位设置/清除寄存器(GPIOx_BSRR)、端口位清除寄存器(GPIOx_BRR)、端口配置锁定寄存器(GPIOx_LCKR)***/

·简单来说GPIOx_ODR寄存器是对整个端口如PA口设置16位的数据0和1都有效;     GPIOx_BSRR寄存器可以可以分别地对各个ODR位进行独立的设置/清除,ODR的高16位0无影响1清零,低16位0无影响1置1,但是如果同时设置了BSy和BRy的对应位,BRy位不起作用(如设置第0位为1则第16位不起作用);  GPIOx_BRR只能清除端口位;

·GPIO_SetBit 操作的是BSRR;GPIO_ResetBits操作的是BRR;GPIO_WriteBit操作的是BSRR或BRR(设置高电平的时候操作的是BSRR,低电平操作BRR);GPIO_Writ操作的是ODR;

·端口输出数据寄存器ODR可读可写,端口位设置/清除寄存器BSRR与端口位清除寄存器BRR只可写; 端口位设置/清除寄存器GPIOx_BSRR的高16位和GPIOx_BRR寄存器的低16位是共享同一个地址,我想通过BSRR将PA0的高电平改为低电平时,将不能通过BSRR更改,只能通过BRR进行位更改。

5.1.1为什么有了ODR还要弄个BSRR和BRR?

GPIOX->ODR = 0XFF :GPIOx(0-7)被设置高电平, GPIOx(8-15)被设置低电平;

GPIOX->BSRR=0X01:GPIO0被设置高电平,其他位无影响;

GPIOX->BRR=0X01:GPIO0被设置低电平,其他位无影响;

5.1.2为什么要让BSRR和BRR的地址部分重复?
GPIOx_BSRR和GPIOx_BRR有一部分地址重复,这是出于硬件设计和寄存器功能分配的考虑。这种设计使得STM32等微控制器可以通过单个寄存器地址来执行不同的操作,从而提高了操作的灵活性和效率。

5.2GPIO_PinLockConfig

锁定机制允许冻结IO配置。当在一个端口位上执行了锁定(LOCK)程序,在下一次复位之前,将不能再更改端口位的配置。

端口配置低寄存器(GPIOx_CRL)用于端口0-7的端口配置(包括输入输出模式及速度);

端口配置高寄存器(GPIOx_CRH)用于端口8-15的端口配置(包括输入输出模式及速度);

GPIO_PinLockConfig函数操作的是端口配置锁定寄存器(GPIOx_LCKR),每个锁定位锁定控制寄存器(CRL, CRH)中相应的4个位;   GPIO_PinLockConfig锁定的是端口配置(包括输入输出模式及速度)并不会锁定端口的电平状态,所以在使用该函数对端口位进行锁定后,仍能修改端口的电平状态,但不能修改端口配置;

5.3GPIO_StructInit

此函数用于把 GPIO_InitStruct 中的每一个参数按缺省值填入,将所有的GPIO口都设置成一个确定的状态——2MHZ浮空输入,该函数应该在GPIO_Init之前被调用

GPIO_InitTypeDef  GPIO_Initstructure;
GPIO_StructInit(&GPIO_Initstructure);
GPIO_Initstructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Initstructure.GPIO_Pin = GPIO_Pin_13;
GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;	
GPIO_Init(GPIOC,&GPIO_Initstructure); 

5.4GPIO_Init根据 GPIO_InitStruct 中指定的参数初始化外设 GPIOx 寄存器,用于选择端口位和配置端口模式和速度;

GPIO_InitTypeDef  GPIO_Initstructure;
GPIO_Initstructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Initstructure.GPIO_Pin = GPIO_Pin_13;
GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;	
GPIO_Init(GPIOC,&GPIO_Initstructure); 

5.5GPIO_DeInit,可以理解为将整个Px端口复位,将外设 GPIOx 寄存器重设为缺省值GPIO_DeInit函数是用于将GPIO相关的寄存器配置成上电复位后的默认状态。在第一次初始化前或者不再使用某一接口后,可以调用该函数。它通过将函数的时钟关闭,使对应的GPIO寄存器不工作,从而达到初始化的效果。GPIO_DeInit并不会复位IO的电平状态,但是使用该函数复位后端口模式为浮空输入,浮空输入极易受外部电路影响(比如外部3.3V上拉电阻会将IO拉至高电平);


6)VCC端口不够用,对VCC端口的扩展

/*草稿草稿草稿草稿草稿*/




cc592f59ff1daf42e58ebe854ac298d5.png

下图来源于Bilibili江协科技

 97e05e6c0f69c52f983605485c2f8008.png

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值