點燈是練習GPIO輸出的最佳實驗。因爲疫情期間無法返校,手頭上沒有現成的實驗板,因而藉助Proteus進行仿真。本實驗點的不是普通的燈,而是RGB混色燈,實現多種顏色的顯示。後期還能夠加上PWM,實現全綵燈控制。ui
電路很是簡單,採用的LED型號是RGBLED-CA,這是一個共陽的RGB燈。咱們須要關注燈的兩個參數:正向壓降和正向電流。三盞燈的正向電流都是20mA,紅燈的壓降是1.8V,另外兩盞燈是3.2V,由此能夠很容易計算出合適的電阻值。spa
爲了程序的方便,我把三盞燈依次接到了PB八、PB九、PB10三個端口。整個仿真電路以下,在仿真過程當中,燈的顏色看起來不是很鮮豔明亮,主要是引腳低電平輸出時,電壓並不是是0V。code
程序主要的步驟無非是:blog
一、配置GPIOB的時鐘使能;ip
二、配置GPIO引腳工做在推免輸出的模式;it
三、依次改變引腳輸出電平的組合;class
由於這實驗會有不少重複的代碼,因此編寫時最好多寫些宏定義,讓程序更美觀。配置
#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); } }