点灯是练习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); } }