打印
[STM32F1]

MCU存储器映射

[复制链接]
403|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2023-8-14 11:14 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一.存储器映射
物理存储器和外设本身不具备地址,我们应该如何访问他呢。存储器映射是将逻辑地址空间映射到物理地址空间,以实现对物理存储器和外设的访问。这个映射过程是通过软件和硬件的协作来完成的。

以下是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

使用特权

评论回复
沙发
Undshing| | 2023-8-14 23:31 | 只看该作者
这个每一位都能映射到吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2028

主题

15903

帖子

14

粉丝