10.1 国庆特别篇——LED灯实验(A7核、M4核)

LED灯实验(A7核、M4核)

分析原理图

在扩展板通过丝印搜索LD1、LD2、LD3,得到引脚为LED1、LED2、LED3;
在这里插入图片描述

在转接板通过丝印搜索,找到三盏灯对应的引脚为PE10、PF10、PE8;
在这里插入图片描述

分析芯片手册

找出总线和GPIOx各组的基地址

在这里插入图片描述
在这里插入图片描述

RCC章节

RCC控制器给GPIOE、GPIOF使能

在这里插入图片描述

GPIO章节

GPIOx_MODER:GPIO模式寄存器----->设置为输出模式
GPIOx_OTYPER:GPIO输出类型寄存器----->设置为推挽/开漏输出
GPIOx_OSPEEDR:GPIO输出速度寄存器----->设置为输出速率
GPIOx_PUPDR:GPIO是否需要上下拉电阻
GPIOx_ODR:GPIO输出数据寄存器------>输出高低电平,实现LED灯点亮核熄灭

PE10分析

设置为输出模式,GPIOE_MODER第20,21位设置为01
在这里插入图片描述

设置为推挽输出模式,GPIOE_OTYPER第10位写0;
在这里插入图片描述

设置为低速输出模式,GPIOE_OSPEEDR第20,21位写00在这里插入图片描述

设置为禁止上下拉,GPIOE_PUPDR第21,20位写00;
在这里插入图片描述

GPIOE_ODR寄存器第10位写0输出低电平,写1输出高电平;
在这里插入图片描述

PE8 PF10同上分析

A7核代码示例

gpio.h
#ifndef __GPIO_H__
#define __GPIO_H__
#define RCC_AHB4_ENSETR  (*(volatile unsigned int*)0x50000A28)
#define GPIOE ((gpio_t*)0x50006000)
#define GPIOF ((gpio_t*)0x50007000)
typedef struct
{
	volatile unsigned int MODE; 	//00
	volatile unsigned int OTYPER; 	//04
	volatile unsigned int OSPEEDR; 	//08
	volatile unsigned int PURDR; 	//0C
	volatile unsigned int IDR; 		//10
	volatile unsigned int ODR; 		//14
}gpio_t;
void LED1_init();
void LED1_on();
void LED1_off();

void LED2_init();
void LED2_on();
void LED2_off();

void LED3_init();
void LED3_on();
void LED3_off();
#endif
gpio.c
#include "gpio.h"
void LED1_init()
{
	RCC_AHB4_ENSETR |= (0x1 << 4);
	GPIOE->MODE &= (~(0x3<<20));
	GPIOE->MODE |= (0x1<<20);
	GPIOE->OTYPER &= (~(0x1<<10));
	GPIOE->OSPEEDR &= (~(0x3)<<20);
	GPIOE->PURDR &= (~(0x3 << 20));
}
void LED1_on()
{
	GPIOE->ODR |= (0x1<<10);
}
void LED1_off()
{
	GPIOE->ODR &= (~(0x1<<10));
}
void LED2_init()
{
	RCC_AHB4_ENSETR |= (0x1 << 5);
	GPIOF->MODE &= (~(0x3<<20));    
	GPIOF->MODE |= (0x1<<20);       
	GPIOF->OTYPER &= (~(0x1<<10));  
	GPIOF->OSPEEDR &= (~(0x3)<<20);     
	GPIOF->PURDR &= (~(0x3 << 20)); 

}
void LED2_on()
{
	GPIOF->ODR |= (0x1<<10);
}
void LED2_off()
{
	GPIOF->ODR &= (~(0x1<<10));
}
void LED3_init()
{
	RCC_AHB4_ENSETR |= (0x1 << 4);
	GPIOE->MODE &= (~(0x3<<16));
	GPIOE->MODE |= (0x1<<16);
	GPIOE->OTYPER &= (~(0x1<<8));
	GPIOE->OSPEEDR &= (~(0x3)<<16);
	GPIOE->PURDR &= (~(0x3 << 16));
}
void LED3_on()
{
	GPIOE->ODR |= (0x1<<8);
}
void LED3_off()
{
	GPIOE->ODR &= (~(0x1<<8));
}

M4核代码示例

在CubeMx中创建项目导入Keil
在main.c中添加功能代码

while (1)
  {
    /* USER CODE END WHILE */
		HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_SET);
		HAL_Delay(500);
		HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_RESET);
		
		HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_SET);
		HAL_Delay(500);
		HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_RESET);
		
		HAL_GPIO_WritePin(GPIOE, GPIO_PIN_8, GPIO_PIN_SET);
		HAL_Delay(500);
		HAL_GPIO_WritePin(GPIOE, GPIO_PIN_8, GPIO_PIN_RESET);

    /* USER CODE BEGIN 3 */
  }

实验现象

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不知名社畜L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值