使用STM32F407xx的GPIO引脚实现跑马灯效果的详细步骤

1、使用Keil创建一个新工程

2、在弹出的对话框,填写工程的名字,例如工程名字为demo_led

3、为保存的工程,选择对应的芯片

4、为当前工程,添加相应的库函数

 

 5、若库函数添加成功,则显示当前工程目录树

6、在当前工程目录下,先创建main.c

 

7、添加头文件和设置优化等级

 

8、开始写跑马灯程序

 (1)初始化led灯
void led_init()
{
	//定义结构体
	GPIO_InitTypeDef GPIO_InitStructure1;
	
	//使能AHB1总线上指定外设的硬件时钟,其实就是对外设进行供电 (如果该外设不使用,可以关闭其硬件时钟,降低功耗)
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF, ENABLE);
	
	
	GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//9 10号引脚
	GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_OUT;//输出模式
	GPIO_InitStructure1.GPIO_PuPd = GPIO_PuPd_NOPULL;//推挽类型,Push Pull
	GPIO_InitStructure1.GPIO_OType = GPIO_OType_PP;//不使能上下拉电阻
	GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_2MHz;//引脚工作速度
	
	GPIO_Init(GPIOF, &GPIO_InitStructure1);//进行初始化
	
	
	GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;//13 14号引脚
	GPIO_Init(GPIOE, &GPIO_InitStructure1);//进行初始化
	
	//初始完硬件之后,默认关闭状态
	GPIO_WriteBit(GPIOE, GPIO_Pin_13 |  GPIO_Pin_14, Bit_SET);
	GPIO_WriteBit(GPIOF, GPIO_Pin_9 |  GPIO_Pin_10, Bit_SET);
	
	
}
(2) 设置延时
int32_t  delay_ms(uint32_t nms)
{
	uint32_t t = nms;
	uint32_t temp;
	
	while(t--)
	{
		SysTick->CTRL = 0; 			
		SysTick->LOAD = 21000-1; 	
		SysTick->VAL = 0; 			
		SysTick->CTRL = 1; 			
		while(1)
		{

			temp=SysTick->CTRL;
			
			//检测count flag
			if(temp & 0x00010000)
				break;
			
			//检测系统定时器是否意外关闭	
			if((temp & 0x1)==0)
				return -1;		
		}
	}	
	
	SysTick->CTRL = 0; 	
	
	return 0;
}
(3) 实现跑马灯效果循环
void led()
{
	GPIO_WriteBit(GPIOE, GPIO_Pin_14 , Bit_SET);
	GPIO_WriteBit(GPIOF, GPIO_Pin_9 , Bit_RESET);
	delay_ms(100);
		
	GPIO_WriteBit(GPIOF, GPIO_Pin_10 , Bit_RESET);
	GPIO_WriteBit(GPIOF, GPIO_Pin_9 , Bit_SET);
	delay_ms(100);
	
	GPIO_WriteBit(GPIOF, GPIO_Pin_10 , Bit_SET);
	GPIO_WriteBit(GPIOE, GPIO_Pin_13 , Bit_RESET);
	delay_ms(100);
	
	GPIO_WriteBit(GPIOE, GPIO_Pin_13 , Bit_SET);
	GPIO_WriteBit(GPIOE, GPIO_Pin_14 , Bit_RESET);
	delay_ms(100);
}
(4)源程序
#include "stm32f4xx.h"

void led_init()
{
	//定义结构体
	GPIO_InitTypeDef GPIO_InitStructure1;
	
	//使能AHB1总线上指定外设的硬件时钟,其实就是对外设进行供电 (如果该外设不使用,可以关闭其硬件时钟,降低功耗)
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF, ENABLE);
	
	
	GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//9 10号引脚
	GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_OUT;//输出模式
	GPIO_InitStructure1.GPIO_PuPd = GPIO_PuPd_NOPULL;//推挽类型,Push Pull
	GPIO_InitStructure1.GPIO_OType = GPIO_OType_PP;//不使能上下拉电阻
	GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_2MHz;//引脚工作速度
	
	GPIO_Init(GPIOF, &GPIO_InitStructure1);//进行初始化
	
	
	GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;//13 14号引脚
	GPIO_Init(GPIOE, &GPIO_InitStructure1);//进行初始化
	
	//初始完硬件之后,默认关闭状态
	GPIO_WriteBit(GPIOE, GPIO_Pin_13 |  GPIO_Pin_14, Bit_SET);
	GPIO_WriteBit(GPIOF, GPIO_Pin_9 |  GPIO_Pin_10, Bit_SET);
	
	
}

int32_t  delay_ms(uint32_t nms)
{
	uint32_t t = nms;
	uint32_t temp;
	
	while(t--)
	{
		SysTick->CTRL = 0; 			
		SysTick->LOAD = 21000-1; 	
		SysTick->VAL = 0; 			
		SysTick->CTRL = 1; 			
		while(1)
		{

			temp=SysTick->CTRL;
			
			//检测count flag
			if(temp & 0x00010000)
				break;
			
			//检测系统定时器是否意外关闭	
			if((temp & 0x1)==0)
				return -1;		
		}
	}	
	
	SysTick->CTRL = 0; 	
	
	return 0;
}

void led()
{
	GPIO_WriteBit(GPIOE, GPIO_Pin_14 , Bit_SET);
	GPIO_WriteBit(GPIOF, GPIO_Pin_9 , Bit_RESET);
	delay_ms(100);
		
	GPIO_WriteBit(GPIOF, GPIO_Pin_10 , Bit_RESET);
	GPIO_WriteBit(GPIOF, GPIO_Pin_9 , Bit_SET);
	delay_ms(100);
	
	GPIO_WriteBit(GPIOF, GPIO_Pin_10 , Bit_SET);
	GPIO_WriteBit(GPIOE, GPIO_Pin_13 , Bit_RESET);
	delay_ms(100);
	
	GPIO_WriteBit(GPIOE, GPIO_Pin_13 , Bit_SET);
	GPIO_WriteBit(GPIOE, GPIO_Pin_14 , Bit_RESET);
	delay_ms(100);
}

int  main()
{
	led_init();
	while(1)
	{
		led();
	}
}

9、如果要在实体板子上运行效果需要配置以下环境

10、程序最终效果 

跑马灯

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值