 |
【示例程序】 #include "stm32f4xx.h"
// 初始化IO口 void port_init() { GPIO_InitTypeDef init; init.GPIO_Mode = GPIO_Mode_OUT; // 輸出模式 init.GPIO_OType = GPIO_OType_PP; // 輸出類型: 推輓輸出 init.GPIO_PuPd = GPIO_PuPd_UP; // 上拉模式 init.GPIO_Speed = GPIO_Speed_2MHz; // 速率 // 啟用PD和PH埠 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOH, ENABLE); // 初始化PH10 init.GPIO_Pin = GPIO_Pin_10; GPIO_Init(GPIOH, &init); // 初始化PH11, PH12, PD11 init.GPIO_Pin = GPIO_Pin_11; GPIO_Init(GPIOH, &init); init.GPIO_Pin = GPIO_Pin_12; GPIO_Init(GPIOH, &init); init.GPIO_Pin = GPIO_Pin_11; GPIO_Init(GPIOD, &init); }
// 關閉所有燈 void close_all() { GPIOH->BSRRL = GPIO_Pin_10; // 將PH10設為高電平 GPIOH->BSRRL = GPIO_Pin_11; // 將PH11設為高電平 GPIOH->BSRRL = GPIO_Pin_12; GPIOD->BSRRL = GPIO_Pin_11; // 將PD11設為高電平 }
// 延遲一段時間 void delay() { int i, j; for (i = 0; i < 9999; i++) for (j = 0; j < 999; j++); }
int main(void) { port_init(); close_all(); while (1) { GPIOD->BSRRH = GPIO_Pin_11; // 將PD11設為低電平,點亮此燈 delay(); GPIOD->BSRRL = GPIO_Pin_11; // 將PD11設為高電平,熄滅此燈 delay(); } }
|
 |
可以採用宏定義的方法更加方便地操作LED: #define LED4_ON (GPIOD->BSRRH = GPIO_Pin_11) #define LED4_OFF (GPIOD->BSRRL = GPIO_Pin_11)
int main(void) { port_init(); close_all(); while (1) { LED4_ON; delay(); LED4_OFF; delay(); } }
|
 |
【示例程序2:用按鍵控制LED的亮滅】 #include "stm32f4xx.h"
#define LED4_ON (GPIOD->BSRRH = GPIO_Pin_11) #define LED4_OFF (GPIOD->BSRRL = GPIO_Pin_11)
// 初始化IO口 void port_init() { GPIO_InitTypeDef init; // 啟用PA、PC和PD埠的時鐘 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD, ENABLE); // 初始化PD11 init.GPIO_Mode = GPIO_Mode_OUT; // 輸出模式 init.GPIO_OType = GPIO_OType_PP; // 輸出類型: 推輓輸出 init.GPIO_PuPd = GPIO_PuPd_UP; // 上拉模式 init.GPIO_Speed = GPIO_Speed_2MHz; // 速率 init.GPIO_Pin = GPIO_Pin_11; GPIO_Init(GPIOD, &init); // 初始化PA0, PC13 init.GPIO_Mode = GPIO_Mode_IN; // 輸入模式 init.GPIO_PuPd = GPIO_PuPd_NOPULL; // 既不上拉也不下拉 init.GPIO_Pin = GPIO_Pin_0; GPIO_Init(GPIOA, &init); init.GPIO_Pin = GPIO_Pin_13; GPIO_Init(GPIOC, &init); }
// 判斷鍵是否按下 int is_keydown(GPIO_TypeDef *port, uint16_t pin) { if (GPIO_ReadInputDataBit(port, pin) == 1) { while (GPIO_ReadInputDataBit(port, pin) == 1); return 1; } else return 0; }
int main(void) { port_init(); LED4_OFF; while (1) { // 當PA0鍵按下時 if (is_keydown(GPIOA, GPIO_Pin_0)) LED4_ON; // 當PC13鍵按下時 if (is_keydown(GPIOC, GPIO_Pin_13)) LED4_OFF; } }
|
 |
只用一個按鍵控制LED燈的亮滅。第一次按下時亮,再按一下就滅: int main(void) { port_init(); LED4_OFF; while (1) { if (is_keydown(GPIOA, GPIO_Pin_0)) GPIOD->ODR ^= GPIO_Pin_11; // 對PD11上的電平取反 } }
|
 |
說明:is_keydown函數裡的那個while語句用於等待按鍵釋放。
|
 |
【示例程序3:一次性初始化埠及設置埠】 #include "stm32f4xx.h"
// 下面的宏在AVR單片機中經常用到 #define BIT(n) (1 << (n)) #define _BV(n) BIT(n)
// 初始化IO口 void port_init() { GPIO_InitTypeDef init; // 啟用PH埠的時鐘 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH, ENABLE); // 初始化 init.GPIO_Mode = GPIO_Mode_OUT; // 輸出模式 init.GPIO_OType = GPIO_OType_PP; // 輸出類型: 推輓輸出 init.GPIO_PuPd = GPIO_PuPd_UP; // 上拉模式 init.GPIO_Speed = GPIO_Speed_2MHz; // 速率 init.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12; // 一次性把PH10~PH12全部初始化 GPIO_Init(GPIOH, &init); }
void delay() { int i, j; for (i = 0; i < 9999; i++) for (j = 0; j < 2999; j++); }
int main(void) { port_init(); while (1) { GPIO_Write(GPIOH, 0xffff); // 一次性將PH的所有埠都設為高電平 delay(); GPIO_Write(GPIOH, ~BIT(11)); // 只點亮PH11上的燈 delay(); GPIO_Write(GPIOH, ~BIT(10)); // 只點亮PH10上的燈 delay(); GPIO_Write(GPIOH, ~BIT(10) & ~BIT(11)); // 同時點亮PH10和PH11 delay(); GPIO_Write(GPIOH, ~BIT(10) & ~BIT(11) & ~BIT(12)); // 同時點亮三個燈 delay(); } }
|
 |
// 熄滅第二個燈, 其餘燈的狀態保持不變 value = GPIO_ReadOutputData(GPIOH); value |= BIT(11); GPIO_Write(GPIOH, value);
|
 |
// 熄滅第二個燈, 其餘燈的狀態保持不變 value = GPIO_ReadOutputData(GPIOH); value |= BIT(11); GPIO_Write(GPIO...
變量value的定義:uint16_t value;
|