[STM32F4] stm32学习笔记---STM32F4知识

[复制链接]
 楼主| c17 发表于 2023-8-27 01:15 | 显示全部楼层 |阅读模式
一、STM32F4存储器映射
1、Cortex-M4存储器映射
存储器本身没有地址,给存储器分配地址的过程叫存储器映射
3681764ea330927f88.png

注:被控单元的FLASH,RAM和各类片上外设,这些功能部件共同排列在一个 4GB 的地址空间内,每个外设都有自己独有地址。我们在编程的时候,可以通过他们的地址找到他们,然后来操作他们

 楼主| c17 发表于 2023-8-27 01:15 | 显示全部楼层
9718264ea331c75938.png
Cortex-m4处理器的4GB存储空间从架构上被分为多个区域,每个区域对应一种推荐用途
 楼主| c17 发表于 2023-8-27 01:15 | 显示全部楼层
2、STM32F407存储器映射
5595364ea333748660.png
 楼主| c17 发表于 2023-8-27 01:15 | 显示全部楼层
5712064ea333d88390.png 注意:外设起始地址:0x4000 0000
 楼主| c17 发表于 2023-8-27 01:16 | 显示全部楼层
3、STM32F4 存储器映像和外设寄存器编址 4139264ea334e74ce6.png 参看STM32F4XX中文参考手册2.3节
 楼主| c17 发表于 2023-8-27 01:16 | 显示全部楼层
4、如何访问寄存器
以GPIOA寄存器组为例、如何读写ODR寄存器?

已知GPIOA的起始地址为0x40020000
各寄存器的偏移地址如下:

MODER; /*Address offset: 0x00 */
OTYPER; /*Address offset: 0x04 */
OSPEEDR; /*Address offset: 0x08 */
PUPDR; /*Address offset: 0x0C */
IDR; /*Address offset: 0x10 */
ODR; /*Address offset: 0x14 */
BSRR; /*Address offset: 0x18 */
LCKR; /*Address offset: 0x1C */
 楼主| c17 发表于 2023-8-27 01:16 | 显示全部楼层
4.1、第一种方式
对地址进行宏定义
  1. #define     GPIOA_BASE        ( (unsigned int ) 0x40020000 )
  2. #define     GPIOA_ODR         ( GPIOA_BASE  +  0x14 )
 楼主| c17 发表于 2023-8-27 01:17 | 显示全部楼层
读操作
  1. val  = *(unsigned int *) GPIOA_ODR  ;
 楼主| c17 发表于 2023-8-27 01:17 | 显示全部楼层
写操作
  1. *(unsigned int *)  GPIOA_ODR = val  ;
 楼主| c17 发表于 2023-8-27 01:17 | 显示全部楼层
改进
  1. #define     GPIOA_ODR    ( *(unsigned int *) ( GPIOA_BASE  +  0x14 ))
  2. val  = GPIOA_ODR  ;    //读
  3. GPIOA_ODR = val  ;     //写
 楼主| c17 发表于 2023-8-27 01:17 | 显示全部楼层
4.2、第二种方式
用结构体封装寄存器
用上面的方法去定义地址,还是稍显繁琐、根据我们每一类外设对应的寄存器组地址都是连续增长的特点,我们引入 C 语言中的结构体语法对寄存器进行封装。
 楼主| c17 发表于 2023-8-27 01:17 | 显示全部楼层
  1. typedef struct {
  2.         uint32_t                MODER;                 /*Address offset: 0x00 */
  3.         uint32_t                OTYPER;         /*Address offset: 0x04 */
  4.         uint32_t                OSPEEDR;         /*Address offset: 0x08 */
  5.         uint32_t                PUPDR;                 /*Address offset: 0x0C */
  6.         uint32_t                IDR;                 /*Address offset: 0x10 */
  7.         uint32_t                ODR;                 /*Address offset: 0x14 */
  8.         uint32_t                BSRR;                 /*Address offset: 0x18 */
  9.         uint32_t                LCKR;                 /*Address offset: 0x1C */
  10. } GPIO_TypeDef;

  11. #define     GPIOA_BASE        ( (unsigned int ) 0x40020000 )
  12. #define     GPIOA         ((GPIO_TypeDef *) GPIOA_BASE)
 楼主| c17 发表于 2023-8-27 01:18 | 显示全部楼层
注:我们访问GPIOA的控制寄存器组时、直接使用宏定义好 GPIO_TypeDef 类型的指针,而且指针指向 GPIOA端口的首地址,这样我们直接用宏GPIOA访问改外设的任意一个寄存器
“stm32f407xx.h”已经封装了所有的外设
GPIOA->MODER = 0x20 ;
GPIOA->OSPEEDR = 0x16 ;
 楼主| c17 发表于 2023-8-27 01:18 | 显示全部楼层
STM32F4启动流程详解
1、STM32F4启动流程
9296364ea33df0a83f.png
 楼主| c17 发表于 2023-8-27 01:18 | 显示全部楼层
注:Cortex-M4 的程序映像通常是从地址 0x00000000 开始的、系统复位后,处理器首先读取向量表中的前两个字(8 个字节),第一个字存入 MSP(主栈指针),第二个字为复位向量,它表示程序执行的起始地址(复位处理)
 楼主| c17 发表于 2023-8-27 01:18 | 显示全部楼层
 楼主| c17 发表于 2023-8-27 01:18 | 显示全部楼层
注:存放地址要为奇数(0x08000c59)
 楼主| c17 发表于 2023-8-27 01:19 | 显示全部楼层
1.1、STM32F4的启动模式
STM32的flash起始地址为0x08000000。CPU怎么从0x00000000处运行的?
 楼主| c17 发表于 2023-8-27 01:19 | 显示全部楼层
 楼主| c17 发表于 2023-8-27 01:19 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

c17

40

主题

312

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部
c17

40

主题

312

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部