小编在野火上学习完用固件库点亮一个LED灯后,自己编程做了一个LED流水灯。在这里分享给大家。
用proteus8.7做的仿真图:
![]()
固件库编程的方式,源码如下:
bps_LED_LS.h //用于声明全局变量,定义宏,声明全局变量
#ifndef _BSP_LED_H
#define _BSP_LED_H
#include “stm32f10x.h”
extern uint16_t LED_G_GPIO_PIN; //声明全局变量,定义引脚,
extern GPIO_InitTypeDef GPIO_InitStruct; //声明全局变量,寄存器B的结构体
#define LED_G_GPIO_PORT GPIOB //宏定义端口,便于移植
#define LED_G_GPIO_CLK RCC_APB2Periph_GPIOB //宏定义时钟使能
//函数声明
void LED_GPIO_Config(void);
#endif /*_BSP_LED_H*/
bps_LED_LS.c //点亮一个LED灯的封装驱动函数文件
#include “bsp_LED_LS.h”
void LED_GPIO_Config(void){ //初始化GPIO(一个完整的初始化函数)
RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK, ENABLE); //开时钟,来自“stm32f10x_rcc.h”
GPIO_InitStruct.GPIO_Pin = LED_G_GPIO_PIN; //选择引脚(LED_G_GPIO_PIN为引脚变量)
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //选择推挽输出“GPIO_Mode_Out_PP”来自stm32f10x_gpio.h的模式的枚举
GPIO_InitStruct.GPIO_Speed =GPIO_Speed_50MHz; //选择推挽输出“GPIO_Speed_50MHz”来自stm32f10x_gpio.h的速率的枚举
GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct); //&是取地址的意思,因为GPIO_InitStruct是一个结构体的变量
}
main.c //主函数文件
#include “stm32f10x.h”
#include “bsp_LED_LS.h”
GPIO_InitTypeDef GPIO_InitStruct; //全局变量,寄存器B的结构体
uint16_t LED_G_GPIO_PIN=0x0001; //全局变量,定义引脚,设定一个引脚初值
void Delay(uint32_t count){ //延时函数
for(;count!=0;count--);
}
int main(void){
while(1){
LED_GPIO_Config(); //调用GPIO初始化函数,完成时钟的设置、引脚的选择、端口的输入输出模式和速率等的配置
GPIO_ResetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN); //GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin),一会儿灯又亮了(清零函数)
Delay(0xFFFFF);
GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN); //GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin),一会儿灯灭掉了(置位函数)
Delay(0xFFFFF);
LED_G_GPIO_PIN =LED_G_GPIO_PIN《《1;
if(LED_G_GPIO_PIN==0x0008){ //循环,将灯点亮的范围控制在PB0-PB2
LED_G_GPIO_PIN = 0x0001;
}
}
}
仿真结果图:
![]()
三个LED依次循环点亮。
注意建立工程时选取的芯片与仿真时的芯片一致,proteus8.7中stm32的芯片类型很少,所以建立工程时需要注意。
简单的学习分享,希望对大家有所帮助!!!