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