上节回顾
STM32 | STM32时钟分析、GPIO分析、寄存器地址查找、LED灯开发(第二天) |
STM32 | Proteus 8.6安装步骤(图文并茂) |
一、 LED灯开发
1、理解led灯原理图
LED0连接在PF9
PF9输出低电平(0),灯亮;PF9输出高电平(1),灯灭;(低电平有效)
2、打开GPIOF组时钟
//将第5位置1 使能GPIOF组时钟
RCC_AHB1ENR |= (0x01<<5);
3、设置PF9灯为输出模式 输出推挽 上拉 速度(50MHZ)
4、通过GPIOF_BSRR控制LED灯亮与灭
【1】led.h
#ifndef __LED_H
#define __LED_H
#include "stm32f4xx.h"
#include "stdio.h"
#define RCC_AHB1ENR (*((unsigned int *)(0x40023800+0x30)))
#define GPIOF_MODER (*((unsigned int *)(0x40021400+0x00)))
#define GPIOF_OTYPER (*((unsigned int *)(0x40021400+0x04)))
#define GPIOF_OSPEEDR (*((unsigned int *)(0x40021400+0x08)))
#define GPIOF_PUPDR (*((unsigned int *)(0x40021400+0x0C)))
#define GPIOF_ODR (*((unsigned int *)(0x40021400+0x14)))
#define GPIOF_BSRR (*((unsigned int *)(0x40021400+0x18)))
void Led_Init(void);
#endif
嵌入式嘛,都离不开对寄存器的操作,每一个寄存器都有自己的地址,简单解读一下以上代码。
#define RCC_AHB1ENR (*((unsigned int *)(0x40023800+0x30)))
RCC_AHB1ENR 寄存器用于控制嵌入式系统的AHB1总线的时钟使能。
-
(*((unsigned int *)(0x40023800+0x30)))
:这是一个指针表达式,它把一个特定地址(0x40023800+0x30)转换为一个无符号整数指针,并将其赋值给 RCC_AHB1ENR 宏。
在嵌入式系统中对 GPIOF 寄存器进行编程的例子。它通过使用 C 语言中的预处理器 #define 指令,定义了一系列宏,每个宏对应着不同的 GPIOF 寄存器。这些宏允许我们方便地访问指定地址的寄存器,以控制嵌入式系统中的 GPIO (General Purpose Input/Output) 功能。
让我们逐个解释这些宏:
-
#define GPIOF_MODER (*((unsigned int *)(0x40021400+0x00)))
此宏定义用于访问 GPIOF 的 moder 寄存器。通过 (*((unsigned int *)(0x40021400+0x00))),我们可以将一个无符号整数指针转换为指向地址为 0x40021400+0x00 的位置,然后对其进行读取或写入操作。 -
#define GPIOF_OTYPER (*((unsigned int *)(0x40021400+0x04)))
此宏定义用于访问 GPIOF 的 otyper 寄存器,使用方法同上。 -
#define GPIOF_OSPEEDR (*((unsigned int *)(0x40021400+0x08)))
此宏定义用于访问 GPIOF 的 ospeedr 寄存器,使用方法同上。 -
#define GPIOF_PUPDR (*((unsigned int *)(0x40021400+0x0C)))
此宏定义用于访问 GPIOF 的 pupdr 寄存器,使用方法同上。 -
#define GPIOF_ODR (*((unsigned int *)(0x40021400+0x14)))
此宏定义用于访问 GPIOF 的 odr 寄存器,使用方法同上。 -
#define GPIOF_BSRR (*((unsigned int *)(0x40021400+0x18)))
此宏定义用于访问 GPIOF 的 bsrr 寄存器,使用方法同上。
【2】led.c
#include "led.h"
/*********************************
引脚说明:
LED0 -- PF9
**********************************/
void Led_Init(void)
{
//将第5位置1 使能GPIOF组时钟
RCC_AHB1ENR |= (0x01<<5);
printf("RCC_AHB1ENR = -5%d",RCC_AHB1ENR);
//设置GPIOF9为输出模式
GPIOF_MODER &= ~(0x01<<19); //19位清0
GPIOF_MODER |= (0x01<<18); //18位置1
//设置GPIOF9为输出推挽
GPIOF_OTYPER &= ~(0x01<