STM32学习探究:流水灯的实现

流水灯的实现

这里我们使用 stm32mini 开发板实现外接流水灯,这里我采用了三个灯(说明问题就可以了)。外接的引脚分别为PA2,PB8,PC13三个引脚,在连接的时候,采用灯的正极接GPIO引脚,负极接GND(这是一种合理的方式)。
注意:虽然接VCC也可以发光,但是这样不是合理的连接方式,而且,发光的情况刚好与接GND的情况相反。

参考的相关资料如下:

  • 时钟使能:
    STM32学习探究:流水灯的实现_第1张图片
    STM32学习探究:流水灯的实现_第2张图片
  • 端口配置:
    STM32学习探究:流水灯的实现_第3张图片
    STM32学习探究:流水灯的实现_第4张图片
    STM32学习探究:流水灯的实现_第5张图片
    STM32学习探究:流水灯的实现_第6张图片
  • 端口输出:
    STM32学习探究:流水灯的实现_第7张图片

具体实现的代码如下:

//led.h文件
#ifndef __LED_H
#define __LED_H	 
#include "sys.h"


//LED端口定义
#define LED0 PAout(2)	
#define LED1 PBout(8)	
#define LED2 PCout(13)	

void LED_Init(void);	//初始化		 				    
#endif



//led.c文件
#include "sys.h"   
#include "led.h"

void LED_Init(void)
{
	//PA2
	RCC->APB2ENR|=1<<2;    //使能PORTA时钟	   	 	   	 
	GPIOA->CRL&=0XFFFFF0FF; 
	GPIOA->CRL|=0X00000300;//PA2 推挽输出   	 
    GPIOA->ODR|=1<<2;      //A2 输出高
	//PB8
	RCC->APB2ENR|=1<<3;    //使能PORTB时钟	   	 	   	 
	GPIOB->CRH&=0XFFFFFFF0; 
	GPIOB->CRH|=0X00000003;//PB8 推挽输出   	 
    GPIOB->ODR|=1<<8;      //PB8 输出高
	//PC13
	RCC->APB2ENR|=1<<4;    //使能PORTC时钟	   	 	   	 
	GPIOC->CRH&=0XFF0FFFFF; 
	GPIOC->CRH|=0X00300000;//PC13 推挽输出   	 
    GPIOC->ODR|=1<<13;      //PC13 输出高

}

//test.c文件(主文件)
#include "usart.h"		
#include "delay.h"	
#include "led.h" 

int main(void)
{		 
	Stm32_Clock_Init(9); 	//系统时钟设置
	delay_init(72);	     	//延时初始化
	LED_Init();		//初始化与LED连接的硬件接口    
	while(1)
	{
		//优化
		LED0=1;
		LED1=0;
		LED2=0;
		delay_ms(200);
		
		LED0=0;
		LED1=1;
		LED2=0;
		delay_ms(300);
		
		LED0=0;
		LED1=0;
		LED2=1;
		delay_ms(100);
	}

}


注意:代码的每个子文件的最后都有空行,且不能去掉,因为keil软件自身的问题(我也不知道是bug还是别的什么原因,不过都不重要),去掉会报错,也就是说,编程必须以空行结尾。

如果在建立keil文件的时候,还是比较陌生,可以参考我之前的博客:
https://blog.csdn.net/jianbai_/article/details/90580887

总结

这是一个很简单的任务,为了尽量多的使用引脚,我初始化了PA,PB,PC口,当然GPIO口的选择是根据编程人员自己选择的,依据情况而定的。要想完成这个实验,也可以参考程序源码中的跑马灯实验,到时候将GPIO引脚引出来就可以,本质是一样的。
当然,我们可以多用几个灯,效果会更好点,运行成功之后,可以将其封装为一个函数,到时候可以随时调用,也比较方便。但是,如果灯多了,主函数采用上面的方法就比较麻烦,虽然容易懂,但是代码冗长,我们可以采用移位或者数组加循环的方式,这样编程者会比较轻松,代码也不会太长。

你可能感兴趣的:(STM32)