一、引脚配置是否设置速度的问题
二、速度设置多大的问题
三、引脚配置过程中的注意事项(误区)
一、引脚配置是否设置速度的问题
查看数据手册可以知道
STM32的引脚速度配置并不是独立是,他是与输出绑定的
推理过程:
①引脚配置为通用输出时,一定要配置速度(经测试:不配置速度,则引脚被错误的配置成了模拟或者浮空输入,输出操作时无效)
②引脚配置为复用输出时:一定要配置速度(不配置速度,则引脚被错误的配置成上拉或者下拉输入,输出操作【没测试】
)
猜想一下:(等待验证)
如果这个复用功能引脚配置,不涉及到高阻态输出,则不配置速度也可以正常使用(虽然被错误的配置成了上拉或者下拉输入);
如果
这个复用功能引脚配置
,设计到了高阻态输出,一定要配置速度(也就是正确配置)
③引脚配置为输入时:对于模拟或者浮空来说(配置速度也会被屏蔽),对于上拉或者下拉(配置速度后引脚会被配置成推挽复用输出,(在库函数中上拉输入会被错误的配置成推挽输出1,下拉输入会被错误的配置成推挽输出0)现象正常,输入操作也可以正常使用),所以输入配置速度表面看没有什么影响,但是这是一个程序bug(因为一个引脚只可能被用作一个功能,即使被错误是配置成了复用输出,当做普通功能时,复用功能也就不能被使用了,我们程序上也不会去操作这个复用功能了;从库函数上看输入配置速度也是无关紧要【可能与IO口的硬件电路有关】,仅仅是在模拟或者浮空输入时,屏蔽了速度,上拉与下拉并没有屏蔽速度,而是去配置了相关的输出寄存器输出为1或者是0
【由此我猜想:所谓上拉与下拉只是配置推挽输出输出1或者是0】等待验证,看IO口的电流输入输出能力)。
所以:我的猜想
【由此我猜想:所谓上拉与下拉只是配置推挽输出输出1或者是0】
是错的
重新整理一下输入:
①引脚配置成模拟或者浮空输入,速度配置被屏蔽(库函数屏蔽),无论是否配置速度都可以正确配置
②引脚配置成上拉或者下拉输入,速度配置没有屏蔽,如果配置速度,引脚会被错误的配置成复用推挽输出(此时库函数会把上拉输入设置成复用推挽输出1,下拉输入设置成复用推挽输出0)单纯的测量引脚时(不接外围电路),现象是正确的(读输入数据寄存器也是正确的),但是引脚的特性发生了改变,上拉或者下拉电阻没有了只留下了NMOS或者PMOS(这个不是我们想要的)
重新整理一下输出:
①引脚配置成通用推挽输出,如果没有配置速度,引脚被错误的配置成了模拟输入【输出无效】
②引脚配置成通用开漏输出,如果没有配置速度,引脚被错误的配置成了浮空输入【输出无效】
③引脚配置成复用推挽输出,如果没有配置速度,引脚被错误的配置成了上拉或者下拉输入【看输出数据寄存器】
④引脚配置成复用开漏输出,如果没有配置速度,引脚配置无效【未知】
引脚默认配置:浮空输入
总结:引脚配置为输出一定要配置速度,引脚配置为输入时,不要配置速度。
注意:一个引脚只能用作一个功能(虽然可以有多个复用功能),在使用时要注意引脚冲突。
二、速度设置多大的问题
参考:
https://wenku.baidu.com/view/c6094a0c168884868762d683.html
三、引脚配置过程中的注意事项(误区)
下面贴出一个具体的例子:
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*PA.0-5 :ADCÄ£ÄâÊäÈë*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* PA.6 PA.7 :TIM3 Ch1,2,Output */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* PB.0 PB.1 TIM3 CH3,4 Output */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/*Ten½ÅÅäÖÃΪÍÆÍìÊä³ö*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
///Configure USART1 Tx (PA.09) as alternate function push-pull //
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/// Configure USART1 Rx (PA.10) as input floating //
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//ÅäÖÃIIC½Ó¿Ú£¬PB10,PB11 ¿ªÂ©Êä³ö£¬Ë«ÏòIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure PD.2 as OC LED²âÊÔ½Å*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure Pb.5 .6 as sw1 sw2*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// //½«JTAG¹Ü½ÌÅäÖÃΪÊä³ö£¬·ÀÖ¹ÒýÈë¸ÉÈÅ£¡
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
// GPIO_Init(GPIOA, &GPIO_InitStructure);
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
// GPIO_Init(GPIOB, &GPIO_InitStructure);
}
上述配置中大多数输出引脚的配置都没有配置速度,为什么也可以正常使用?
这是因为在开头(红色标注的代码),设置模拟输入时设置了速度(输入是不需要设置速度的),
而下面的输出配置引脚时一直用到了这个速度配置(速度配置没有被清除,在同一个函数中,这个结构体一直存在)
这可真是他妈的阴差阳错呀