STM32学习中遇到的一些问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
开漏输出就是不输出电压,低电平时接地,高电平时不接地。
如果外接上拉电阻,则在输出高电平时电压会拉到上拉电阻的电源电压。
这种方式适合在连接的外设电压比单片机电压低的时候。
浮空,顾名思义,就相当与此端口在默认情况下什么都不接,呈高阻态,这种设置在数据传输时用的比较多,譬如,你之后学习的I2C实验.
1 STM32的输入输出管脚有下面8种可能的配置:(4输入+2输出+2复用输出)
①浮空输入_IN_FLOATING
②带上拉输入_IPU
③带下拉输入_IPD
④模拟输入_AIN
⑤开漏输出_OUT_OD
⑥推挽输出_OUT_PP
⑦复用功能的推挽输出_AF_PP
⑧复用功能的开漏输出_AF_OD
1.1 I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这个速度是指I/O 口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在I/O 口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路)。
通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。
高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。
当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。
关键是GPIO的引脚速度跟应用匹配(推荐10倍以上?)。
比如:
1.1.1 对于串口,假如最大波特率只需115.2k,那么用2M的GPIO的引脚速度就够了,既省电也噪声小。
1.1.2 对于I2C接口,假如使用400k波特率,若想把余量留大些,那么用2M的GPIO的引脚速度或许不够,这时可以选用10M的GPIO引脚速度。
1.1.3 对于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引脚速度显然不够了,需要选用50M的GPIO的引脚速度。
1.2 GPIO口设为输入时,输出驱动电路与端口是断开,所以输出速度配置无意义。
1.3 在复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式。
1.4 所有端口都有外部中断能力。
为了使用外部中断线,端口必须配置成输入模式。
1.5 GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。
2 在STM32中如何配置片内外设使用的IO端口
首先,一个外设经过①配置输入的时钟和②初始化后即被激活(开启);③如果使用该外设的输入输出管脚,则需要配置相应的GPIO端口(否则该外设对应的输入输出管脚可以做普通GPIO管脚使用);④再对外设进行详细配置。
对应到外设的输入输出功能有下述三种情况:
一、外设对应的管脚为输出:需要根据外围电路的配置选择对应的管脚为复用功能的推挽输出或复用功能的开漏输出。
二、外设对应的管脚为输入:则根据外围电路的配置可以选择浮空输入、带上拉输入或带下拉输入。
三、ADC对应的管脚:配置管脚为模拟输入。
如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。
将管脚配置成复用输出功能后,如果外设没有被激活,那么它的输出将不确定。
高组态
通常数字电路能输出高电平及低电平,有些数字电路还能输出高阻态。
数字电路输出端对地之间有一个电子开关S1,对正电源(5V)之间也有一个电子开关S2。
S1闭合S2关断,输出端与地接通,就输出低电平;反之S2闭合S1关断,输出端与正电源接通,就输出高电平。
如果S2、S1都关断,输出端与集成电路内部断开,就是高阻态。
几块集成电路的输出端连在一起,某一块集成电路处于高阻态,就允许其他集成电路传输信息。
某集成电路处于高阻态,就像一辆车让路,可以防止撞车,使信息有序流通。
所以利用高阻态能组成总线,即信息高速公路。
关于Static变量
1. static全局变量与普通的全局变量有什么区别?
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。
这两者在存储方式上并无不同。
这两者的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。
由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
static全局变量只初使化一次,防止在其他文件单元中被引用;
2. static局部变量和普通局部变量有什么区别?
把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。
把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
static局部变量只被初始化一次,下一次依据上一次结果值;
3. static函数与普通函数有什么区别?
static函数与普通函数作用域不同,仅在本文件。
只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件中说明和定义。
对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.
static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。