實驗目的
點燈是練習GPIO輸出的最佳實驗。由於疫情期間沒法返校,手頭上沒有現成的實驗板,於是借助Proteus進行仿真。本實驗點的不是普通的燈,而是RGB混色燈,實現多種顏色的顯示。后期還可以加上PWM,實現全彩燈控制。
仿真電路
電路非常簡單,采用的LED型號是RGBLED-CA,這是一個共陽的RGB燈。我們需要關注燈的兩個參數:正向壓降和正向電流。三盞燈的正向電流都是20mA,紅燈的壓降是1.8V,另外兩盞燈是3.2V,由此可以很容易計算出合適的電阻值。
為了程序的方便,我把三盞燈依次接到了PB8、PB9、PB10三個端口。整個仿真電路如下,在仿真過程中,燈的顏色看起來不是很鮮艷明亮,主要是引腳低電平輸出時,電壓並非是0V。
核心程序
程序主要的步驟無非是:
1、配置GPIOB的時鍾使能;
2、配置GPIO引腳工作在推免輸出的模式;
3、依次改變引腳輸出電平的組合;
因為這實驗會有很多重復的代碼,所以編寫時最好多寫些宏定義,讓程序更美觀。
#include "stm32f10x.h" // 初始化宏定義 #define RED_GPIO_PORT GPIOB #define RED_GPIO_CLK RCC_APB2Periph_GPIOB #define RED_GPIO_PIN GPIO_Pin_8 #define GREEN_GPIO_PORT GPIOB #define GREEN_GPIO_CLK RCC_APB2Periph_GPIOB #define GREEN_GPIO_PIN GPIO_Pin_9 #define BLUE_GPIO_PORT GPIOB #define BLUE_GPIO_CLK RCC_APB2Periph_GPIOB #define BLUE_GPIO_PIN GPIO_Pin_10 // LED開關宏定義 #define RED_ON GPIO_ResetBits(RED_GPIO_PORT, RED_GPIO_PIN); #define RED_OFF GPIO_SetBits(RED_GPIO_PORT, RED_GPIO_PIN); #define GREEN_ON GPIO_ResetBits(GREEN_GPIO_PORT, GREEN_GPIO_PIN); #define GREEN_OFF GPIO_SetBits(GREEN_GPIO_PORT, GREEN_GPIO_PIN); #define BLUE_ON GPIO_ResetBits(BLUE_GPIO_PORT, BLUE_GPIO_PIN); #define BLUE_OFF GPIO_SetBits(BLUE_GPIO_PORT, BLUE_GPIO_PIN); //混色宏定義 // 紅 #define LED_RED {RED_ON; GREEN_OFF; BLUE_OFF;} // 綠 #define LED_GREEN {RED_OFF; GREEN_ON; BLUE_OFF;} // 藍 #define LED_BLUE {RED_OFF; GREEN_OFF; BLUE_ON;} // 黃=紅+綠 #define LED_YELLOW {RED_ON; GREEN_ON; BLUE_OFF;} // 紫=紅+藍 #define LED_PURPLE {RED_ON; GREEN_OFF; BLUE_ON;} // 青=綠+藍 #define LED_CYAN {RED_OFF; GREEN_ON; BLUE_ON;} // 白=紅+綠+藍 #define LED_WHITE {RED_ON; GREEN_ON; BLUE_ON;} // 黑=全部關閉 #define LED_BLACK {RED_OFF; GREEN_OFF; BLUE_OFF;} // 延時 void Delay(uint16_t time) { uint16_t i,j; for (i=0;i<time;i++) for (j=0;j<1000;j++); } void LED_GPIO_Config() { //GPIO時鍾使能 RCC_APB2PeriphClockCmd( RED_GPIO_CLK | GREEN_GPIO_CLK | BLUE_GPIO_CLK, ENABLE); GPIO_InitTypeDef GPIO_InitStruct; //初始化紅色GPIO GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStruct.GPIO_Pin = RED_GPIO_PIN; GPIO_Init(RED_GPIO_PORT, &GPIO_InitStruct); //初始化綠色GPIO GPIO_InitStruct.GPIO_Pin = GREEN_GPIO_PIN; GPIO_Init(GREEN_GPIO_PORT, &GPIO_InitStruct); //初始化藍色GPIO GPIO_InitStruct.GPIO_Pin = BLUE_GPIO_PIN; GPIO_Init(BLUE_GPIO_PORT, &GPIO_InitStruct); // 關閉所有LED LED_BLACK; } int main() { LED_GPIO_Config(); while(1){ LED_RED; Delay(3000); LED_GREEN; Delay(3000); LED_BLUE; Delay(3000); LED_YELLOW; Delay(3000); LED_PURPLE; Delay(3000); LED_CYAN; Delay(3000); LED_WHITE; Delay(3000); LED_BLACK; Delay(3000); } }