1. 项目
使用STM32F103VE的固件库实现流水灯设计。
2. 代码
由于这是基于野火的视频进行学习的,项目代码在上节基础上进行编写的。
点亮绿灯:
main.c
#include "stm32f10x.h" //相当于51单片机中的 #include <reg51.h> #include "bsp_led.h" void Delay(uint32_t count) { for(; count!=0; count--); } int main(void) { //来到这里是,系统的时钟已经被配置到72MHz了 LED_GPIO_Config(); //初始化LED函数 while(1) { GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN); //熄灭LED Delay(0xfffff); GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN); //点亮LED Delay(0xfffff); } }
bsp_led.c
#include "bsp_led.h" void LED_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK, ENABLE); GPIO_InitStruct.GPIO_Pin = LED_G_GPIO_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct); }
bsp_led.h
#ifndef __bsp_led_h #define __bsp_led_h #include "stm32f10x.h" #define LED_G_GPIO_PIN GPIO_Pin_0 #define LED_G_GPIO_PORT GPIOB #define LED_G_GPIO_CLK RCC_APB2Periph_GPIOB void LED_GPIO_Config(void); #endif /*__bsp_led._h*/
点亮红蓝灯只需将对应代码替换即可
main.c中需替换的代码:
GPIO_SetBits(LED_R_GPIO_PORT,LED_R_GPIO_PIN); //熄灭LED Delay(0xfffff); GPIO_ResetBits(LED_R_GPIO_PORT,LED_R_GPIO_PIN); //点亮LED Delay(0xfffff); GPIO_SetBits(LED_B_GPIO_PORT,LED_B_GPIO_PIN); //熄灭LED Delay(0xfffff); GPIO_ResetBits(LED_B_GPIO_PORT,LED_B_GPIO_PIN); //点亮LED Delay(0xfffff);
bsp_led.c中需要替换的代码:
GPIO_InitStruct.GPIO_Pin = LED_R_GPIO_PIN; RCC_APB2PeriphClockCmd(LED_R_GPIO_CLK, ENABLE); GPIO_Init(LED_R_GPIO_PORT, &GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = LED_B_GPIO_PIN; RCC_APB2PeriphClockCmd(LED_B_GPIO_CLK, ENABLE); GPIO_Init(LED_B_GPIO_PORT, &GPIO_InitStruct);
bsp_led.h中需要替换的代码:
#define LED_R_GPIO_PIN GPIO_Pin_5 #define LED_R_GPIO_PORT GPIOB #define LED_R_GPIO_CLK RCC_APB2Periph_GPIOB #define LED_B_GPIO_PIN GPIO_Pin_1 #define LED_B_GPIO_PORT GPIOB #define LED_B_GPIO_CLK RCC_APB2Periph_GPIOB
3. 参考资料
- 原理图
- 函数执行流程
(1) 使用 GPIO_InitTypeDef 在bsp_led.c中定义 GPIO_InitStruct 初始化结构体变量,以便下面用于存储 GPIO 配置。
(2) 调用库函数 RCC_APB2PeriphClockCmd 来使能 LED 灯的 GPIO 端口时钟,该函数有两个输入参数,第一个参数用于指示要配置的时钟,如本例中的“LED_G_GPIO_CLK”;
函数的第二个参数用于设置状态,可输入“Disable”关闭或“Enable”使能时钟。
(3) 向 GPIO 初始化结构体赋值,把引脚初始化成推挽输出模式,其中的 GPIO_Pin 使用宏“LED_X_GPIO_PIN”来赋值,使函数的实现方便移植。
(4) 使用以上初始化结构体的配置,调用 GPIO_Init 函数向寄存器写入参数,完成 GPIO 的初始化,这里的 GPIO 端口使用“LED_X_GPIO_PORT”宏来赋值,也是为了程序移植方便。
(5) 使用同样的初始化结构体,只修改控制的引脚和端口,初始化其它 LED 灯使用的 GPIO 引脚。
(6) 使用宏控制 RGB 灯默认关闭。