0、反省
不想只是略懂的状态,F4的开发板我有一块,上面的资源我用过简单的而已,而且用过也只是停留在表面,时间稍稍一走,记忆面目全非。反正视频也有,例程也有,到处都是资料,为什么不好好学一下呢?
1、代码
很简单,就是控制LED的亮灭。
不过对比了一下不同配置的效果,分别是“推挽输出”、“开漏上拉”,“开漏下拉”。
//初始化LED
void LED_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE); //使能GPIO时钟
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10; //F9、10,推挽输出
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽
// GPIO_InitStruct.GPIO_OType = GPIO_OType_OD; //开漏
// GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉
// GPIO_InitStruct.GPIO_OType = GPIO_OType_OD; //开漏
// GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //50MHz
GPIO_Init(GPIOF,&GPIO_InitStruct);
GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10); //默认不点亮
}
int main(void)
{
delay_init(168); //时钟168MHz
LED_Init(); //LED初始化
while(1){
GPIO_SetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10); //不亮
delay_ms(500);
GPIO_ResetBits(GPIOF,GPIO_Pin_9|GPIO_Pin_10); //亮,低电平点亮
delay_ms(500);
}
}
1.1、推挽输出
正常。
1.2、开漏上拉
正常。
1.3 、开漏下拉
现象:LED可以正常亮,但是灭的时候,会不能完全灭掉。
对于开漏输出,输出0是没问题的,输出1的时候,会受上下拉电阻影响。
所以当开漏上拉的时候,输出0,灯亮;输出1,由于是上拉,为高电平灯灭也正常。
当开漏下拉的时候,输出0,灯亮;输出1,由于是下拉了,不是真正的高电平,就不正常了。
以下表格为万用表实测数据,可以看出推挽和开漏上拉是差不多的,开漏下拉IO口是1.62伏,3.3V - 1.62V = 1.68V,大于1.577V(LED压降) ,所以是可以导通的,LED会微微亮。
IO口配置 | 输出高电平电压 |
---|---|
推挽 | 3.28V |
开漏上拉 | 3.27V |
开漏下拉 | 1.62V |