[STM32F4] 物联网之STM32开发一

[复制链接]
2074|57
 楼主| xiyaoko2365 发表于 2022-11-20 23:08 | 显示全部楼层
控制处理器处于线程模式时,使用哪个堆栈:

        =0,使用MSP

        =1,使用PSP

        处理器模式时,固定使用MSP
24141637a42ed310f5.png
 楼主| xiyaoko2365 发表于 2022-11-20 23:09 | 显示全部楼层
Cortex-M0异常和中断:

Cortex-M0 处理器最多支持 32 个外部中断(通常称为 IRQ)和一个不可屏蔽中断(NMI),另外 Cortex-M0 还支持许多系统异常(Reset、HardFault、SVCall、PendSV、SysTick),它们主要用于操作系统和错误处理,参见下表
19761637a430f8c367.png
 楼主| xiyaoko2365 发表于 2022-11-20 23:09 | 显示全部楼层
 楼主| xiyaoko2365 发表于 2022-11-20 23:10 | 显示全部楼层
Cortex-M0指令集:

ARM 处理器支持两种指令集:ARM 和 Thumb。

EPSR 寄存器的 T 标志位负责指令集的切换,Cortex-M0只支持Thumb指令。

ARM指令集:32位精简指令集; 指令长度固定; 降低编码数量产生的耗费,减轻解码和流水线的负担。

Thumb指令集:Thumb指令集是ARM指令集的一个子集; 指令宽度16位; 与32位指令集相比,大大节省了系统的存储空间; Thumb指令集不完整,所以必须配合ARM指令集一同使用。

注:Thumb 与 ARM 相比,代码体积小了 30%,但性能也低了 20%。2003 年,ARM 公司引入了 Thumb-2 技术,具备了一些 32 位的 Thumb 指令,使得原来很多只有 ARM 指令能够完成的功能,用 Thumb 指令也可以完成了。Cortex-M0 基于的 ARMv6-M 体系结构,该体系结构的处理器只是用了16位Thumb指令和部分32位Thumb指令
 楼主| xiyaoko2365 发表于 2022-11-20 23:11 | 显示全部楼层
认识STM32

内容概述:

STM32的应用

STM32产品的介绍

STM32产品命名规范

STM32F0体系架构

STM32:从字面上来理解,ST 是意法半导体,M 是 Microelectronics 的缩写,32 表示32 位,合起来理解,STM32 就是指 ST 公司开发的 32 位微控制器。在如今的 32 位控制器当中,STM32 可以说是最璀璨的新星,它受宠若娇,大受工程师和市场的青睐,无芯能出其右。
 楼主| xiyaoko2365 发表于 2022-11-20 23:12 | 显示全部楼层
STM32的应用:

可穿戴 物联网 四轴飞行器 工业控制 医疗电子 汽车电子 电力系统 石油系统 燃气系统 …….
55665637a43a60d014.png
 楼主| xiyaoko2365 发表于 2022-11-20 23:12 | 显示全部楼层
STM32产品介绍:
25560637a43d097d97.png
 楼主| xiyaoko2365 发表于 2022-11-20 23:14 | 显示全部楼层
STM32产品命名规范:
83378637a44038a780.png
 楼主| xiyaoko2365 发表于 2022-11-20 23:14 | 显示全部楼层
STM32F0系统架构:
57472637a4457ee65e.png
 楼主| xiyaoko2365 发表于 2022-11-20 23:15 | 显示全部楼层
系统主要由以下几个模块组成 :

    二个主模块 :

        Cortex-M0 内核及先进高性能总线 (AHB bus)

        通用 DMA ( GP-DMA -- general-purpose DMA)

    四个从模块 :

        内部 FLASH

        内部SRAM

        专门用于连接 GPIO 口的 AHB2

        AHB 到 APB 的桥 , 所有的外设都挂在 APB 总线上
 楼主| xiyaoko2365 发表于 2022-11-20 23:15 | 显示全部楼层
STM32F0硬件平台介绍
60968637a44aa6cf1e.png
 楼主| xiyaoko2365 发表于 2022-11-20 23:17 | 显示全部楼层
STM32开发环境搭建

内容概要:

Keil MDK-ARM简介及安装

STM32CubeMX简介及安装

STM32F0存储器映射

STM32F0启动文件分析

Keil MDK-ARM简介及安装

。。。略

STM32CubeMX简介及安装

。。。略
 楼主| xiyaoko2365 发表于 2022-11-20 23:18 | 显示全部楼层
STM32F0存储器映射

内容概述:

Cortex-M0存储器映射

STM32F0存储器映射

寄存器的访问方式
 楼主| xiyaoko2365 发表于 2022-11-20 23:19 | 显示全部楼层
Cortex-M0存储器映射:

65815637a454b105c7.png

存储器本身没有地址,给存储器分配地址的过程叫存储器映射

注:被控单元的FLASH,RAM和AHB到APB的桥(即片上外设),这些功能部件共同排列在一个 4GB 的地址空间内。我们在编程的时候,可以通过他们的地址找到他们,然后来操作他们
 楼主| xiyaoko2365 发表于 2022-11-20 23:19 | 显示全部楼层
75222637a456fe0fd8.png
STM32F0存储器映射:
29854637a4584295f5.png
可寻址4GB字节空间

多达64KB片上闪存

多达8K的SRAM
 楼主| xiyaoko2365 发表于 2022-11-20 23:21 | 显示全部楼层
STM32F05x 存储器映像和外设寄存器编址:在芯片手册上可查到

72803637a45f5a6ce4.png
 楼主| xiyaoko2365 发表于 2022-11-20 23:21 | 显示全部楼层
寄存器访问:

以GPIOA寄存器组为例,读写ODR寄存器方法:

已知GPIOA的起始地址为0x48000000

各寄存器的偏移地址如下:

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 */
 楼主| xiyaoko2365 发表于 2022-11-20 23:22 | 显示全部楼层
第一种方式:对地址进行宏定义

#define     GPIOA_BASE        ( (unsigned int ) 0x48000000 )
#define     GPIOA_ODR         ( GPIOA_BASE  +  0x14 )

读操作
val  = *(unsigned int *) GPIOA_ODR  ;

写操作
*(unsigned int *)  GPIOA_ODR = val  ;
 楼主| xiyaoko2365 发表于 2022-11-20 23:23 | 显示全部楼层
改进

#define     GPIOA_ODR    ( *(unsigned int *) ( GPIOA_BASE  +  0x14 ))

val  = GPIOA_ODR  ;    //读
GPIOA_ODR = val  ;     //写
 楼主| xiyaoko2365 发表于 2022-11-20 23:24 | 显示全部楼层
第二种方式:用结构体封装寄存器

用上面的方法去定义地址,还是稍显繁琐、根据我们每一类外设对应的寄存器组地址都是连续增长的特点,我们引入 C 语言中的结构体语法对寄存器进行封装

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 ) 0x48000000 )
#define     GPIOA         ((GPIO_TypeDef *) GPIOA_BASE)
注:我们访问GPIOA的控制寄存器组时、直接使用宏定义好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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