stm32实验报告(一):GPIO应用

stm32实验报告(一):GPIO应用

一、实验目的与任务

  1. 理解嵌入式系统的组成和设计方法。

  2. 掌握GPIO的使用方法,熟悉LCD的使用。

  3. 熟悉工具软件使用方法,特别是程序的调试方法。

二、实验要求

  1. 设计STM32的硬件电路,利用其GPIO控制GRBLED灯。

  2. 使用STM32完成流水灯的设计。

三、实验内容及步骤

1.实验电路图

stm32实验报告(一):GPIO应用_第1张图片

2.软件设计思路

  • 使能GPIO端口时钟;
  • 初始化GPIO目标引脚为推挽输出模式;
  • 编写简单测试程序,控制GPIO引脚输出高、低电平。

3.实验步骤

1.新建led.c和led.h文件,在led.c文件中编写相关函数,在led.h中定义相关宏定义。

​ 将LED 灯的GPIO端口、GPIO引脚号以及GPIO 端口时钟封装起来。为了方便控制LED灯,我们把LED灯常用的亮、灭也直接定义成宏。如下led.h

// R-红色
#define LED1_GPIO_PORT 		GPIOB
#define LED1_GPIO_CLK 		RCC_APB2Periph_GPIOB
#define LED1_GPIO_PIN 		GPIO_Pin_5
// G-绿色
#define LED2_GPIO_PORT 		GPIOB
#define LED2_GPIO_CLK 		RCC_APB2Periph_GPIOB
#define LED2_GPIO_PIN 		GPIO_Pin_0
// B-蓝色
#define LED3_GPIO_PORT 		GPIOB
#define LED3_GPIO_CLK 		RCC_APB2Periph_GPIOB
#define LED3_GPIO_PIN 		GPIO_Pin_1
#define LED1_ON			GPIO_ResetBits(GPIOB,LED1_GPIO_PIN)
#define LED1_OFF		GPIO_SetBits(GPIOB,LED1_GPIO_PIN)
#define LED2_ON			GPIO_ResetBits(GPIOB,LED2_GPIO_PIN)
#define LED2_OFF		GPIO_SetBits(GPIOB,LED2_GPIO_PIN)
#define LED3_ON			GPIO_ResetBits(GPIOB,LED3_GPIO_PIN)
#define LED3_OFF		GPIO_SetBits(GPIOB,LED3_GPIO_PIN)
//红
#define LED_RED				LED1_ON;LED2_OFF;LED3_OFF
//绿
#define LED_GREEN			LED1_OFF;LED2_ON;LED3_OFF
//蓝
#define LED_BLUE			LED1_OFF;LED2_OFF;LED3_ON
//黄
#define LED_YELLOW		LED1_ON;LED2_ON;LED3_OFF
//紫
#define LED_PURPLE		LED1_ON;LED2_OFF;LED3_ON
//青
#define LED_CYAN 			LED1_OFF;LED2_ON;LED3_ON
//白
#define LED_WHITE 		LED1_ON;LED2_ON;LED3_ON
//全灭
#define LED_RGBOFF 		LED1_OFF;LED2_OFF;LED3_OFF

2.初始化GPIO端口时钟时采用了STM32 库函数,函数执行流程如下:

  • 使用GPIO_InitTypeDef 定义GPIO 初始化结构体变量,以便下面用于存储GPIO 配置。

  • 调用库函数RCC_APB2PeriphClockCmd 来使能LED 灯的GPIO端口时钟,该函数有两个输入参数,第一个参数用于指示要配置的时钟,如本例中的“RCC_ APB2Periph_GPIOB”,应用时我们使用“|”操作同时配置3 个LED 灯的时钟;函数的第二个参数用于设置状态,可输入“Disable”关闭或“Enable”使能时钟。

  • 向GPIO初始化结构体赋值,把引脚初始化成推挽输出模式,其中的GPIO_Pin 使用宏“LEDx_GPIO_PIN”来赋值,使函数的实现方便移植。

  • 使用以上初始化结构体的配置,调用GPIO_Init 函数向寄存器写入参数,完成GPIO的初始化,这里的GPIO 端口使用“LEDx_GPIO_PORT”宏来赋值,也是为了程序移植方便。

  • 使用同样的初始化结构体,只修改控制的引脚和端口,初始化其它LED 灯使用的GPIO引脚。初始化函数如下:

void LED_Init(void)
{
 GPIO_InitTypeDef  GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	//使能PB端口时钟
 GPIO_InitStructure.GPIO_Pin =           	  LED3_GPIO_PIN|LED2_GPIO_PIN|LED1_GPIO_PIN;	//选择PB1,0,5
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB1,0,5
 GPIO_SetBits(GPIOB,LED3_GPIO_PIN|LED2_GPIO_PIN|LED1_GPIO_PIN);						 //PB.1,0,5 输出高
}

3.主函数main.c

int main()
{
	LED_Init();
	while(1)
	{
		LED1_ON;
		delay_ms(1000);
		LED1_OFF;
		delay_ms(1000);
		LED2_ON;
		delay_ms(1000);
		LED2_OFF;
		delay_ms(1000);
		LED3_ON;
		delay_ms(1000);
		LED3_OFF; 
		delay_ms(1000);
		LED_RED;
		delay_ms(1000);
		LED_GREEN;
		delay_ms(1000);
		LED_BLUE;
		delay_ms(1000);
		LED_YELLOW;
		delay_ms(1000);
		LED_PURPLE;
		delay_ms(1000);
		LED_CYAN;
		delay_ms(1000);
		LED_WHITE;
		delay_ms(1000);
		LED_RGBOFF;
	}
}
	

4.proteus仿真图
stm32实验报告(一):GPIO应用_第2张图片

5.调试验证

​ 在proteus里进行仿真,可以观察到7种颜色的灯来回闪烁,抓拍了两张(仿真过程中能够看到电平的变化,但是RGB的颜色并没有变化,难搞)
stm32实验报告(一):GPIO应用_第3张图片
stm32实验报告(一):GPIO应用_第4张图片

四、心得总结

此处省略好多字。。。。

第一次写博客,哪里肯定会有错误,还望读者批评指正。

源码放这里https://gitee.com/hree-2002/stm32-experiment/tree/master/%E5%AE%9E%E9%AA%8C%E4%B8%80

你可能感兴趣的:(stm32,单片机,arm,嵌入式硬件)