 |
【電路】

|
 |
【程序】 #include "stm32f10x.h" #define _BV(n) (1 << (n)) #define K1 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) // 延時函數 void delay() { uint32_t i; for (i = 0; i < 20000; i++); } int main(void) { GPIO_InitTypeDef init; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 開啟PB時鐘 // PB8~15為輸出 init.GPIO_Pin = 0xff00; init.GPIO_Speed = GPIO_Speed_50MHz; init.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_Init(GPIOB, &init); // PB0~7為輸入 init.GPIO_Pin = 0x00ff; init.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOB, &init); while (1) { // 當按鍵1按下時 if (!K1) { delay(); if (!K1) { GPIOB->ODR ^= _BV(8); // 反轉負載所在引腳的電平 while (!K1); } } } }
|
 |
【說明】 只需要將I/O口的輸出模式設為GPIO_Mode_Out_OD(開漏輸出),輸出的電平就能控制PNP三極體的導通狀態。三極體的基極上只需要接200Ω的電阻。 如果把上面程序中的輸出模式改為GPIO_Mode_Out_PP(推輓輸出)的話,那麼無論怎麼按K1鍵,都無法改變三極體的導通狀態,所以LED燈始終都是亮著的。
|
 |
如果負載不是通過PNP三極體的基極控制,而是直接接在了單片機的I/O口上的話,那麼輸出模式應該改回GPIO_Mode_Out_PP(推輓輸出)。 因為開漏引腳不連接外部的上拉電阻時,只能輸出低電平,如果需要同時具備輸出高電平的功能,則需要接上拉電阻。 例如:
 如果用開漏模式輸出的話,LED發光會非常暗。
|
 |
STM32中,普通I/O口只有兩種輸出模式:開漏和推挽。 
|
 |
【四種輸入模式】 GPIO_Mode_AIN 模擬輸入:用於輸入模擬信號 GPIO_Mode_IN_FLOATING 浮空輸入:引腳懸空時,讀取該埠的電平是不確定的 GPIO_Mode_IPD 下拉輸入:沒有輸入信號的時候默認輸入低電平 GPIO_Mode_IPU 上拉輸入:沒有輸入信號的時候默認輸入高電平
另外,對於兩種復用輸出模式,只對內置外設(比如串口之類的功能)有效,不能在普通I/O口上設置使用。
|
 |
因為普中開發板上的I/O口都接了上拉電阻,默認就是輸入高電平,不存在沒有輸入信號的情況,所以在程序中輸入模式可以隨便設置。
|