【STM32F407学习笔记】初识STM32F4

1. 存储器组织结构

STM32内部的程序存储器(FLASH)、数据寄存器(RAM)、寄存器和IO端口都排列在同一个顺序的4GB的地址空间内,我们编程时也是依据此地址来找到相应寄存器操作。存储器、寄存器本身不具有地址信息,它们的地址由厂商或用户分布。

序号用途地址范围
Block0FLASH/SRAM0x0000 0000~0x1FFF FFFF(512M)
Block1SRAM0x2000 0000~0x3FFF FFFF(512M)
Block2片上外设0x4000 0000~0x5FFF FFFF(512M)
Block3保留0x6000 0000~0x7FFF FFFF(512M)
Block4保留0x8000 0000~0x*FFF FFFF(512M)
Block5保留0xA000 0000~0xCFFF FFFF(512M)
Block6保留0xD000 0000~0xDFFF FFFF(512M)
Block7Cortex-M4内核外设0xE000 0000~0xFFFF FFFF(512M)

组织结构如图中所示
在这里插入图片描述

  • 程序存储器(FLASH)Block0(0x0000 0000~0x1FFF FFFF)内部功能划分
    Block0功能划分

  • 数据存储器(SRAM)Block1(0x2000 0000~0x3FFF FFFF)内部功能划分
    Block1用于设计片内的数据存储器(SRAM),这一部分相当于电脑的内存条。程序运行的局部变量,堆栈等都存储在这个范围内。

  • 外设Block2(0x4000 0000~0x5FFF FFFF)内部功能划分
    Block2用于设计片上的外设寄存器,根据外设的总线速度不同,Block2被分成了APB和AHB两部分,其中APB又被分为APB1和APB2,AHB分为AHB1和AHB2。速度:AHB2>AHB1>APB2>APB1。

    Block2功能划分

    • STM32外设寄存器地址映射
      在这里插入图片描述
      通过上表,片上外设区分为四条总线,根据外设速度不同,不同总线挂载这些不同的外设。APB总线下挂在低速外设,AHB总线挂载高速外设。如APB1总线下的第一个外设就是TIM2,它所占据的地址范围是0x4000 0000-0x4000 03FF,那么在这个范围内TIM2的寄存器地址又是怎么映射的呢?
      如图中所示为TIM2到TIM5寄存器的映射在这里插入图片描述第一列表示寄存器的偏移地址,我们就是根据这个寄存器偏移地址得到寄存器的地址。这个“偏移地址”是相相对于外设基地址的偏移量。例如外设TIM2的地址范围是0x4000 0000~0x4000 03FFF,那么TIM2的基地址就是0x4000 0000。类似于外设基地址的定义,总线基地址是总线地址范围的最低地址。TIM2的部分寄存器映射表如下所示:
      在这里插入图片描述
      根据上表可以总结:
      外设寄存器地址=外设基地址+对应寄存器偏移地址
      既然得到了寄存器的地址,那么我们就可以直接操作寄存器来配置外设了,例如:我们需要配置GPIOA端口都输出高电平,我们寄存器怎么操作?
      找到GPIOA的端口置位寄存器:
      在这里插入图片描述
      BR0~ B15:复位IO口,BS0~ BS15:置位IO口

      1. 寄存器名称
        寄存器位图,首先要看的就是寄存器的名称。本土中寄存器位:GPIO端口置位/复位寄存器(GPIOx_BSRR)(x=A,…,I),说明GPIOA、GPIOB、…、GPIOI都有这个寄存器
      2. 寄存器偏移地址和复位值
        外设寄存器地址=外设基地址+寄存器偏移地址
        则GPIOA_BSSR=0x4002 0000+0x18=0x40020018。
        复位值就是芯片复位后,该寄存器的默认值,GPIOA_BSSR复位后都是0。
      3. 寄存器位表
        寄存器位表可以得到寄存器用了多少位,STM32的寄存器都是32位,也就是4个字节,但不是所有寄存器都将这32位用完,有些只用了一部分。也可以知道位权限:“w”可写,“r”可读,“rw”可读可写,很明显GPIOx_BSSR是只写寄存器。
      4. 位功能描述
        详细介绍了寄存器每一位的功能以及用法。

      那么可以使用这段代码将GPIOA的端口设置输出高电平:

      *(uint32_t*)(0x40020018)=0xFF;//设置GPIOA输出高电平
      

      在“stm32f4xx.h”中将这些寄存器全部封装。

2. 标准库对寄存器的封装

2.1总线基地址和外设基地址的封装

STM32库函数为了让编程更加方便,他们把总线基地址和外设基地址都以相应的宏定义起来,总线或外设都以它们的名字作为宏名,如图中所示:
在这里插入图片描述

2.2 外设寄存器的封装

为了方便的访问寄存器,引入C语言中的结构体语法对寄存器进行封装,如图中所示:
在这里插入图片描述
这段代码声明了GPIO_TypeDef的结构体类型,结构体内有8个成员变量,变量名正好对应寄存器名。C语言语法规定,结构体内变量的存储空间是连续的,其中32位的变量占用4个字节,16位的变量占用2个字节。
在这里插入图片描述
这段代码用GPIO_TypeDef类型定义一个指针GPIOx,并让指针指向地址GPIOH_BASE,然后访问它的各个寄存器,设置值。更进一步,我们直接用宏定义好GPIO_TypeDef类型的指针,而且指针指向各个GPIO端口的首地址,使用时我们直接使用宏访问寄存器即可。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
我很高兴为您解答有关STM32F407学习笔记的问题。根据引用和引用中的内容,学习STM32F407可以使用CubeMax和Keil这两款软件。CubeMax是一个方便易用的工具,可以帮助您进行单片机的开发和编程。Keil是一款集成开发环境(IDE),可以用于编写、调试和下载嵌入式软件。 在学习过程中,您可以根据引用的建议,收藏您经常使用的芯片,例如STM32F407,以便下次使用更加方便。 对于学习STM32F407的详细内容和步骤,我建议您参考引用中提到的PPT和引用中提到的学习笔记。这些资料可能包含了关于STM32F407的基本知识、GPIO和按键的使用等内容。您可以根据这些资料逐步学习和实践。 在学习过程中,如果您遇到问题或有任何疑问,可以向您的学长们求助或在实验室中寻求帮助。他们可以提供补充的知识和指导,并纠正您可能存在的错误。 最后,我希望您的STM32F407学习之旅能够顺利进行,并祝您在电赛国赛中取得优异的成绩!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [STM32F407学习笔记(1)基于hal库,CubeMX以及keil5的基本使用。](https://blog.csdn.net/qq_63466056/article/details/127707521)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值