基于STM32-跑马灯实现

我学习M3有一段时间,第一次写博客,通过博客分享自己学习的经验跟大家探讨同时提高自己对M3的认识。相信大家初学时第一个实验就是实现跑马灯,这里我就介绍下跑马灯的实现。

1.首先讲下GPIO

GPIO—general purpose intput output是通用输入输出端口的简称,简单来说就是软件可控制的引脚,STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能 。

2.端口与引脚的区别

端口:单片机内部(CPU单元)和外部IO的接口组,比如说PORTA端口,有16个引脚,PORTA.0~PORTA.15。端口在IO空间映射有寄存器,这个寄存器反映当前端口的状态,如PORTA.0口上输入的电压是0~5V的信号,单片机在映射进寄存器时会定义一个门限(如1.8V),低于这个门限寄存器中相应位是0,高于这个门限相应位是1。一般端口还有其他控制寄存器,如控制端口引脚输入输出的寄存器,如控制端口引脚复用的寄存器等。当设置端口引脚为输出时,向相应的输出寄存器的相应位写1,该端口的对应IO引脚就会输出一个近似VCC的电平,当向相应位写0时,该端口的对应IO引脚会输出一个近似0V的电平。

3.跑马灯实现

#ifndef _LED_H
#define _LED_H
#include "stm32f10x.h"
#include "sys.h"


void Led_Init(void);
void Beep_Init(void);

#define LED1 PFout(7)
#define LED2 PBout(5)
#define LED3 PAout(8)
#define LED4 PAout(1)

#define BEEP PBout(8)

#endif

#include "led.h"
/*
函数功能:LED初始化;
硬件连接:
		LED1 -> PF7;
		LED2 -> PB5;
		LED3 -> PA8;
		LED4 -> PA1;
*/

void Led_Init(void)
{
	//1.时钟使能
	RCC->APB2ENR |=1<<3;	//GPIOB
	RCC->APB2ENR |=1<<2;	//GPIOA
	RCC->APB2ENR |=1<<7;	//GPIOF
	
	//2.端口工作模式配置
	GPIOB->CRL &=0xFF0FFFFF;	//PB.5
	GPIOB->CRL |=0x00300000;	//通用推挽输出
	GPIOB->ODR |=1<<5;			//先拉高,这里低电平驱动LED
	
	GPIOA->CRL &=0xFFFFFF0F;	//PA.1
	GPIOA->CRL |=0x00000030;
	GPIOA->ODR |=1<<1;
	
	GPIOA->CRH &=0xFFFFFFF0;	//PA.8
	GPIOA->CRH |=0x00000003;
	GPIOA->ODR |=1<<8;
	
	GPIOF->CRL &=0x0FFFFFFF;	//PF.7
	GPIOF->CRL |=0x30000000;
	GPIOF->ODR |=1<<7;
	
}
#include "led.h"
#include "delay.h"
int main(void)
{
	Led_Init();	
	Delay_Init(72);
	LED1=0;
	while(1)
	{	
		/*
			这里只是实现简单的两盏灯交替闪烁,如果
			大家想实现其他骚气的样式只要操作LED的电平
		*/
		LED1=!LED1;
		LED2=!LED2;
		delay_MS(400);
	}
}

最后,自己最近学M3也是第一次发博客,想通过发博客提高对M3的认知同时也是想分享自己对M3的理解,大家可评论探讨,后期会更新我的博客(超声波,GSM,GPS,蓝牙,WIFI,OLED,摄像头,串口封包解包,红外解码编码等)也有上传资源(M3的小实验和小项目)。欢迎关注~

猜你喜欢

转载自blog.csdn.net/zdw6868/article/details/80532898