10.1国庆作业(cortexA7核LED灯实验)

文章目录

  • 作业内容
  • 思路分析
    • 1. 分析RCC章节
    • 2. 分析GPIO章节
  • 代码部分
    • gpio.h
    • gpio.c
    • main.c

作业内容

实现cortex-A7核LED灯的点亮与熄灭

思路分析

1. 分析RCC章节

设置GPIOE控制器使能:RCC_MP_AHB4ENSETR[4] = 1

2. 分析GPIO章节

设置GPIO模式寄存器为输出模式:
GPIOE_MODER[21:20]=01------>输出模式

设置GPIO输出类型寄存器为推挽输出:
GPIOE_OTYPER[10] = 0 ----->设置为推挽输出模式

设置GPIO输出速度寄存器为输出速率:
GPIOE_OSPEEDR[21:20] = 00 ----->设置为低速输出模式

设置GPIO禁止上下拉电阻:
GPIOE_PUPDR[21:20] = 00 ----->设置为禁止上下拉

设置GPIO输出数据寄存器输出高低电平,实现LED灯点亮核熄灭:
GPIOE_ODR[10] = 0 ----->设置PE10引脚输出低电平
GPIOE_ODR[10] = 1 ----->设置PE10引脚输出高电平

代码部分

gpio.h

#ifndef __GPIO_H__
#define __GPIO_H__

//1.RCC寄存器封装,用宏定义进行封装
#define RCC_MP_AHB4ENSETR (*(volatile unsigned int*)0x50000A28)

//2.GPIO寄存器进行封装,用结构体封装
typedef struct
{
	volatile unsigned int MODER; 	//00
	volatile unsigned int OTYPER; 	//04
	volatile unsigned int OSPEEDR; 	//08
	volatile unsigned int PUPDR; 	//0C
	volatile unsigned int IDR; 		//10
	volatile unsigned int ODR; 		//14
}gpio_t;
#define GPIOE ((gpio_t*)0x50006000)
#define GPIOF ((gpio_t*)0x50007000)

//LED1灯初始化
void LED1_init();
//LED1灯点亮
void LED1_ON();
//LED1灯熄灭
void LED1_OFF();
//LED2灯初始化
void LED2_init();
//LED2灯点亮
void LED2_ON();
//LED2灯熄灭
void LED2_OFF();
//LED3灯初始化
void LED3_init();
//LED3灯点亮
void LED3_ON();
//LED3灯熄灭
void LED3_OFF();

#endif

gpio.c

#include "gpio.h"

//LED1灯初始化
void LED1_init()
{
	//1.设置GPIOE时钟使能
	RCC_MP_AHB4ENSETR |= (0x1 << 4);
	//2.设置PE10引脚为输出模式
	GPIOE->MODER &= (~(0x1 << 21));
	GPIOE->MODER |= (0x1 << 20);
	//3.设置PE10引脚为推挽输出
	GPIOE->OTYPER &= (~(0x1 << 10));
	//4.设置PE10引脚为低速模式
	GPIOE->OSPEEDR &= (~(0x3 << 20));
	//5.设置PE10引脚禁止上下拉
	GPIOE->PUPDR &= (~(0x3 << 20));
}

//LED1灯点亮
void LED1_ON()
{
	//1.设置PE10引脚输出高电平
	GPIOE->ODR |= (0x1 << 10);
}

//LED1灯熄灭
void LED1_OFF()
{
	//1.设置PE10引脚输出低电平
	GPIOE->ODR &= (~(0x1 << 10));
}

//LED2灯初始化
void LED2_init()
{
	//1.设置GPIOF时钟使能
	RCC_MP_AHB4ENSETR |= (0x1 << 5);
	//2.设置PF10引脚为输出模式
	GPIOF->MODER &= (~(0x1 << 21));
	GPIOF->MODER |= (0x1 << 20);
	//3.设置PF10引脚为推挽输出
	GPIOF->OTYPER &= (~(0x1 << 10));
	//4.设置PF10引脚为低速模式
	GPIOF->OSPEEDR &= (~(0x3 << 20));
	//5.设置PF10引脚禁止上下拉
	GPIOF->PUPDR &= (~(0x3 << 20));
}

//LED2灯点亮
void LED2_ON()
{
	//1.设置PF10引脚输出高电平
	GPIOF->ODR |= (0x1 << 10);
}

//LED2灯熄灭
void LED2_OFF()
{
	//1.设置PF10引脚输出低电平
	GPIOF->ODR &= (~(0x1 << 10));
}

//LED3灯初始化
void LED3_init()
{
	//1.设置GPIOE时钟使能
	RCC_MP_AHB4ENSETR |= (0x1 << 4);
	//2.设置PE8引脚为输出模式
	GPIOE->MODER &= (~(0x1 << 17));
	GPIOE->MODER |= (0x1 << 16);
	//3.设置PE8引脚为推挽输出
	GPIOE->OTYPER &= (~(0x1 << 8));
	//4.设置PE8引脚为低速模式
	GPIOE->OSPEEDR &= (~(0x3 << 16));
	//5.设置PE8引脚禁止上下拉
	GPIOE->PUPDR &= (~(0x3 << 16));
}

//LED3灯点亮
void LED3_ON()
{
	//1.设置PE8引脚输出高电平
	GPIOE->ODR |= (0x1 << 8);
}

//LED3灯熄灭
void LED3_OFF()
{
	//1.设置PE8引脚输出低电平
	GPIOE->ODR &= (~(0x1 << 8));
}

main.c

#include "gpio.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
	int i,j;
	for(i = 0; i < ms;i++)
		for (j = 0; j < 1800; j++);
}

int main()
{
	LED1_init(); // LED1灯初始化
	LED2_init(); // LED2灯初始化
	LED3_init(); // LED3灯初始化

	while(1)
	{
		LED1_ON();
		delay_ms(1000);
		LED1_OFF();
		LED2_ON();
		delay_ms(1000);
		LED2_OFF();
		LED3_ON();
		delay_ms(1000);
		LED3_OFF();
	}
	return 0;
}

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