STM32应用知识归纳

GPIO

1 GPIO 基本结构、工作模式

  • 1.1 基本结构
    在这里插入图片描述
    标注 “ FT ” 这代表着这个GPIO口时兼容3.3V和5V的;如果没有,就代表着不兼容5V。
  • 1.2 工作模式
4种输入模式 :浮空输入、上拉输入、下拉输入、模拟输入

4种输出模式 :开漏输出、复用开漏输出、推挽输出、复用推挽输出 
  • 1.2.1 浮空输入、上拉输入、下拉输入
    浮空输入 没有上下拉电阻、上拉输入 打开对应的上下拉电阻,施密特触发器开,CPU可以读取 IDR输入数据寄存器
    请添加图片描述
  • 1.2.2 模拟输入

模拟输入模式 一般测量模拟信号ADC、或者低功耗模式

请添加图片描述

  • 1.2.3 开漏输出、复用开漏输出

开漏输出模式下,CPU通过设置位设置/清除寄存器或者输出数据寄存器的值。

复用开漏输出模式下,片上外设模块的复用功能输出来决定值

可以通过输入数据寄存器来读状态

只可以输出强低电平,需要外部电阻拉高得到高电平

请添加图片描述


  • 1.2.4 推挽输出、复用推挽输出

推挽输出模式下,CPU通过设置位设置/清除寄存器或者输出数据寄存器的值。

复用推挽输出模式下,片上外设模块的复用功能输出来决定值

可以输出强低也可以输出强高电平
请添加图片描述

2 GPIO 寄存器

每个GPI/O端口有

2个16位配置寄存器(GPIOx_CRH、GPIOx_CRL) 
2个16位数据寄存器(GPIOx_IDR、GPIOx_ODR) 
一个32位置位/复位寄存器(GPIOx_BSRR)
一个16位复位寄存器(GPIOx_BRR)
一个32位锁定寄存器(GPIOx_LCKR)
  • 2.1 输入数据寄存器 IDR
    在这里插入图片描述

  • 2.2 输出数据寄存器 ODR

在这里插入图片描述

  • 2.3 位/复位寄存器 BSRR

设置 0 对 ODR无影响,设置 1 改变 ODR为高电平

在这里插入图片描述

3 GPIO 引脚功能

  • 端口复用功能

一个GPIO如果可以作用为内置外设的功能使用时, 就叫做复用功能。

作用是最大限度的利用端口资源

  • 重映射

部分重映射和完全重映射,需要打开AFIO时钟

外部中断

STM32F103的中断控制器支持19个外部中断/事件请求

线0~15:对应外部IO口的输入中断。
线16:连接到PVD输出线。
线17:连接到RTC闹钟事件。
线18:连接到USB唤醒事件。

GPIO的15个IO口 对应 16个中断线

但是 中断向量表 只分配了固定数量的 中断向量 ,也代表只能使用固定数量的 中断服务函数
在这里插入图片描述

7个中断向量

EXTI0_IRQn;
EXTI1_IRQn;
EXTI2_IRQn;
EXTI3_IRQn;
EXTI4_IRQn;
EXTI9_5_IRQn;
EXTI15_10_IRQn;7个中断向量,也就是只能使用7个中断服务函数

EXTI0_IRQHandler()
EXTI1_IRQHandler()
EXTI2_IRQHandler()
EXTI3_IRQHandler()
EXTI4_IRQHandler()
EXTI9_5_IRQHandler()
EXTI15_10_IRQHandler()

时钟系统

1 时钟树、时钟名词

在这里插入图片描述

1.1 五个时钟源

1、HSI(High speed internal clock)高速内部时钟,RC振荡器,频率约为8MHz。
2、HSE(High speed external clock)高速外部时钟,可接外部时钟源,频率范围为4MHz~16MHz。
3、PLLCLK为锁相环倍频输出。
4、LSI(Low speed internal clock)低速内部时钟,RC振荡器,频率约 为40kHz。
5、LSE(Low speed external clock)低速外部时钟,接频率为32.768kHz的石英晶体。
  • 1.2 时钟名词解释
SYSCLK :系统时钟     

HCLK:外设时钟(系统时钟经过AHB分频得到,称AHB总线时钟、内核、内存和 DMA 使用)

PCLK1 :  APB1时钟(PCLK1)、APB2时钟(PCLK2)

systickv :通过 8 分频后送给 Cortex 的系统定时器时钟。

FCLK :直接送给 Cortex 的空闲运行时钟 。Fclk为供给CPU内核的时钟信号,
	   我们所说的cpu主频为XXXXMHz,就是指的这个时钟信号,相应的,1/Fclk即为cpu时钟周期
	 
MCO: IO口 可输出时钟  
	 MCO是Microcontroller Clock Output的缩写,是微控制器时钟输出引脚

2 SYSCLK 系统定时器 / 滴答定时器

SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。常用作为延迟,或者实时系统的心跳时钟,这样节省MCU资源

3 定时器

  • 3.1 定时器结构图

在这里插入图片描述

定时器的时钟源 :1、内部时钟 CK_INT ;2、外部引脚ETR;3、定时器级联;4、通道输入

  • 3.2 通用定时器 TIME2 ~ 5

通用定时器时钟 挂在 APB1 时钟上

16位向上、向下、向上向下计数模式,自动重装载计数器

4个独立通道(输入捕获、输出比较、PWM、单脉冲模式输出)

因为默认调用Systemlnit函数情况下
SYSCLK =72M
AHB时钟 = 72M 
APB1时钟 = 36M( 此时APB时钟分频2)
所以 APB1的分配系数 = AHB / APB1时钟 = 2 
所以

通用定时器时钟  CK_INT = 2* 36M =72M

溢出时间(定时周期) = (arr + 1)*(psc + 1)/ tclk

系统时钟(一般为72MHZ) = 定时器分频数 * 计数值

假如定时器分频数为7200,
则定时器时钟为:72MHZ/7200=10KHZ,定时器每次计数时间间隔为 1/10000,
假如定时1,则要计数10000,因此计数器的最大计数值为9999,因为计数器从零开始计数。

4 RTC 实时时钟

BKP备份寄存器可以提供用户数据的寄存器,当VDD电源被切断,他们仍然由VBAT维持供电。在待机模式下被唤醒、系统复位、电源复位时,他们也不会被复位。

5 PWM 脉冲宽度调制

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。

单片机数据通信


并行通信:数据各个位同时传输
串行通信:数据按位顺序传输

同步通信:IIC、SPI、USART
异步通信:UART
半双工:IIC
全双工:UART、SPI
 
串行通信三种传送方式

单工:数据传输只支持数据在一个方向上传输
半双工:允许数据在两个方向上传输,在某一时刻,只允许数据在一个方向上传输
全双工:允许数据同时在两个方向上传输,它要求发送设备和接收设备都有独立的接收和发送能力。

1 通用同步异步收发器

  • 1.1 结构框图
    在这里插入图片描述

  • 1.2 寄存器

USART_SR 状态寄存器
USART_DR 数据寄存器 
  • 1.3 数据框图

请添加图片描述

异步通信帧结构:  
 1、起始位:
		 每帧以一个 START 位开始,并且始终为低电平。 
 2、数据位数据包:
		8位或者9位数据
		第9位是奇偶校验位
 3、STOP 位:
		可以是一位或两位。它在数据位包之后发送以指示帧的结束。停止位始终为逻辑高。
 
 奇偶校验位:
          用来表示发送数据逻辑高的数量添加在后,如果数据为偶数 偶校验:则是0,奇校验:则是1

2 IIC 两线式串行总线

请添加图片描述

  • IIC 物理层
IIC 物理层:

IIC只有两个总线: 
	双向的串行数据线 SDA
	串行时钟线 SCL

所有设备上接到总线的SDA上,设备时钟接到总线的SCL上。
是半双工的数据通信方式,多数用于 微控制器 和 外围器件 之间的主从通信、低速通信
  • IIC 协议层
IIC 协议层:

IIC 总线在传送数据过程中共有三种类型信号,开始信号、结束信号和应答信号。

1、开始信号:
	SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
	SCL = 1,SDA = 1,SDA = 0 
2、结束信号:
	SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。
	SCL = 1,SDA = 0 ,SDA = 1
3、应答信号:
	每发送一个字节(8个bit),一个字节传输的8个时钟后的第九个时钟期间
	接收器接收数据后必须回一个ACK应答信号给发送器,这样才能进行数据传输。
	应答 “0”,非应答 “1”

在这里插入图片描述

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

3 SPI

Serial Perripheral Interface的简称,是由Motorola(摩托罗拉)公司推出的一种高速、全双工的总线协议。
  • Standard SPI, Dual SPI, Quad SPI

Standard SPI:

标准SPI通常就称SPI,它是一种串行外设接口规范
CLK, /CS, DI, DO, /WP, /Hold
全双工模式,输入和输出可以同时进行(mosi,miso分别对应的是DI和DO)

Dual SPI:

CLK, /CS, IO0, IO1, /WP, /Hold
半双工模式,mosi和miso对应的是IO0和IO1,这样单次SPI的传输就可以传输2个Bit

Quad SPI:

CLK, /CS, IO0, IO1, IO2, IO3
半双工模式,Quad SPI增加了2个IO口(WP ,HOLD),增加的目的是将SPI的单次传输数据量加大到4个Bit

  • SPI时钟信号的相位和极性

时钟极性(CPOL)定义了时钟空闲状态电平:

CPOL=0,表示当SCLK=0时处于空闲态,所以有效状态就是SCLK处于高电平时
CPOL=1,表示当SCLK=1时处于空闲态,所以有效状态就是SCLK处于低电平时

时钟相位(CPHA)定义数据的采集时间。

CPHA=0,在时钟的第一个跳变沿(上升沿或下降沿)进行数据采样。,在第2个边沿发送数据
CPHA=1,在时钟的第二个跳变沿(上升沿或下降沿)进行数据采样。,在第1个边沿发送数据

例如:

Mode0:CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在上升沿(准备数据),(发送数据)数据发送是在下降沿。

Mode1:CPOL=0,CPHA=1:此时空闲态时,SCLK处于低电平,数据发送是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。

Mode2:CPOL=1,CPHA=0:此时空闲态时,SCLK处于高电平,数据采集是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。

Mode3:CPOL=1,CPHA=1:此时空闲态时,SCLK处于高电平,数据发送是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。

USMART调试组件

USMART是正点原子团队为其STM32开发平台开发的一种类似linux的shell的调试工具。具体工作过程是通过串口发送命令给单片机,然后单片机收到命令之后调用单片机里面对应的相关函数并执行,同时支持返回结果

FLASH

STM32 自带的FLASH 类似于EEPROM操作方式
STM32 的闪存模块由:主存储器、信息块、闪存存储器接口寄存器 3 部分组成。

1、 主存储器
该部分用来存放代码数据常数(如 const 类型的数据),
B0、 B1 都接GND 的时候,就是从 0X08000000 开始运行代码的。

2、信息块
该部分分为 2 个小部分
1、启动程序代码,是用来存储 ST 自带的启动程序, 用于串口下载代码,当 B0 接 V3.3, B1 接 GND 的时候,运行的就是这部分代码。
2、用户选择字节,则一般用于配置写保护、读保护等功能

3、闪存存储器接口寄存器
该部分用于控制闪存读写,对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理

1 寄存器

STM32 的闪存编程是由 FPEC(闪存编程和擦除控制器)模块处理的,这个模块包含 7 个 32 位寄存器

1、FPEC 键寄存器(FLASH_KEYR)
2、选择字节键寄存器(FLASH_OPTKEYR)
3、控制寄存器(FLASH_CR)
4、状态寄存器(FLASH_SR)
5、地址寄存器(FLASH_AR)
6、选择字节寄存器(FLASH_OBR)
7、写保护寄存器(FLASH_WRPR)

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

2 操作逻辑

STM32 复位后, FPEC 模块是被保护的,不能写入 FLASH_CR 寄存器 通过写入特定的序列到 FLASH_KEYR,寄存器可以打开 FPEC 模块(即写入 KEY1 和 KEY2),只有在写保护被解除后,我们才能操作相关寄存器

在编程过程中(状态寄存器FLASH_SR)的BSY 位为’ 1’ ) 的时候,任何读写闪存的操作都会使 CPU暂停,直到此次闪存编程结束 BSY 位为’ 0’

STM32 闪存的编程每次必须写入 16 位(不能单纯的写入 8 位数据哦!) 当 FLASH_CR 寄存器的 PG 位为’1’时,在一个闪存地址写入一个半字将启动一次编程,写入任何非半字的数据, FPEC 都会产生总线错误

STM32 的 FLASH 在编程的时候,也必须要求其写入地址的 FLASH 是被擦除了的(也就是其值必须是 0XFFFF),否则无法写入,在 FLASH_SR 寄存器的 PGERR 位将得到一个警告

写FLASH流程
1、检查 FLASH_CR 控制寄存器是否解锁,使解锁
2、检查 FLASH_SR 状态寄存器的 BUY位使为 03、检查 FLASH_CR 控制寄存器的 PG位使为 1 同时 BUY 位变为 14、等待BUY位为 05、读FLASH  

页擦除FLASH流程  
1、检查 FLASH_CR 控制寄存器是否解锁,使解锁
2、检查 FLASH_SR 状态寄存器的 BUY位使为 03、检查 FLASH_CR 控制寄存器的 PG位使为 1 同时 BUY 位变为 14、用 FLASH_CR  寄存器的 PER 位为 ”14、用 FLASH_AR 地址寄存器选择擦除的地址 
5、设置 FLASH_CR 寄存器的 STRT 位为’ 1
6、等待BUY位为 0 
7、读FLASH 

全擦除FLASH流程
1、检查 FLASH_SR 状态寄存器的 BUY位为 12、设置 FLASH_CR 寄存器的 MER 位为’ 1
3、设置 FLASH_CR 寄存器的 STRT 位为’ 1
4、等待BUY位为 0 
5、读FLASH 

NVIC 中断优先级管理

Cortex3 内核支持 256 个中断,其中 16 个内核中断和 240 个外部中断,并且具有 256级的可编程中断设置。

STM32没有使用 CM3 内核的全部东西,而是只用了它的一部分。

STM32 有 84 个中断,包括 16 个内核中断和 68 个可屏蔽中断,具有 16 级可编程的中断优先级。我们常用的就是这 68 个可屏蔽中断

在STM32F103 系列上面只有 60 个可屏蔽中断。STM32F107 系列有 68 个可屏蔽中断。

抢占优先级、响应优先级

STM32 的中断分组: STM32 将中断分为 5 个组,组 0 ~ 4。该分组的设置是由 SCB->AIRCR 寄存器的 bit10~8 来定义的。

AIRCR[10: 8]bit[7: 4]分配结果
01110: 40位抢占优先级,4 位响应优先级
11101: 31 位抢占优先级, 3 位响应优先级
21012: 22 位抢占优先级, 2 位响应优先级
31003: 13 位抢占优先级, 1 位响应优先级
40114: 04 位抢占优先级, 0 位响应优先级

两个中断的抢占优先级和响应优先级都是一样的话,哪个中断先发生就先执行
高的抢占优先级是可以打断正在进行的低抢占优先级中断的。
抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。

系统中断设置优先级

NVIC 中断管理函数主要在 misc.c 文件里面。

设置整个系统的中断优先级分组

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

这个函数的作用是对中断的优先级进行分组,这个函数在系统中只能被调用一次,一旦分组确定就最好不要更改。

每个中断设置优先级

NVIC 中断优先级

NVIC_InitTypeDef NVIC_InitStructure;  //创建中断优先级参数的结构体变量
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //对应的外部中断向量
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级 2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //响应优先级 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断
NVIC_Init(&NVIC_InitStructure); //中断优先级参数的所有结构体变量值 给 中断优先级寄存器

FSMC 静态存储控制器

FSMC,静态存储控制器,可以连接同步存储器、异步存储器、16 位 PC 存储器卡,

FSMC,接口支持包括 SRAM、NAND FLASH、NOR FLASH 和 PSRAM
STM32F1 的 FSMC 支持 8/16/32 位数据宽度

FSMC 外部设备

STM32 的 FSMC 将外部设备分为 3 类:

NOR/PSRAM 设备
NAND 设备
PC 卡设备

在这里插入图片描述

FSMC 外部设备地址映像,

STM32F1

FSMC 总共管理 1GB 空间,将外部存储器划分为 4 个存储块(Bank)每个固定大小为 256M 字节

FSMC 存储块 1(Bank1)被分为 4 个区,每个区管理 64M 字节空间,每个区都有独立的寄存器对所连接的存储器进行配置

在这里插入图片描述

ADC

请点击此处查看ADC原理

寄存器

ADC_CR1 控制寄存器

在这里插入图片描述

ADC_CR1 的 SCAN 位:
	1,扫描模式,0,关闭扫描模式。由软件设置和清除
	
ADC_CR1 的 位[1916]:
	设置 ADC 的操作模式

在这里插入图片描述
ADC_CR2 控制寄存器

在这里插入图片描述

ADON 位 :开关 AD 转换器

CONT 位:设置是否进行连续转换,如使用单次转换,所以 CONT 位必须为 0

ALIGN 位:设置数据对齐,0 使用右对齐

EXTSEL[20] :选择启动规则转换组转换的外部事件

在这里插入图片描述
ADC_SMPR1 采样事件寄存器

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

ADC_SMPR2 采样事件寄存器

在这里插入图片描述

在这里插入图片描述
ADC_SMPR1 设置转换通道10~17,
ADC_SMPR2 设置转换通道0~9

ADC_SQR1 规则序列寄存器
ADC_DR 规则数据寄存器
规则序列中的 AD 转化结果都将被存在这个寄存器里面

注入通道的转换结果被保存在 ADC_JDRx

ADC_SR 状态寄存器

在这里插入图片描述

电源管理

模式进入唤醒简介
睡眠模式WFI / WFE任一中断 / 唤醒事件内核停止
停止模式PDDS位 + LPDS位 + SLEEPDEEP位 + WFI / WFE外部中断所有的时钟都已停止
待机模式PDDS位 + SLEEPDEEP位 + WFI / WFEWKUP 上升沿、RTC闹钟、NRST引脚、IWDG复位1.8V电源关闭

1.1 待机模式

在这里插入图片描述

电源控制寄存器——PWR_CR

1 
PDDS:掉电深睡眠
与LPDS位协同操作
0:当CPU进入深睡眠时进入停机模式,调压器的状态由LPDS位控制。
1:CPU进入深睡眠时进入待机模式。

电源控制/状态寄存——PWR_CSR

0 
WUF:唤醒标志 
该位由硬件设置,并只能由POR/PDR(上电/掉电复位)或设置电源控制寄存器(PWR_CR)的
CWUF位清除。
0:没有发生唤醒事件
1:在WKUP引脚上发生唤醒事件或出现RTC闹钟事件。
注:当WKUP引脚已经是高电平时,在(通过设置EWUP位)使能WKUP引脚时,会检测到一个额外的
事件。

位 8 
EWUP:使能WKUP引脚 
0:WKUP引脚为通用I/O。WKUP引脚上的事件不能将CPU从待机模式唤醒
1:WKUP引脚用于将CPU从待机模式唤醒,WKUP引脚被强置为输入下拉的配置(WKUP引脚
上的上升沿将系统从待机模式唤醒) 
注:在系统复位时清除这一位。

看门狗

STM32 内部自带了 2 个看门狗:独立看门狗(IWDG)和窗口看门狗(WWDG)。

看门狗的最作用

在启动正常运行的时候,系统不能复位。在系统跑飞(程序异常执行)的情况,系统复位程序重新执行

独立看门狗(IWDG)

STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效

  • IWDG 寄存器与功能原理

键值寄存器 IWDG_KR
重装载寄存器 IWDG_RLR,0~11位有效。具有写保护功能,要操作先取消写保护。
预分频寄存器 IWDG_PR ,0~2位有效。具有写保护功能,要操作先取消写保护
状态寄存器 IWDG_SR,1位有效

  • 独立看门狗功能描述

在键值寄存器(IWDG_KR)中写入 0xCCCC
,开始启用独立看门狗。此时计数器开始从其复位值OXFFF递减,当计数器值计数到尾值Ox000时会产生一个复位信号(IWDG_RESET)。
在键值寄存器IWDG KR中写入OxAAAA(通常说的喂狗),自动重装载寄存器IWDG_RLR的值就会重新加载到计数器,从而避免看门狗复位。
如果程序异常,就无法正常喂狗,从而系统复位。

  • IWDG 操作步骤

第一步:取消寄存器写保护,IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

第二步:设置独立看门狗的预分频系数和重装载值

溢出时间计算公式 Tout=((4×2^prer) ×rlr) /40

其中 Tout 为看门狗溢出时间(单位为 ms),prer 为看门狗时钟预分频值(IWDG_PR 值),范围为 0~7,rlr为看门狗的重装载值(IWDG_RLR 的值) 比如我们设定 prer 值为 4,rlr 值为 625,那么就可以得到Tout=64×625/40=1000ms,这样, 看门狗的溢出时间就是 1s。

第三步:重载计数值喂狗 IWDG_ReloadCounter(); 向 IWDG_KR 写入 0XAAAA
第四步: 启动看门狗 向 IWDG_KR 写入 0XCCCC
第五步: 创建喂独立看门狗的函数接口,void IWDG_Feed(void)

窗口看门狗(WWDG)

和独立看门狗相比,窗口开门狗是有一个上下限,(W[6:0]是窗口看门狗的上窗口,下窗口值是固定的(0X40))。当在这个上下限以外喂狗,则都会复位,增加了安全性。

IAP

一片STM32芯片的Code(代码)区内一般只有一个用户程序。而IAP方案则是将代码区划分为两部分,两部分区域各存放一个程序,一个叫bootloader(引导加载程序),另一个较user application(用户应用程序)。

请添加图片描述

请添加图片描述

1、需要考虑 用户程序 需要在0x08000000基础上,加上偏移量 作为用户程序的栈顶地址
2、用户程序,需要加上,让自己 falsh 偏移

SCB->VTOR = FLASH_BASE | 0x10000; // Vector Table Relocation in Internal FLASH

3、在bootloader 上的接收内存上 __ attribute __ 使接收数据对齐

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值