STM32闪烁电路以及流水灯的大致配置说明(附Delay延时函数源码)

       闪烁的基本原理是利用延时函数延时LED的IO口输出并且进行循环实现的,这样就很好理解了,我们可以直接在主函数里配置好对应的输出IO口就行,不需要输入了,这里就配置PA0,具体配置如下,随后在while循环里进行编写,这里我们用到GPIO_WriteBit函数,第一个参数为对应的输出IO口,第二个为具体的引脚,第三个选择Bit_RESET(置低电平)或者Bit_SET(置高电平),这个函数在输出模式下可以控制对应的IO口,这里实现闪烁,那就每过一定时间调用这两个函数,使用Delay函数进行延时,Dalay函数源码放在后面,可以自行添加。延时100ms执行下一个,在whlie里循环进行,达到闪烁的目的。

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main (void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//初始化
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	 
	while(1)
	  {
		   	GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);//置0
			  Delay_ms(100);
			  GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);//置1
				Delay_ms(100);
	  }
	
}

        那么既然如此,流水灯的函数是不是就出来了,我们直接过一段时间依次给给定的LED灯置低就行了,注意同时将上一个LED灯的IO口置高关闭(IO口接LED灯的低电平输出引脚),具体配置如下,依次点亮PA0,PA0,PA2三个IO口的LED灯。

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main (void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//初始化
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	 
	while(1)
	  {
		   	GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
			  Delay_ms(500);
			  GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
			  GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_SET);
				Delay_ms(500);
			  GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_RESET);
			  GPIO_WriteBit(GPIOA,GPIO_Pin_2,Bit_SET);
				Delay_ms(500);
			  GPIO_WriteBit(GPIOA,GPIO_Pin_2,Bit_RESET);
	  }
	
}

以下是延时函数源代码,需要自取。

Dealy.c

#include "stm32f10x.h"

/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 

Delay.h

#ifndef __DELAY_H
#define __DELAY_H

void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真寻460

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值