打印
[STM32F4]

stm32学习笔记---STM32F4知识

[复制链接]
1155|66
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
c17|  楼主 | 2023-8-27 01:15 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一、STM32F4存储器映射
1、Cortex-M4存储器映射
存储器本身没有地址,给存储器分配地址的过程叫存储器映射


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

使用特权

评论回复
沙发
c17|  楼主 | 2023-8-27 01:15 | 只看该作者

Cortex-m4处理器的4GB存储空间从架构上被分为多个区域,每个区域对应一种推荐用途

使用特权

评论回复
板凳
c17|  楼主 | 2023-8-27 01:15 | 只看该作者
2、STM32F407存储器映射

使用特权

评论回复
地板
c17|  楼主 | 2023-8-27 01:15 | 只看该作者
注意:外设起始地址:0x4000 0000

使用特权

评论回复
5
c17|  楼主 | 2023-8-27 01:16 | 只看该作者
3、STM32F4 存储器映像和外设寄存器编址 参看STM32F4XX中文参考手册2.3节

使用特权

评论回复
6
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 */

使用特权

评论回复
7
c17|  楼主 | 2023-8-27 01:16 | 只看该作者
4.1、第一种方式
对地址进行宏定义
#define     GPIOA_BASE        ( (unsigned int ) 0x40020000 )
#define     GPIOA_ODR         ( GPIOA_BASE  +  0x14 )

使用特权

评论回复
8
c17|  楼主 | 2023-8-27 01:17 | 只看该作者
读操作
val  = *(unsigned int *) GPIOA_ODR  ;

使用特权

评论回复
9
c17|  楼主 | 2023-8-27 01:17 | 只看该作者
写操作
*(unsigned int *)  GPIOA_ODR = val  ;

使用特权

评论回复
10
c17|  楼主 | 2023-8-27 01:17 | 只看该作者
改进
#define     GPIOA_ODR    ( *(unsigned int *) ( GPIOA_BASE  +  0x14 ))
val  = GPIOA_ODR  ;    //读
GPIOA_ODR = val  ;     //写

使用特权

评论回复
11
c17|  楼主 | 2023-8-27 01:17 | 只看该作者
4.2、第二种方式
用结构体封装寄存器
用上面的方法去定义地址,还是稍显繁琐、根据我们每一类外设对应的寄存器组地址都是连续增长的特点,我们引入 C 语言中的结构体语法对寄存器进行封装。

使用特权

评论回复
12
c17|  楼主 | 2023-8-27 01:17 | 只看该作者
typedef struct {
        uint32_t                MODER;                 /*Address offset: 0x00 */
        uint32_t                OTYPER;         /*Address offset: 0x04 */
        uint32_t                OSPEEDR;         /*Address offset: 0x08 */
        uint32_t                PUPDR;                 /*Address offset: 0x0C */
        uint32_t                IDR;                 /*Address offset: 0x10 */
        uint32_t                ODR;                 /*Address offset: 0x14 */
        uint32_t                BSRR;                 /*Address offset: 0x18 */
        uint32_t                LCKR;                 /*Address offset: 0x1C */
} GPIO_TypeDef;

#define     GPIOA_BASE        ( (unsigned int ) 0x40020000 )
#define     GPIOA         ((GPIO_TypeDef *) GPIOA_BASE)

使用特权

评论回复
13
c17|  楼主 | 2023-8-27 01:18 | 只看该作者
注:我们访问GPIOA的控制寄存器组时、直接使用宏定义好 GPIO_TypeDef 类型的指针,而且指针指向 GPIOA端口的首地址,这样我们直接用宏GPIOA访问改外设的任意一个寄存器
“stm32f407xx.h”已经封装了所有的外设
GPIOA->MODER = 0x20 ;
GPIOA->OSPEEDR = 0x16 ;

使用特权

评论回复
14
c17|  楼主 | 2023-8-27 01:18 | 只看该作者
STM32F4启动流程详解
1、STM32F4启动流程

使用特权

评论回复
15
c17|  楼主 | 2023-8-27 01:18 | 只看该作者
注:Cortex-M4 的程序映像通常是从地址 0x00000000 开始的、系统复位后,处理器首先读取向量表中的前两个字(8 个字节),第一个字存入 MSP(主栈指针),第二个字为复位向量,它表示程序执行的起始地址(复位处理)

使用特权

评论回复
16
c17|  楼主 | 2023-8-27 01:18 | 只看该作者

使用特权

评论回复
17
c17|  楼主 | 2023-8-27 01:18 | 只看该作者
注:存放地址要为奇数(0x08000c59)

使用特权

评论回复
18
c17|  楼主 | 2023-8-27 01:19 | 只看该作者
1.1、STM32F4的启动模式
STM32的flash起始地址为0x08000000。CPU怎么从0x00000000处运行的?

使用特权

评论回复
19
c17|  楼主 | 2023-8-27 01:19 | 只看该作者

使用特权

评论回复
20
c17|  楼主 | 2023-8-27 01:19 | 只看该作者

使用特权

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

本版积分规则

c17

39

主题

311

帖子

1

粉丝