STM32F1开发指南笔记7----STM32呼吸灯

依据人体视觉暂留效应,利用简单的延时函数形成一个PWM周期,输出不同占空比的LED灯亮灭状态,视觉上达到呼吸灯的效果,逐渐暗-逐渐亮-逐渐暗…。

#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"

void LED_Init(void);
 
 int main(void)
 {

	u8 MENU;
	u16 t,i;
	 
	//初始化程序
	LED_Init();		//初始化GPE5引脚
	delay_init();  //注意:延时函数不初始化,下面的delay_us用不了
	 
	//设置变量的初始值
	MENU = 0;
	t = 1;
	
	while(1)
	{	
		//菜单0,逐渐变暗
		if(MENU == 0)
		{ 
			for(i = 0; i < 10; i++)
			{
				GPIO_SetBits(GPIOE,GPIO_Pin_5); //LED接口输出高电平1,灯灭
				delay_us(t); //延时
				GPIO_ResetBits(GPIOE,GPIO_Pin_5); //LED接口输出低电平0,灯亮
				delay_us(501-t); //延时
			}
			t++;
			if(t==500)
			{
				MENU = 1;
			}
		}
		
		//菜单1,逐渐变亮
		if(MENU == 1)
		{ //变暗循环
			for(i = 0; i < 10; i++)
			{
				GPIO_SetBits(GPIOE,GPIO_Pin_5);   //LED接口输出高电平1
				delay_us(t); //延时
				GPIO_ResetBits(GPIOE,GPIO_Pin_5); //LED接口输出低电平0
				delay_us(501-t); //延时
			}
			t--;
			if(t==1)
			{
				MENU = 0;
			}
		}		
	}
}

注意:调试代码时,忘记了初始化延时函数delay_init(),结果导致一直无法使用延时微秒函数。
系统上电,在调用main函数之前,先调用了SystemInit函数,在该函数内默认设置好了系统时钟为72MHz。因此可以不去配置RCC了。
STM32为了节约功耗,默认把外设的时钟都关闭了,因此在使用到某一外设时,必须手动打开该外设的时钟。

void LED_Init(void)
{
	 GPIO_InitTypeDef  GPIO_InitStructure;
		 
	 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);	 //使能PE端口时钟

	 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;			    //PE.5 端口配置
	 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 	 //推挽输出
	 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	 //IO口速度为50MHz
	 GPIO_Init(GPIOE, &GPIO_InitStructure);			     //初始化GPIOE.5
	 GPIO_SetBits(GPIOE,GPIO_Pin_5);					//PE.5 输出高,灯灭
}
发布了34 篇原创文章 · 获赞 1 · 访问量 1428

猜你喜欢

转载自blog.csdn.net/qq_38958704/article/details/105329977