本文以STM32中點亮LED為例,解讀推挽輸出的原理
推挽輸出介紹
所謂的推挽輸出,就是通過控制輸出控制模塊,打開或者關閉P-MOS或者N-MOS。
─ 推挽模式下:輸出寄存器上的’0’激活N-MOS,而輸出寄存器上的’1’將激活P-MOS。
當P-MOS被打開,N-MOS被關閉時,輸出端整體呈現灌電流模式,可以理解為此時的輸出端口為GND負極。
當P-MOS被關閉,N-MOS打開時,輸出端口保持一個Vdd的高電平狀態,可用于對外部的負載供電。
推挽輸出和開漏輸出的區別
─ 開漏模式:輸出寄存器上的’0’激活N-MOS,而輸出寄存器上的’1’將端口置于高阻狀態(P-MOS從不被激活)。
─ 推挽模式:輸出寄存器上的’0’激活N-MOS,而輸出寄存器上的’1’將激活P-MOS。
可以看到從輸出狀態上,開漏輸出模式只能輸出低電平和高阻態,若需輸出高電平必須通過外部上拉電阻實現。
而推挽輸出不需要外接上拉電阻,既可以輸出高電平又可以輸出低電平。
推挽輸出實例
硬件配置
MCU:STM32F103C8T6
LED
硬件接口
MCU:GPIOA1以推挽形式為LED進行供電
軟件思路
1.打開GPIOA所在的時鐘線
2.配置GPIOA為推挽輸出
3.Site/Resite GPIO口的Pin狀態
#代碼實現
#include "stm32f10x.h" // Device header
int main(void)
{//Enable GPIOA Clock BusRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//Init GPIO configeGPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_ResetBits(GPIOA, GPIO_Pin_1);while (1){}
}