STM32F10x GPIO -3
在 STM32F10x GPIO -1中我曾貼上一張圖(如下圖)來說明灌電和拉電流的差異。而在STM32中如何利用GPIO的功能來點亮一個LED呢‧?
PB0 在電路上的設計如下圖一。
圖一
PB1在電路上的設計如下圖二。
圖二
而這兩在程式上的應用就有所差異了,
在PB0 這種有外在 Vcc提供電壓的電路,要點亮LED要用 GPIO_ResetBits,
/* Turn on LED. */
GPIO_ResetBits(GPIO_LED, GPIO_Pin_6); Set Low
/* Turn off LED */
GPIO_SetBits(GPIO_LED, GPIO_Pin_6); Set High
這種電路適合一開始就打算點亮LED的設計,而這往往不是我們想要的設計,因為在使用電池的手持裝置是耗電的,除非是打算讓LED的亮度十分明亮,否則不是很建設使用。
在PB0 這種沒有外在 Vcc提供電壓的電路,要點亮LED要用 GPIO_SetBits,
PB0 在電路上的設計如下圖一。
圖一
PB1在電路上的設計如下圖二。
圖二
其實這兩種電路在GPIO的初始化都是一樣的,如下列所示:
•RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_LED,
ENABLE);
•
GPIO_InitStructure.GPIO_Pin =
GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
• GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
• GPIO_InitStructure.GPIO_Speed =
GPIO_Speed_50MHz;
• GPIO_Init(GPIOF,
&GPIO_InitStructure);
而這兩在程式上的應用就有所差異了,
在PB0 這種有外在 Vcc提供電壓的電路,要點亮LED要用 GPIO_ResetBits,
/* Turn on LED. */
GPIO_ResetBits(GPIO_LED, GPIO_Pin_6); Set Low
/* Turn off LED */
GPIO_SetBits(GPIO_LED, GPIO_Pin_6); Set High
這種電路適合一開始就打算點亮LED的設計,而這往往不是我們想要的設計,因為在使用電池的手持裝置是耗電的,除非是打算讓LED的亮度十分明亮,否則不是很建設使用。
/* Turn on LED */
GPIO_SetBits(GPIO_LED, GPIO_Pin_6); Set High
/* Turn off LED */
GPIO_ResetBits(GPIO_LED, GPIO_Pin_6); Set Low
這種電路適合一有特定時機點亮LED的設計,這種電路是比較不耗電的,但相對的LED的亮度不會很明亮。
其實點亮一個LED也可以用 通用開漏輸出模式 GPIO_Mode_Out_OD來設計,如果你要使用高電位(PB1模式)點亮發光二極體,就需要把引腳設置為推輓輸出,以增大電流輸出能力,如果你設置為開漏輸出,發光二極體肯定是點不亮了。但是如果你使用低電位(PB0模式)點亮發光二極體,那麼設置為開漏和推輓輸出都可以正常點亮發光二極體。
這些說明可能會比較抽象,需要配合實際電路及程式的設定才可深入理解。
留言
張貼留言