01-STM32基础

01-认识STM32

1. 概述

1.1 术语名词

单片机    MCU    微控制器     内核     片上外设     STM32单片机    ARM公司   ST意法半导体公司

单片机:

  • 是一个俗名,单片就是一颗芯片,机就是计算机,就是一颗芯片级别的计算机。
  • 相对于传统个人计算机,单片机是一个麻雀虽小五脏俱全的,计算机,在一颗芯片也有
  • CPU功能电路、有类似硬盘功能flash电路、有类似内存功能RAM电路。 至于类似网卡功能电路、类似声卡功能电路、类似USB功能电路等等这些根据单片机价格 功能来决定,有些单片机有 有些没有。

微控制器、MCU、单片机:

  • 其实是一个东西。
    • 微控制器:是学名;
    • MCU(Mirco Control Unit ):是缩写,微控制单元;
    • 单片机:是它的俗名。

内核:core 这个如果是指的硬件,就是相当于说CPU,执行代码就是靠这个。

片上外设:芯片上,除了CPU以外的功能单元电路。学习单片机,除了掌握芯片里一些通用东西 主要是学习这个单片机芯片上,相关片上外设编程编程,能够熟练做到这些,就能针对性开发电子产品

ARM公司:是一家专门设计CPU的公司,赚钱方式 授权和版税

  • A(Application Processor),以前专指移动处理器,后来又扩展到服务器和网络处理器领域。
  • R(Real Time),主要用于汽车,控制,固态硬盘,调制解调器等实时性需求较强的领域。
  • M(MCU),微控制器,领域更广

ST意法半导体公司:

  • STM32单片机,是ST公司(意法半导体公司),开发出来系列单片机芯片在STM32单片机里,CPU电路是ARM公司技术,其余电路都是ST公司设计,ST公司和ARM合作关系每年都要给技术专利费,ARM给ST提供CPU授权和技术支持

1.2 STM32

STM32 是 STMicroelectronics( ST) 的一系列 32 位微控制器, 其基于 ARM Cortex-M 系列的处理器内核设计。它们广泛应用于各种嵌入式系统, 如物联网设备、 汽车电子、 工业自动化等领域。

Cortex-M 系列被设计为满足实时操作系统的需求, 用于低成本低功耗小尺寸的微控制器设备
在这里插入图片描述

1.2.1 STM32 的型号介绍
  • “ST” 是指制造商 STMicroelectronics 的缩写。

  • “M” 表示其是基于 ARM 的 Cortex-M 系列核心。

  • “32” 则代表其为 32 位 微控制器(使用32个比特位来表示一个地址)。

  • STM32 的常见系列
    在这里插入图片描述

  • STM32 系列微控制器的命名方式:
    在这里插入图片描述

1.2.2 STM32F103ZET6
  • “STM32”: STMicroelectronics 公司的产品, 基于 ARM Cortex-M 内核的 32 位微控制器。
  • “F”: 表示该微控制器属于 STM32 的 F(Foundation) 系列。
    • G系列:通用,是F系列的替代,性能更优秀;
    • F系列:主流,性能不是非常强大,性价比高;
    • H系列:高性能,贵;
    • L系列:低功耗,主要用于穿戴、手环等产品(电池供电);
    • W系列:无线,MCU中集成了无线通信的基带。
  • “103”: 表示该微控制器属于 103 系列, 这一系列的微控制器具有相对较高的主频, 丰富的内部外设以及适中的内存容量。
  • “Z”: 表示该微控制器 144 引脚。
  • “E”: 512K 闪存。
  • “T”: 表示该微控制器的封装类型是 LQFP。
  • “6”: 表示该微控制器的工作温度范围是工业级别, 即-40℃ 到 85℃。

用最小的电路组成单片机可以工作的系统称为最小系统。

stm32 芯片型号: stm32f103zet6 最小系统有 5 部分组成(电源电路、 时钟电路、 boot 电路、 下载/调试接口、 复位电路)

1.3 STM32芯片架构

我们看到的 STM32 芯片是已经封装好的成品,主要由内核和片上外设组成。若与电脑类比,内核与外设就如同电脑上的 CPU 与主板、内存、显卡、硬盘的关系。

STM32F103 采用的是 Cortex-M3 内核,内核即 CPU,由 ARM 公司设计。ARM 公司并不生产芯片,而是出售其芯片技术授权。芯片生产厂商(SOC)如 ST、TI、Freescale,负责在内核之外设计部件并生产整个芯片,这些内核之外的部件被称为核外外设或片上外设。如 GPIO、USART(串口)、I2C、SPI 等都叫做片上外设。
在这里插入图片描述

芯片(这里指内核,或者叫 CPU)和外设之间通过各种总线连接,其中驱动单元有 4 个,被动单元也有 4 个,具体见下面系统架构图示。

1.4 系统架构

系统架构图示:
在这里插入图片描述

ICode 总线(ICode Bus) :

  • ICode 总线是一个专门 用于 CPU 从 Flash 内存中取指令的总线,它几乎每时每刻
    都需要被使用
    。 这条总线专门优化了指令的取得, 以提高 CPU 的性能。 专门用于从 Flash 内存或者其他指令存储器中获取指令, 支持 CPU 以最优化的方式取指。 该总线用于把指令从存储器传输到处理器核心, 以便执行, 主要面向读操作。
  • 驱动单元:
    • DCode 总线(DCode Bus):D表示data, 是一个专门用于 CPU 访问数据的总线, 可以从 Flash 内存或系统内存中读取数据。 用于 CPU 核心的数据访问, 包括对 Flash 内存和 RAM 的读写。 使数据可以并行地(与指令访问操作并行) 从存储器中读取或写入。为了避免访问冲突,在取数的时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数。
    • 系统总线 :系统总线主要是访问外设的寄存器,我们通常说的寄存器编程,即读写寄存器都是通过这根系统总线来完成的。
    • DMA 总线(DMA Bus) :DMA, 全称 Direct Memory Access, 是一种 让某些硬件子系统在内存和外设之间直接传输数据, 而无需处理器参与的技术。 在 STM32 中, DMA 总线主要用于 DMA 控制器和内存以及需要使用 DMA 服务的外设(如 USART、 SPI、ADC 等) 之间的数据传输。
    • 总线矩阵(Bus Matrix) :总线矩阵主要 用于在多个主设备(如 CPU、 DMA 等) 和从设备(内存和外设) 之间进行数据的路由和管理。 通过总线矩阵, 主设备可以 同时 并行 地访问从设备。
  • 被动单元:
    • FLASH:内部的闪存存储器 ,我们编写好的程序就放在这个地方。内核通过 ICode 总线来取里面的指令。
    • 内部的 SRAM:即我们通常说的 RAM,程序的变量,堆栈等的开销都是基于内部的SRAM。内核通过 DCode 总线来访问它。
    • FSMC:英文全称是 Flexible static memory controller,叫灵活的静态的存储器控制器,是 STM32F10xx 中一个很有特色的外设,通过 FSMC,我们可以扩展内存,如外部的SRAM,NANDFLASH 和 NORFLASH。但有一点我们要注意的是,FSMC 只能扩展静态的内存,即名称里面的 S:static,不能是动态的内存,比如 SDRAM 就不能扩展。
    • AHB 到 APB 的桥:从 AHB 总线延伸出来的两条 APB2 和 APB1 总线,上面挂载着 STM32 各种各样的特色外设。我们经常说的 GPIO、串口、I2C、SPI这些外设就挂载在这两条总线上,这个是我们学习 STM32 的重点,就是要学会编程这些外设去驱动外部的各种设备。

1.5 内部资源介绍

1)内核(core):32位,高性能ARM Cortex-M3处理器,时钟72M,实际可超频一点

2)IO口: STM32F103ZET6,144引脚,112个IO,大部分IO口都耐5V(模拟通道除外),支持调试:SWD 和 JTAG,SWD只要2根数据线

3)存储器容量512K FLASH,64K SRAM

4)时钟,复位和电源管理:

  • 2.0~3.6V电源和IO电压
  • 上电复位,掉中复位和可编程的电压监控
  • 强大的时钟系统
    • 4~16M的外部高速晶振
    • 内部8MHz的高速RC振荡器
    • 内部40KHz低速RC振荡器,看门狗时钟
    • 内部锁相环(PLL,倍频),一般系统时钟都是外部或者内部高速时钟经过PLL倍频后得到
    • 外部低速32.768K的品振,主要做RTC时钟源

5)低功耗:

  • 睡眠,停止和待机种低功耗模式
  • 可用电池为RTC和备份寄存器供电

6)AD:

  • 3个12位AD (18个外部测量通道)
  • 转换范围:0-3.6V(参考电源电压)
  • 内部通道可以用于内部温度测量
  • 内置参考中压

7)DA:2个12位DA

8)DMA:12个DMA通道(7通道DMA1, 5通道DMA2),挂在AHB

9)支持外设:定时器、ADC、DAC、SDIO、I2S、SPI、I2C 和 USART

10)定时器:11个定时器

  • 4个通用定时器,2个基本定时器,2个高级定时器,1个系统定时器,2个看门狗定时器

11)通信接口:13个通信接口

  • 2个I2C接口,5个串口,3个SPI接口,1个CAN2.0,1个USB FS,1个SDIO
  • 4个通用定时器
  • 2个基本

1.6 参考资料

  • 数据手册(DSxxx):规格书,产品的具体参数

  • 参考手册(RMxxx):产品的使用方法

ST官网:www.st.com 搜索 芯片型号:STM32F103ZET6,点击进入详细文档
在这里插入图片描述

在这里插入图片描述

1.6.1 数据手册和参考手册的对比

在这里插入图片描述

RM0008DS5792
类型Reference Manual参考手册Data Sheet数据手册
内容介绍芯片内部每一个模块的特性、工作原理、使用方法、编程方法引脚分配、电性能、封装尺寸
手册厚度1136页143页
适用范围整个STM32F1xx系列STM32F103xC, STM32F103xD,
STM32F103xE

2. stm32 启动过程

2.1 启动模式

在STM32F10xxx里,可以通过 BOOT[1:0] 引脚选择三种不同启动模式

在这里插入图片描述

跳帽: BOOT0: BOOT1: 0 0 启动方式从 Flash 中启动

在这里插入图片描述

2.2 stm32启动流程

2.2.1 启动文件

startup_stm32f10x_hd.s 文件,它里边使用 汇编语言 写好了基本程序,当STM32 芯片上电启动的时候,首先会执行这里的汇编程序,从而建立起 C 语言的运行环境,所以我们把这个文件称为启动文件。

启动文件主要功能总结如下,不用详细了解里面的代码:

  • 初始化堆栈指针 SP;
  • 初始化程序计数器指针 PC;
  • 设置堆、栈的大小;
  • 初始化中断向量表;
  • 配置外部 SRAM 作为数据存储器(这个由用户配置,一般的开发板可没有外部SRAM);
  • 调用 SystemInit() 函数配置 STM32 的系统时钟;
  • 设置 C 库的分支入口“__main”(最终用来调用 main 函数);

主要理解 最后两点,在启动文件中有一段复位后立即执行的程序

; Reset handler
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                IMPORT  SystemInit
                LDR     R0, =SystemInit
                BLX     R0               
                LDR     R0, =__main
                BX      R0
                ENDP
  • 开头的是程序注释,在汇编里面注释用的是“;”,相当于 C 语言的“//”注释符
  • 第二行是定义了一个子程序:Reset_Handler。PROC 是子程序定义伪指令。这里就相当于 C 语言里定义了一个函数,函数名为 Reset_Handler
  • 第三行 EXPORT 表示 Reset_Handler 这个子程序可供其他模块调用。相当于 C 语言的函数声明。关键字[WEAK] 表示弱定义,如果编译器发现在别处定义了同名的函数,则在链接时用别处的地址进行链接,如果其它地方没有定义,编译器也不报错,以此处地址进行链接。
  • 第四行和第五行 IMPORT 说明 SystemInit 和__main 这两个标号在其他文件,在链接的时候需要到其他文件去寻找。相当于 C 语言中,从其它文件引入函数声明。以便下面对外部函数进行调用。
  • 第六行把 SystemInit 的地址加载到寄存器 R0。
  • 第七行程序跳转到 R0 中的地址执行程序,即执行 SystemInit 函数的内容。
  • 第八行把 __main 的地址加载到寄存器 R0。
  • 第九行程序跳转到 R0 中的地址执行程序,即执行__main 函数,执行完毕之后就去到我们熟知的 C 世界,进入 main 函数。
  • 第十行表示子程序的结束。

翻译成 c 语言:

// Reset handler
void Reset_Handler()
{
    extern Reset_Handler;
    extern void __main();
    extern void SystemInit();
    SystemInit();
    __main();
}

SystemInit(); 
/*在这个函数主要进行时钟配置,把时钟由内部8M(RC振荡器) 配置成基于外部8M,CPU 72。
* 配置时钟树,让CPU发挥高性能。进入main函数之前,库会帮我配置时钟:
    * 外部的高速时钟可以取值为4~16M,一般选8M晶振,
    * 8M 经过PLL锁相环倍频器,可以让倍频系数值为9,这里出来PLLCLK锁相环时钟为最高72MHz,
    * 单刀三击开关选择PLLCLK作为SYSCLK系统时钟,系统时钟信号也是 72M Hz, 
    * AHB 和APB2预分频器分频里值是1,APB1预分器值是2,最终,
        * AHB 的HCLK时钟信号72M, 
        * APB1上 PCLK1是36M,
        * APB2上PCLK2是72M 
*/             
__main(); //注意这个函数不是C语言main,这个函数是C语言一个库函数,我们C语言的main只是这个函数的子函数,进入这个函数首先会执行 STM32的堆、栈的初始化,最后才调用C语言我们编写的main,进入C语言世界
2.2.2 流程

当STM32上电,就会发生复位,CPU首先执行启动文件里的复位中断函数 Reset_Handler,调用 SystemInit 函数初始化系统时钟,然后调用 C 库函数_main,最终调用 main 函数去到 C 的世界。

3. STM32开发环境搭建

3.1 安装 MDK Keil 软件

安装要点:

1)、右键管理员模式运行,安装路径不要带中文

在这里插入图片描述

2)、一路next,关键点截图

在这里插入图片描述

3.2 窗口问题

在这里插入图片描述

3.3 STM32F10X系列芯片支持包

选中芯片支持包:直接双击运行下一步

在这里插入图片描述

4. 创建模板工程

4.1 创建文件夹

新建 demo/User 文件夹,方便以后移植。

4.2 添加工程素材(库)

在这里插入图片描述

  • STM32F10x_StdPeriph_Lib_V3.5.0.zip
    • STM32F10x系列
    • std标准单词前缀
    • Periph:片上外设
    • lib 库
    • v版本3.50 这是标准库,3.50版本也是最新版本

1)、解压:挑选需要的素材

2)、剪切 Libraries 文件夹至 demo 文件夹下,与 User 同级目录

在这里插入图片描述

3)、3个.c 2个.h 文件剪切到 demo/User文件夹下

在这里插入图片描述

4)、MDK keil软件创建工程、选择芯片

在这里插入图片描述

5)、工程中新建文件夹

在这里插入图片描述

6)、添加工程素材

  • 工程中的 User 添加 3个.c 文件

    在这里插入图片描述

  • 工程中的 Lib 添加 demo\Libraries\STM32F10x_StdPeriph_Driver\src 路径下所有.c 文件

在这里插入图片描述

  • 工程中的 StartUp 添加 demo\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm 路径下的 startup_stm32f10x_hd.s 启动文件 文件

在这里插入图片描述
在这里插入图片描述

4.3 工程配置

因为添加的标准库是 STM32F10x 系列芯片,为了适配 更详细的 STM32F103ZET6 所以要添加宏 和头文件

4.3.1 添加2个全局宏

USE_STDPERIPH_DRIVER,STM32F10X_HD

在这里插入图片描述

4.3.2 添加4个头文件路径
  • stm32f10x_conf.h demo\User
  • misc.h等官方外设库头文件 demo\Libraries\STM32F10x_StdPeriph_Driver\inc
  • core_cm3.h demo\Libraries\CMSIS\CM3\CoreSupport
  • stm32f10x.h demo\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x

在这里插入图片描述

4.4 工程创建完成-编译

后续直接 复制使用即可,不用在创建工程

在这里插入图片描述

5. 第一个程序-点亮LED

5.1 原理图:

在这里插入图片描述

5.2 查询固件库手册

  • RCC_APB2PeriphClockCmd
  • GPIO_Init
  • GPIO_ResetBits

代码:

#include "stm32f10x.h"

// 经过原理图分析,PB5接D0 输出低电平小灯(LED 发光二极管)亮,高电平不亮
int main()
{//RCC reset clock contrl
	//第一步,开相关片上外设时钟,这里GPIO,所有的GPIO外设都在APB2时钟线上
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	//第二步,相关GPIO初始化
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	//引脚号
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //高低电平输出切换速度,10M
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO工作模式。一共有8种,其中4种输入和4种输出模式,配置成通用推挽输出
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_ResetBits(GPIOB, GPIO_Pin_5); // 让PB5输出低电平
	
	while(1);
}

6. 烧录方式

6.1 串口烧录

通过STM32串口,直接烧录,这种烧录方式,好处省钱,缺点只能把程序下载进去不能在线仿真调试,相对仿真器下载速度慢一些

1)、编译前设置生成HEX 文件

在这里插入图片描述

2)、使用 mcuisp.exe 烧录软件

在这里插入图片描述

6.2 仿真烧录

通过仿真器下载(STlink仿真器 JLink下载器 Ulink下载…),可以下载、也可以在线调试仿真、下载速度也快 缺点单独华清 20~100不等。 通过JTAG下载口进行下载

1)、编译程序

2)、ST-link 仿真器

在这里插入图片描述

3)、下载

在这里插入图片描述

  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值