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