STM32:制作LED流水灯

1.系统设计说明

本系统利用Proteus内的STM32F103C4作为微控制器,使用了7个按键和九个LED灯,根据不同按键的触发将会显示出不同颜色的流水灯。每完成一次流水灯循环都会对按键进行一次检测,进入下一次循环。

按键为普通开关K1-K7,LED1, LED4, LED7为红色LED,LED2, LED5, LED8为绿色LED,LED3, LED6 ,LED9为蓝色LED。原理图如下:

STM32:制作LED流水灯_第1张图片

2.系统功能说明

按下不同的按键会显示不同颜色的流水灯,如下表:
模式    按键状态    效果
1    仅按下K1    红色LED流水灯
2    仅按下K2    绿色LED流水灯
3    仅按下K3    蓝色LED流水灯
4    仅按下K4    黄色LED流水灯
5    仅按下K5    紫色LED流水灯
6    仅按下K6    青色LED流水灯
7    仅按下K7    白色LED流水灯
8    开关均为按下    关闭流水灯,无LED亮起
9    任意按下两个及以上开关    红、绿、蓝色LED流水灯
注:红+绿=黄 ; 红+蓝=紫 ; 绿+蓝=青 。

3.软件设计说明

首先确定使用STM32F103C4,根据需要自行设计LED和KEY与引脚的连接(注意要避开PB2,PB3,PB4,PA13,PA14,PA15)。

然后对LED的GPIO进行配置。步骤依次为:定义LED连接的GPIO端口--定义控制LED打开关闭的--定义基本混色显示的宏—初始化LED的端口。

led.h

#ifndef __LED_H
#define	__LED_H

#include "stm32f10x.h"  
 

/* 定义LED连接的GPIO端口*/

#define LED1_GPIO_PORT    	GPIOB			              /* GPIO端口 */
#define LED1_GPIO_CLK 	    RCC_APB2Periph_GPIOB		/* GPIO端口时钟 */
#define LED1_GPIO_PIN	    	GPIO_Pin_0			        /* 连接到SCL时钟线的GPIO */

#define LED2_GPIO_PORT    	GPIOB			              /* GPIO端口 */
#define LED2_GPIO_CLK 	    RCC_APB2Periph_GPIOB		/* GPIO端口时钟 */
#define LED2_GPIO_PIN		    GPIO_Pin_1			        /* 连接到SCL时钟线的GPIO */

#define LED3_GPIO_PORT    	GPIOB			              /* GPIO端口 */
#define LED3_GPIO_CLK 	    RCC_APB2Periph_GPIOB		/* GPIO端口时钟 */
#define LED3_GPIO_PIN		    GPIO_Pin_5			        /* 连接到SCL时钟线的GPIO */

#define LED4_GPIO_PORT    	GPIOB			              /* GPIO端口 */
#define LED4_GPIO_CLK 	    RCC_APB2Periph_GPIOB		/* GPIO端口时钟 */
#define LED4_GPIO_PIN	    	GPIO_Pin_6			        /* 连接到SCL时钟线的GPIO */

#define LED5_GPIO_PORT    	GPIOB			              /* GPIO端口 */
#define LED5_GPIO_CLK 	    RCC_APB2Periph_GPIOB		/* GPIO端口时钟 */
#define LED5_GPIO_PIN		    GPIO_Pin_7			        /* 连接到SCL时钟线的GPIO */

#define LED6_GPIO_PORT    	GPIOB			              /* GPIO端口 */
#define LED6_GPIO_CLK 	    RCC_APB2Periph_GPIOB		/* GPIO端口时钟 */
#define LED6_GPIO_PIN		    GPIO_Pin_8			        /* 连接到SCL时钟线的GPIO */

#define LED7_GPIO_PORT    	GPIOB			              /* GPIO端口 */
#define LED7_GPIO_CLK 	    RCC_APB2Periph_GPIOB		/* GPIO端口时钟 */
#define LED7_GPIO_PIN	    	GPIO_Pin_9			        /* 连接到SCL时钟线的GPIO */

#define LED8_GPIO_PORT    	GPIOB			              /* GPIO端口 */
#define LED8_GPIO_CLK 	    RCC_APB2Periph_GPIOB		/* GPIO端口时钟 */
#define LED8_GPIO_PIN		    GPIO_Pin_10			        /* 连接到SCL时钟线的GPIO */

#define LED9_GPIO_PORT    	GPIOB			              /* GPIO端口 */
#define LED9_GPIO_CLK 	    RCC_APB2Periph_GPIOB		/* GPIO端口时钟 */
#define LED9_GPIO_PIN		    GPIO_Pin_11			        /* 连接到SCL时钟线的GPIO */




/* 定义控制IO的宏 */

#define LED1_OFF		   GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);
#define LED1_ON			   GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);

#define LED2_OFF		   GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);
#define LED2_ON			   GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);

#define LED3_OFF		   GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);
#define LED3_ON			   GPIO_ResetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);

#define LED4_OFF		   GPIO_SetBits(LED4_GPIO_PORT,LED4_GPIO_PIN);
#define LED4_ON			   GPIO_ResetBits(LED4_GPIO_PORT,LED4_GPIO_PIN);

#define LED5_OFF		   GPIO_SetBits(LED5_GPIO_PORT,LED5_GPIO_PIN);
#define LED5_ON			   GPIO_ResetBits(LED5_GPIO_PORT,LED5_GPIO_PIN);

#define LED6_OFF		   GPIO_SetBits(LED6_GPIO_PORT,LED6_GPIO_PIN);
#define LED6_ON			   GPIO_ResetBits(LED6_GPIO_PORT,LED6_GPIO_PIN);

#define LED7_OFF		   GPIO_SetBits(LED7_GPIO_PORT,LED7_GPIO_PIN);
#define LED7_ON			   GPIO_ResetBits(LED7_GPIO_PORT,LED7_GPIO_PIN);

#define LED8_OFF		   GPIO_SetBits(LED8_GPIO_PORT,LED8_GPIO_PIN);
#define LED8_ON			   GPIO_ResetBits(LED8_GPIO_PORT,LED8_GPIO_PIN);

#define LED9_OFF		   GPIO_SetBits(LED9_GPIO_PORT,LED9_GPIO_PIN);
#define LED9_ON			   GPIO_ResetBits(LED9_GPIO_PORT,LED9_GPIO_PIN);

/* 基本混色 */

//红
#define LED_RED1  \
					LED1_ON;\
					LED2_OFF\
					LED3_OFF
#define LED_RED2  \
					LED4_ON;\
					LED5_OFF\
					LED6_OFF
#define LED_RED3  \
					LED7_ON;\
					LED8_OFF\
					LED9_OFF
//绿
#define LED_GREEN1		\
					LED1_OFF;\
					LED2_ON\
					LED3_OFF
#define LED_GREEN2  \
			   	LED4_OFF;\
					LED5_ON\
					LED6_OFF
#define LED_GREEN3  \
			  	LED7_OFF;\
					LED8_ON\
					LED9_OFF
//蓝
#define LED_BLUE1	\
					LED1_OFF;\
					LED2_OFF\
					LED3_ON
#define LED_BLUE2	\
					LED4_OFF;\
					LED5_OFF\
					LED6_ON
#define LED_BLUE3	\
					LED7_OFF;\
					LED8_OFF\
					LED9_ON
					
//黄(红+绿)					
#define LED_YELLOW1	\
					LED1_ON;\
					LED2_ON\
					LED3_OFF				
#define LED_YELLOW2	\
					LED4_ON;\
					LED5_ON\
					LED6_OFF	
#define LED_YELLOW3	\
					LED7_ON;\
					LED8_ON\
					LED9_OFF					
					
					
//紫(红+蓝)
#define LED_PURPLE1	\
					LED1_ON;\
					LED2_OFF\
					LED3_ON
#define LED_PURPLE2	\
					LED4_ON;\
					LED5_OFF\
					LED6_ON
#define LED_PURPLE3	\
					LED7_ON;\
					LED8_OFF\
					LED9_ON
//青(绿+蓝)
#define LED_CYAN1 \
					LED1_OFF;\
					LED2_ON\
					LED3_ON
#define LED_CYAN2 \
					LED4_OFF;\
					LED5_ON\
					LED6_ON
#define LED_CYAN3 \
					LED7_OFF;\
					LED8_ON\
					LED9_ON					
//白(红+绿+蓝)
#define LED_WHITE1	\
					LED1_ON;\
					LED2_ON\
					LED3_ON
#define LED_WHITE2	\
					LED4_ON;\
					LED5_ON\
					LED6_ON
#define LED_WHITE3	\
					LED7_ON;\
					LED8_ON\
					LED9_ON					
//黑(全部关闭)
#define LED_RGBOFF	\
					LED1_OFF;\
					LED2_OFF;\
					LED3_OFF;\
					LED4_OFF;\
					LED5_OFF;\
					LED6_OFF;\
					LED7_OFF;\
					LED8_OFF;\
					LED9_OFF


void LED_GPIO_Config(void);

#endif /* __LED_H */

led.c


#include "led.h"

/*初始化LED的IO*/
void LED_GPIO_Config(void)
{		
		/*定义一个GPIO_InitTypeDef类型的结构体*/
		GPIO_InitTypeDef GPIO_InitStructure;

		/*开启LED相关的GPIO外设时钟*/
		RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK | LED4_GPIO_CLK | LED5_GPIO_CLK | LED6_GPIO_CLK | LED7_GPIO_CLK | LED8_GPIO_CLK | LED9_GPIO_CLK, ENABLE);
		
  	/*选择要控制的GPIO引脚1*/
		GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;	

		/*设置引脚模式为通用推挽输出*/
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

		/*设置引脚速率为50MHz */   
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

		/*调用库函数,初始化GPIO*/
		GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);	
		
		/*选择要控制的GPIO引脚2*/
		GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;

		/*调用库函数,初始化GPIO*/
		GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
		
		/*选择要控制的GPIO引脚3*/
		GPIO_InitStructure.GPIO_Pin = LED3_GPIO_PIN;

		/*调用库函数,初始化GPIOF*/
		GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);
		
		/*选择要控制的GPIO引脚4*/
		GPIO_InitStructure.GPIO_Pin = LED4_GPIO_PIN;

		/*调用库函数,初始化GPIOF*/
		GPIO_Init(LED4_GPIO_PORT, &GPIO_InitStructure);
		
		/*选择要控制的GPIO引脚5*/
		GPIO_InitStructure.GPIO_Pin = LED5_GPIO_PIN;

		/*调用库函数,初始化GPIO*/
		GPIO_Init(LED5_GPIO_PORT, &GPIO_InitStructure);
		
		/*选择要控制的GPIO引脚6*/
		GPIO_InitStructure.GPIO_Pin = LED6_GPIO_PIN;

		/*调用库函数,初始化GPIOF*/
		GPIO_Init(LED6_GPIO_PORT, &GPIO_InitStructure);
		
		/*选择要控制的GPIO引脚7*/
		GPIO_InitStructure.GPIO_Pin = LED7_GPIO_PIN;

		/*调用库函数,初始化GPIOF*/
		GPIO_Init(LED7_GPIO_PORT, &GPIO_InitStructure);
		
		/*选择要控制的GPIO引脚8*/
		GPIO_InitStructure.GPIO_Pin = LED8_GPIO_PIN;

		/*调用库函数,初始化GPIOF*/
		GPIO_Init(LED8_GPIO_PORT, &GPIO_InitStructure);
		
		/*选择要控制的GPIO引脚9*/
		GPIO_InitStructure.GPIO_Pin = LED9_GPIO_PIN;

		/*调用库函数,初始化GPIOF*/
		GPIO_Init(LED9_GPIO_PORT, &GPIO_InitStructure);

		/* 关闭所有led灯	*/
		GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
		
		/* 关闭所有led灯	*/
		GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);	 
    
    /* 关闭所有led灯	*/
		GPIO_SetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);
		
    /* 关闭所有led灯	*/
		GPIO_SetBits(LED4_GPIO_PORT, LED4_GPIO_PIN);
		
		/* 关闭所有led灯	*/
		GPIO_SetBits(LED5_GPIO_PORT, LED5_GPIO_PIN);	 
    
    /* 关闭所有led灯	*/
		GPIO_SetBits(LED6_GPIO_PORT, LED6_GPIO_PIN);
		
		/* 关闭所有led灯	*/
		GPIO_SetBits(LED7_GPIO_PORT, LED7_GPIO_PIN);
		
		/* 关闭所有led灯	*/
		GPIO_SetBits(LED8_GPIO_PORT, LED8_GPIO_PIN);	 
    
    /* 关闭所有led灯	*/
		GPIO_SetBits(LED9_GPIO_PORT, LED9_GPIO_PIN);
		
		
}


接着对K1-K7的GPIO进行配置。步骤依次为:定义K1-K7连接的GPIO端口--初始化KEY的端口—设计按键检测函数。

key.h

#ifndef __KEY_H
#define	__KEY_H


#include "stm32f10x.h"

//  引脚定义
#define    KEY1_GPIO_CLK     RCC_APB2Periph_GPIOA
#define    KEY1_GPIO_PORT    GPIOA			   
#define    KEY1_GPIO_PIN		 GPIO_Pin_1
#define    KEY1		 GPIO_ReadInputDataBit( GPIOA , GPIO_Pin_1 ) //读取按键

#define    KEY2_GPIO_CLK     RCC_APB2Periph_GPIOC
#define    KEY2_GPIO_PORT    GPIOA	   
#define    KEY2_GPIO_PIN		 GPIO_Pin_2
#define    KEY2		 GPIO_ReadInputDataBit( GPIOA , GPIO_Pin_2 ) //读取按键

#define    KEY3_GPIO_CLK     RCC_APB2Periph_GPIOA
#define    KEY3_GPIO_PORT    GPIOA			   
#define    KEY3_GPIO_PIN		 GPIO_Pin_3
#define    KEY3		 GPIO_ReadInputDataBit( GPIOA , GPIO_Pin_3 ) //读取按键

#define    KEY4_GPIO_CLK     RCC_APB2Periph_GPIOC
#define    KEY4_GPIO_PORT    GPIOA	   
#define    KEY4_GPIO_PIN		 GPIO_Pin_4
#define    KEY4		 GPIO_ReadInputDataBit( GPIOA , GPIO_Pin_4 ) //读取按键

#define    KEY5_GPIO_CLK     RCC_APB2Periph_GPIOA
#define    KEY5_GPIO_PORT    GPIOA			   
#define    KEY5_GPIO_PIN		 GPIO_Pin_5
#define    KEY5		 GPIO_ReadInputDataBit( GPIOA , GPIO_Pin_5 ) //读取按键

#define    KEY6_GPIO_CLK     RCC_APB2Periph_GPIOC
#define    KEY6_GPIO_PORT    GPIOA	   
#define    KEY6_GPIO_PIN		 GPIO_Pin_6
#define    KEY6		 GPIO_ReadInputDataBit( GPIOA , GPIO_Pin_6 ) //读取按键

#define    KEY7_GPIO_CLK     RCC_APB2Periph_GPIOA
#define    KEY7_GPIO_PORT    GPIOA			   
#define    KEY7_GPIO_PIN		 GPIO_Pin_7
#define    KEY7	 GPIO_ReadInputDataBit( GPIOA , GPIO_Pin_7 ) //读取按键





void Key_GPIO_Config(void);
uint8_t Key_Scan( u8 );


#endif /* __KEY_H */

key.c 

#include "stm32f10x.h" 
#include "key.h"

/* 配置按键用到的I/O口 */
void Key_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	/*开启按键端口的时钟*/
	RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK,ENABLE);
	
	//选择按键的引脚
	GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN; 
	// 设置按键的引脚为浮空输入
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
	//使用结构体初始化按键
	GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);
	
	//选择按键的引脚
	GPIO_InitStructure.GPIO_Pin = KEY2_GPIO_PIN; 
	//设置按键的引脚为浮空输入
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
	//使用结构体初始化按键
	GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);	
	
	//选择按键的引脚
	GPIO_InitStructure.GPIO_Pin = KEY3_GPIO_PIN; 
	//设置按键的引脚为浮空输入
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
	//使用结构体初始化按键
	GPIO_Init(KEY3_GPIO_PORT, &GPIO_InitStructure);	
	
	//选择按键的引脚
	GPIO_InitStructure.GPIO_Pin = KEY4_GPIO_PIN; 
	//设置按键的引脚为浮空输入
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
	//使用结构体初始化按键
	GPIO_Init(KEY4_GPIO_PORT, &GPIO_InitStructure);	
	
	//选择按键的引脚
	GPIO_InitStructure.GPIO_Pin = KEY5_GPIO_PIN; 
	//设置按键的引脚为浮空输入
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
	//使用结构体初始化按键
	GPIO_Init(KEY5_GPIO_PORT, &GPIO_InitStructure);	
	
	//选择按键的引脚
	GPIO_InitStructure.GPIO_Pin = KEY6_GPIO_PIN; 
	//设置按键的引脚为浮空输入
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
	//使用结构体初始化按键
	GPIO_Init(KEY6_GPIO_PORT, &GPIO_InitStructure);	
	
	//选择按键的引脚
	GPIO_InitStructure.GPIO_Pin = KEY7_GPIO_PIN; 
	//设置按键的引脚为浮空输入
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 
	//使用结构体初始化按键
	GPIO_Init(KEY7_GPIO_PORT, &GPIO_InitStructure);	
	
	
	
}

void delay(u16 time)
{    
   u16 i=0;  
   while(time--)
   {
      i=12000;
      while(i--) ;    
   }
}

 /* 按键检测 */
uint8_t Key_Scan( u8 mode )
{			
	u8 key;
	/*检测按键,不同的按键对应不同的模式*/
	if( KEY1==0 && KEY2==1 && KEY3==1 && KEY4==1 && KEY5==1 && KEY6==1 && KEY7==1 )  
	{	 
		delay(10);  //去抖动
		if( KEY1==0) key=1;	 
	}
	else if( KEY1==1 && KEY2==0 && KEY3==1 && KEY4==1 && KEY5==1 && KEY6==1 && KEY7==1 )  
	{	 
		delay(10);  //去抖动
		if( KEY2==0) key=2;	 
	}
	else if( KEY1==1 && KEY2==1 && KEY3==0 && KEY4==1 && KEY5==1 && KEY6==1 && KEY7==1 )  
	{	 
		delay(10);  //去抖动
		if( KEY3==0) key=3;	 
	}
	else if( KEY1==1 && KEY2==1 && KEY3==1 && KEY4==0 && KEY5==1 && KEY6==1 && KEY7==1 )  
	{	 
		delay(10);  //去抖动
		if( KEY4==0) key=4;	 
	}
	else if( KEY1==1 && KEY2==1 && KEY3==1 && KEY4==1 && KEY5==0 && KEY6==1 && KEY7==1 )  
	{	 
		delay(10);  //去抖动
		if( KEY5==0) key=5;	 
	}
	else if( KEY1==1 && KEY2==1 && KEY3==1 && KEY4==1 && KEY5==1 && KEY6==0 && KEY7==1 )  
	{	 
		delay(10);  //去抖动
		if( KEY6==0) key=6;	 
	}
	else if( KEY1==1 && KEY2==1 && KEY3==1 && KEY4==1 && KEY5==1 && KEY6==1 && KEY7==0 )  
	{	 
		delay(10);  //去抖动
		if( KEY7==0)  key=7;	 
	}
	else if( KEY1==1 && KEY2==1 && KEY3==1 && KEY4==1 && KEY5==1 && KEY6==1 && KEY7==1 )  
	{	 
		delay(10);  //去抖动
		if( KEY1==1 && KEY2==1 && KEY3==1 && KEY4==1 && KEY5==1 && KEY6==1 && KEY7==1 )  key=8;	 
	}
	else key=9;
	return key;
}


Main函数的循环里,设置几种模式的选择,每完成一次流水灯循环都会对按键进行一次检测,确定下一次循环的模式。

 main.c (其实这里的选择用switch看着会更有条理)

#include "stm32f10x.h"   // 相当于51单片机中的  #include 
#include "led.h"  
#include "key.h" 

void delay_ms(u16 time)
{    
   u16 i=0;  
   while(time--)
   {
      i=12000;
      while(i--) ;    
   }
}

int main(void)
{	
	u8 t;
	
	LED_GPIO_Config();/* LED 端口初始化 */
 
	Key_GPIO_Config(); /* KEY 端口初始化 */
	
	

	while (1) /*进行流水灯的循环*/
	{
		//if( t == 9 ) GPIO_ResetBits(LED9_GPIO_PORT, LED9_GPIO_PIN);//测试电路
		
		t=Key_Scan(1);
		
		//if( t == 2 ) GPIO_ResetBits(LED9_GPIO_PORT, LED9_GPIO_PIN);//测试电路
		
			
		if(t==1)  {LED_RED1;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_RED2;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_RED3;delay_ms(30);LED_RGBOFF;delay_ms(10);}
								
		else if(t==2)  {LED_GREEN1;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_GREEN2;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_GREEN3;delay_ms(30);LED_RGBOFF;delay_ms(10);}
			
		else if(t==3)  {LED_BLUE1;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_BLUE2;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_BLUE3;delay_ms(30);LED_RGBOFF;delay_ms(10); }
			
		else if(t==4)  {LED_YELLOW1;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_YELLOW2;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_YELLOW3;delay_ms(30);LED_RGBOFF;delay_ms(10);}
			
		else if(t==5)  {LED_PURPLE1;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_PURPLE2;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_PURPLE3;delay_ms(30);LED_RGBOFF;delay_ms(10);}
			
		else if(t==6)  {LED_CYAN1;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_CYAN2;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_CYAN3;delay_ms(30);LED_RGBOFF;delay_ms(10);}
			
		else if(t==7)  {LED_WHITE1;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_WHITE2;delay_ms(30);LED_RGBOFF;delay_ms(10);LED_WHITE3;delay_ms(30);LED_RGBOFF;delay_ms(10);}
				
		else if(t==8)  {LED_RGBOFF;delay_ms(10);}
				
		else if(t==9)  {LED1_ON;delay_ms(30);LED1_OFF;LED2_ON;delay_ms(30);LED2_OFF;LED3_ON;delay_ms(30);LED3_OFF;\
				            LED4_ON;delay_ms(30);LED4_OFF;LED5_ON;delay_ms(30);LED5_OFF;LED6_ON;delay_ms(30);LED6_OFF;\
				            LED7_ON;delay_ms(30);LED7_OFF;LED8_ON;delay_ms(30);LED8_OFF;LED9_ON;delay_ms(30);LED9_OFF;}
		
		
	}	
}


4.调试及运行结果

程序编译结果

STM32:制作LED流水灯_第2张图片


红色流水灯显示
 

STM32:制作LED流水灯_第3张图片


白色流水灯显示
 

STM32:制作LED流水灯_第4张图片


红、绿、蓝色流水灯显示

STM32:制作LED流水灯_第5张图片


万事开头难,这是我第一次对STM32F103进行编程及仿真使用,虽然只是做了一系列的流水灯,但是我对库函数的使用有了更熟练的应用和更清晰的理解。在编程和Debug的过程中,我也增长了一些处理错误和警告的能力。


刚开始的时候我对分模块编程以及对GPIO的初始化配置毫无头绪,跟着STM32F103的相关教学视频学习后,开始逐渐尝试着配置,发现使用库函数进行配置其实很简单,重要是的要下手去编写一些程序,分模块依次攻破,就比较好理清头绪了。
在Debug的过程,我犯了一些很低级的错误,例如写了一些中文的“(”怎么改程序都没发现,例如忘记在led.c函数内调用led.h,例如在设计按键检测函数是应为“与”逻辑我写成了“或”逻辑…其次经过排查,结合CSDN的帖子答疑,一些结构上的问题都能解决。

当然一定要注意要避开PB2,PB3,PB4,PA13,PA14,PA15,我最开始连接引脚的时候刚好GPIOB用的是前九个,GPIOA用的是后七个,刚刚好全部撞上了这些引脚导致仿真的时候电平一直不对劲,后来查阅了资料才知道它们都是有特殊作用的。

你可能感兴趣的:(嵌入式STM32学习,c语言,stm32)