一.存储器映射
物理存储器和外设本身不具备地址,我们应该如何访问他呢。存储器映射是将逻辑地址空间映射到物理地址空间,以实现对物理存储器和外设的访问。这个映射过程是通过软件和硬件的协作来完成的。
以下是STM32F407ZGT6的存储器映射表:
二.配置
这里我们用正点原子战舰开发板STM32F407ZGT6来实验,LED灯为F9
新建完工程后,这里我们添加上启动程序,和CORE文件
我们使用HSI(内部高速时钟),默认已经在system_stm32f4xx.c中配置好了
第一步,进行GPIOF的时钟使能
查看手册,GPIOF是挂载在AHB1总线上
所以如下配置
#define RCC_BASE 0x40023800
#define AHB1_OFFSET 0x30
第二步配置GPIOF的寄存器
GPIO的基地址如下:
#define GPIOF_BASE 0x40021400
#define GPIOF_MODER_OFFSET 0x00
#define GPIOF_ODR_OFFSET 0x14
三.实践
全部代码如下
#define RCC_BASE 0x40023800
#define AHB1_OFFSET 0x30
#define GPIOF_BASE 0x40021400
#define GPIOF_MODER_OFFSET 0x00
#define GPIOF_ODR_OFFSET 0x14
#define DELATY 2000000 // 时间
int main()
{
// 配置时钟GPIOF
*((volatile int *)(RCC_BASE + AHB1_OFFSET)) |= 0x00000020;
// 配置模式
*((volatile int *)(GPIOF_BASE + GPIOF_MODER_OFFSET)) |= 0x00040000;
*((volatile int *)(GPIOF_BASE + GPIOF_ODR_OFFSET)) |= 0x00000200;
while (1)
{
*((volatile int *)(GPIOF_BASE + GPIOF_ODR_OFFSET)) &= ~(0x00000200);
for (int i = 0; i < DELATY; i++)
;
*((volatile int *)(GPIOF_BASE + GPIOF_ODR_OFFSET)) |= 0x00000200;
for (int i = 0; i < DELATY; i++)
;
}
}
四.现象
————————————————
版权声明:本文为CSDN博主「HongCode嵌入式」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_53560602/article/details/132069104
|