小白stm32学习笔记——rgb三色灯点亮

一、先点亮单色灯

博主这里使用的是stm32f103系列的开发板,rgb灯与stm32主板连接的原理图如下:

 由上图可以看出来博主的rgb灯,红色连接的PB5引脚,绿色连接的是PB0引脚,蓝色连接的是PB1引脚,由于另一端是3.3v的电源端,所以由原理图可以知道引脚为低电平时候灯泡点亮。

1.点亮一个LED灯

首先先点亮一个单色灯,建立工程之后我需要在user里面建立文件分别是main.c和led.c和led.h。(1)、先在led.h里面定义引脚。

#ifndef __LED_H
#define __LED_H
 
#include "stm32f10x.h"   //引用库函数
 
 
#define LED_G_GPIO_PIN    GPIO_Pin_0                     //编号为0的引脚定义为LED_G_GPIO_PIN
#define LED_G_GPIO_PORT   GPIOB                          //GPIOB也就是PB口定义为 LED_G_GPIO_PORT    
#define LED_G_GPIO_CLK    RCC_APB2Periph_GPIOB           //GPIOB口的时钟定义为LED_G_GPIO_CLK
void LED_GPIO_Config(void);
#endif /*__LED_H*/

这里的 #ifndef __LED_H和#endif /*__LED_H*/是因为在c语言的语法中同一个函数或者变量不能被两次编译所以要用到#ifndef。

(2)、在led.c中定义引脚的模式和引脚的初始化。

#include "led.h"                             //载入引脚定义的库函数.
 
void LED_GPIO_Config(void){                      //引脚初始化的函数.
	GPIO_InitTypeDef GPIO_InitStruct;              //GPIO_InitTypeDef 是一个结构体类型,用于配置 STM32F103 系列芯片的 GPIO 端口。在上述代码中,GPIO_InitStruct 是一个变量,用于保存 GPIO 端口的配置信息。
	
	RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK,ENABLE); //GPIOB口的时钟称为使能状态
	
	GPIO_InitStruct.GPIO_Pin =  LED_G_GPIO_PIN;   //选择待设置引脚0
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;                               //模式设置为推挽输出
 	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;                              //输出速率为50mhz
	
	GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct);  //通过调用 GPIO_Init() 函数来将配置应用到相应的 GPIO 端口。
	
}

(3)、主函数main.c 。

int main(void) {
	//来到这里的时候,系统时钟已经被配置成72M
	LED_GPIO_Config();             //运行端口定义函数
	while(1){
		GPIO_ResetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN);  //让引脚PB0还原到低电平则为点亮led灯。
		delay(0XFFFFF);
		GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN);     //让引脚PB0拉到高电平则为熄灭led灯。
		delay(0XFFFFF);
	}
}

(4)、此时把程序下载到板子上运行程序则会点亮led绿灯,并且在延时函数下灯会闪烁。 

二、点亮rgb流水灯

(1)、在led.h中定义剩下两个端口

 

#ifndef __LED_H
#define __LED_H
 
#include "stm32f10x.h"   //引用库函数
 
 
#define LED_G_GPIO_PIN    GPIO_Pin_0                     //编号为0的引脚定义为LED_G_GPIO_PIN
#define LED_G_GPIO_PORT   GPIOB                          //GPIOB也就是PB口定义为 LED_G_GPIO_PORT    
#define LED_G_GPIO_CLK    RCC_APB2Periph_GPIOB           //GPIOB口的时钟定义为LED_G_GPIO_CLK 
 
#define LED_B_GPIO_PIN    GPIO_Pin_1                     //定义蓝灯引脚
#define LED_R_GPIO_PIN    GPIO_Pin_5                     //定义红灯引脚
 
#define     ON         1      //亮输出低电平
#define     OFF        0	  //灭输出高电平
 

 
#define LED_G(a)  if(a) \
						GPIO_ResetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN);\
						else GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN);
#define LED_R(a)  if(a)\
						GPIO_ResetBits(LED_G_GPIO_PORT, LED_R_GPIO_PIN);\
						else GPIO_SetBits(LED_G_GPIO_PORT,LED_R_GPIO_PIN);
#define LED_B(a)  if(a)\
						GPIO_ResetBits(LED_G_GPIO_PORT, LED_B_GPIO_PIN);\
						else GPIO_SetBits(LED_G_GPIO_PORT,LED_B_GPIO_PIN);
 
void LED_GPIO_Config(void);
void qc(void); 
 
#endif /*__LED_H*/

这里我直接想其他大神一样把点亮和熄灭灯的函数定义到了led函数中LED_G(OFF)代表绿灯灭, LED_G(ON)代表绿灯亮。后面的qc函数作用是三个灯都熄灭。因为我这个函数写在了led.c中所以这里需要加上void qc(void); 

(2)、 led.c的修改

#include "led.h"                             //载入引脚定义的库函数.
 
void LED_GPIO_Config(void){                      //引脚初始化的函数.
	GPIO_InitTypeDef GPIO_InitStruct;              //GPIO_InitTypeDef 是一个结构体类型,用于配置 STM32F103 系列芯片的 GPIO 端口。在上述代码中,GPIO_InitStruct 是一个变量,用于保存 GPIO 端口的配置信息。
	
	RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK,ENABLE); //GPIOB口的时钟称为使能状态
	
	GPIO_InitStruct.GPIO_Pin =  LED_G_GPIO_PIN|LED_B_GPIO_PIN|LED_R_GPIO_PIN;   //选择三个待设置引脚
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;                               //模式设置为推挽输出
 	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;                              //输出速率为50mhz
	
	GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct);  //通过调用 GPIO_Init() 函数来将配置应用到相应的 GPIO 端口。
	
}
 
void qc(void){
	LED_G(OFF);
	LED_R(OFF);
	LED_B(OFF);
}
   

led.c的修改不多,需要在待定义端口处把剩下蓝灯和红灯的端口进行定义,因为三个端口都属于GPIOB中而且模式都是推挽输出,所以下面的模式和输出速率可以不增改。最后我增加了一个qc函数,作用是用LED函数保持三个灯同时熄灭。

(3)、main函数修改

#include "stm32f10x.h"
#include "led.h"
 
void delay(uint32_t count)
{
	for(;count!=0;count--);
 
}                //定义一个延时函数。                      
 
int main(void) {
	//来到这里的时候,系统时钟已经被配置成72M
	LED_GPIO_Config();             //运行端口定义函数
	qc();
	while(1){
		LED_R(ON);
		delay(0XFFFFF);
		qc();
		delay(0XFFFFF);
		
		LED_G(ON);
		delay(0XFFFFF);
		qc();
		delay(0XFFFFF);
		
		LED_B(ON);
		delay(0XFFFFF);
		qc();
		delay(0XFFFFF);
	}
}

注意:每次点亮一个灯延时之后需要全熄灭灯光 ,比如如果点亮红灯之后只是单独熄灭红灯会发生灯光的串色现象(我也不太清楚原因,可能是因为打开端口之后默认为低电平的原因)。

 

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-10 12:40:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-10 12:40:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-10 12:40:02       82 阅读
  4. Python语言-面向对象

    2024-06-10 12:40:02       91 阅读

热门阅读

  1. JWT不是为了授权而设计的

    2024-06-10 12:40:02       33 阅读
  2. 自动化测试文档

    2024-06-10 12:40:02       26 阅读
  3. 网络编程之XDP技术应用

    2024-06-10 12:40:02       25 阅读
  4. 机器学习笔记——循环神经网络

    2024-06-10 12:40:02       22 阅读
  5. docker是什么?和kubernetes(k8s)是什么关系?

    2024-06-10 12:40:02       27 阅读
  6. C++进阶教程

    2024-06-10 12:40:02       36 阅读