STM32 粗浅笔记

STM32上电启动流程

1、上电复位

单片机正常工作需要稳定的时钟信号,在上电阶段,复位电路为单片机提供复位信号,让单片机在复位状态保持一段时间,等待时钟信号等稳定后然后退出复位状态,进入正常工作状态。

①系统刚上电时,VDD通过电阻R给电容C充电,电容C上面没有电荷积累,电容两端没有电压,复位引脚NRST上的电压小于有效复位电压,STM32处于复位状态,相当于短路,此时充电电流最大;
②随着电荷在电容C上的积累,电容两端的电压逐渐升高,复位引脚NRST上的电压大于有效复位电压时(STM32F103的有效复位电压=0.8V),退出复位状态,充电电流减小,充电的速率逐渐变缓;
③最终电容两端的电压等于VDD,此时电流为0。

常见的复位电路有RC复位电路,STM32的复位引脚低电平有效,常选用RC复位电路,由一个电阻和电容构成,如下图所示:
在这里插入图片描述

2、启动模式BOOT0、BOOT1 / 下载模式ICP、ISP、IAP

在没有外部时钟源接入或配置的情况下,HSI(High-Speed Internal)会自动成为上电时的系统时钟源。在系统启动阶段作为临时时钟源足够可靠,足以驱动CPU执行初始化代码。

STM32会在上电后的系统时钟的第4个上升沿将BOOT引脚的值锁存,并根据 BOOT0和BOOT1选择从哪块存储区开始启动。用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。

在这里插入图片描述
请添加图片描述
2.1 Flash memory启动,BOOT0 = 0

启动地址0x08000000是STM32内置的Flash 。 使用JTAG或者SWD模式下载程序时,就是ICP下载模式 (In Circuit Programing在电路编程)下载到这个里面,重启后也直接从Flash 启动程序。

ICP使用SWD接口进行烧录程序。常用的烧录工具为J-Link、ST-Link、Nu-Link。与之配套的烧录软件为J-Flash、NuMicro_ICP_Programming_Tool、st-link utility。使用硬件对应厂家的软件以及仿真器都可以烧录程序

2.2 System memory启动 BOOT0 = 0,BOOT1 = 1

启动地址:0x1FFF0000从系统存储器启动,这种模式启动的程序功能是由厂家设置的。STM32在出厂时,由ST在这个区域内部预置了一段BootLoader, 这是一块ROM,出厂后无法修改。我们选用这种启动模式时,是为了从串口ISP下载模式(In System Programing在系统编程)下载程序,因为在厂家提供的BootLoader 中,提供了串口下载程序的固件,可以通过这个BootLoader将程序下载到系统的Flash中。但是这个下载方式需要以下步骤:
1、将BOOT0设置为1,BOOT1设置为0,然后按下复位键,这样才能从系统存储器启动BootLoader
2、最后在BootLoader的帮助下,通过串口下载程序到Flash中
3、程序下载完成后,又有需要将BOOT0设置为GND,手动复位,

使用引导程序(bootloader)加上外围UART/USB等接口进行烧录。比如:利用 STC-ISP 对 STC芯片 编程 ,利用 FlyMcu 对 STM32 编程

2.3 SRAM启动 BOOT0 = 1,BOOT1 = 1

启动地址 0x20000000 内置SRAM,没有程序存储的能力,这个模式一般用于程序调试,假如我只修改了代码中一个小小的地方,然后就需要重新擦除整个Flash,比较的费时,可以考虑从这个模式启动代码(也就是STM32的内存中),用于快速的程序调试,等程序调试完成后,在将程序IAP下载模式(In applicating Programing在应用中编程) 下载到SRAM中。

IAP就是通过软件实现在线电擦除和编程的方法,IAP技术是从结构上将Flash存储器映射为两个存储体,当运行一个存储体上的用户程序时,可对另一个存储体重新编程,之后将程序从一个存储体转向另一个。

3、初始化SP、SP及中断向量表

接入电源后单片机便默认处于特权级线程模式(Privileged thread mode),跳转到存储有代码的存储介质(如FLASH)后,单片机首先找到的是中断向量表,首先将从地址 0x0000 0000 (定义的堆栈栈顶标号 __initial_sp )处取一个字4个字节,装载到堆栈指针R13(SP)(此模式下对应的是MSP,主堆栈指针)中,随后把地址 0x0000 0004 (复位程序 Reset_Handler )处的数据装载到程序计数器R15(PC)。

打开经过编译生成的 bin 文件,看到前两字(八字节)的内容如下(小端模式) 即 0x20000660 和 0x0800020D,下面在 map 文件(存放链接地址)中正是中断向量表的前两项内容

在这里插入图片描述

4、初始化系统时钟

下来执行 PC 指向的 Reset_Handler,并调用 SystemInit 初始化系统时钟

5、初始化堆栈并进入Main

执行完 SystemInit 后又调用了标准库中的 __main 函数:

在复位函数中,首先执行系统时钟初始化函数初始化系统时钟,然后跳转到_main(当然,在__main之前也可以再初始化其他外设,如初始化FSMC配置外部SRAM等)。

在__main函数中,会初始化内核的寄存器,如R0-R15,划分堆空间(如果使用到的话)和栈空间(栈空间是C语言程序能运行的必要条件,没有栈,C程序就无法运行),同时初始化程序数据,即将用户代码中的数据从FLASH中搬运到SRAM中,简单理解就是初始化全局变量(这也就是全局变量在C语言中不初始化也不会出现随机值的原因了)。

6.以上步骤执行完毕后,系统将会进入main函数。

6、startup启动文件解析

请添加图片描述

栈Stack
开辟栈的大小为 0X00000400(1KB),数据段名为 STACK, NOINIT 即不初始化,READWRITE可读可写, 8(2^3)字节对齐
__initial_sp紧挨着SPACE语句放置,表示栈的结束地址,即栈顶地址,栈是由高向低生长的。

在这里插入图片描述

堆Heap
开辟堆的大小为 0X00000200(512B),数据段名为 Heap, NOINIT 即不初始化,READWRITE可读可写, 8(2^3)字节对齐
__heap_base 表示堆的起始地址, __heap_limit 表示堆的结束地址。堆是由低向高生长的,跟栈的生长方向相反。

在这里插入图片描述

PRESERVE8 表示指定当前文件的推栈按照8字节对齐
THUMB 表示后面指令位THUMB指令

THUBM 是 ARM 以前的指令集, 16bit,现在 Cortex-M 系列的都使用 THUMB-2 指令集, THUMB-2 是 32 位的,
兼容 16 位和 32 位的指令,是 THUMB 的超集。

在这里插入图片描述

在这里插入图片描述

定义一个数据段名为RESET,DATA表示数据, READONLY表示只读
表示向量表的开始地址(全局属性)
表示向量表的结束地址(全局属性)
表示向量表的大小(全局属性)

在这里插入图片描述

中断向量表的第一句 0x0000 0000 存放的是__initial_sp栈顶的指针
中断向量表的第二句 0x0000 0004 存放的是Reset_Handler函数入口地址

从 WWDGT_IRQHandler 到 USBFS_IRQHandler,都是用户使用的。

  • 3、复位程序

在这里插入图片描述

定义一个数据段名为。text,CODE表示数据, READONLY表示只读

在这里插入图片描述

执行的第一个程序

Reset_Handler PROC :表示复位子程序开始
EXPORT Reset_Handler [WEAK] :表示声明一个标号为全局变量,并且可以用户自定义
IMPORT __main : 引入 _main函数
IMPORT SystemInit : 引入 SystemInit函数
LDR R0, =SystemInit” : 是将函数 SystemInit 的地址放到寄存器 R0 中保存
BLX R0” 是跳转到 R0 : 寄存器存储的地址处运行

B是直接跳转指令,
B后加L表示保存PC的值到寄存器 R14,可以在执行完跳转全部指令后返回跳转前的位置。
B后加X是表示根据跳转的地址改变当前的状态

LDR R0, =__main” : 此句是将 __main 函数的地址放到寄存器 R0中保存。

( 注意: __main 和 main 不是一个函数。__main 是库函数,用于由非C语言环境转换为C语言环境时使用的 )

BX R0 : 寄存器存储的地址处运行, 配置完后执行main函数,并且不用返回
ENDP : 结束

  • 4、中断服务函数

在这里插入图片描述

PROC : 一个新程序
EXPORT : 声明一个标号(可重定义)
B . : 表示无限循环
ENDP : 退出

  • 5、 用户堆栈初始化

在这里插入图片描述

ALIGN: 对指令或者数据存放的地址进行对齐,后面会跟一个立即数。缺省表示4 字节对齐。

在这里插入图片描述

如果DEF:__MICROLIB成立就把__heap_limit、__heap_base、__initial_sp声明为全局文件

如果没定义会执行__user_initial_stackheap PROC这段代码来初始化(我们都是会定义DEF:__MICROLIB这个的所以不会跑去执行下面这段代码区执行)

STM32时钟系统

1、时钟树

在这里插入图片描述

HSI(High speed internal clock)高速内部时钟,RC振荡器,频率约为8MHz。
HSE(High speed external clock)高速外部时钟,可接外部时钟源,频率范围为4MHz~16MHz。
LSI(Low speed internal clock)低速内部时钟,RC振荡器,频率约 为40kHz。
LSE(Low speed external clock)低速外部时钟,接频率为32.768kHz的石英晶体。
PLLCLK为锁相环倍频输出。
MCO: (Microcontroller Clock Outpu)可通过IO口输出时钟   

SYSCLK :系统时钟   
HCLK:外设时钟(系统时钟经过AHB分频得到,称AHB总线时钟、内核、内存和 DMA 使用)
PCLK1 :  APB1时钟(PCLK1)、APB2时钟(PCLK2)
SysTick:通过 8 分频后送给 Cortex 的系统定时器时钟。
FCLK :直接送给 Cortex 的空闲运行时钟 。Fclk为供给CPU内核的时钟信号,
	   我们所说的cpu主频为XXXXMHz,就是指的这个时钟信号,相应的,1/Fclk即为cpu时钟周期

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”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。

STM32中断

1、NVIC嵌套向量中断控制器

NVIC (Nested vectored interrupt controller)嵌套向量中断控制器。属于内核的器件,作用是对STM32中的中断进行管理,因为M3内核中的中断数量很多,当同时出现多个中断时,优先处理哪个中断以及那些中断不处理等,都要靠NVIC 进行控制。

M3 内核都是支持 256 个中断,其中包含了 16 个系统中断和 240 个外部中断,并且具有 256 级的可编程中断设置。但是对于ST公司来说,用不了M3内核中的所有中断以及中断优先级,进而对其进行了一定的裁剪。STM32F1中共有10个内核中断,60个外部中断,16个中断优先级。

抢占优先级、响应优先级

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 位响应优先级

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

2、EXIT外部中断

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()

STM32电源管理

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

1、功耗模式

  • 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引脚
上的上升沿将系统从待机模式唤醒) 
注:在系统复位时清除这一位。

Flsah

STM32 自带的Flsah 类似于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 

看门狗

由于单片机由于各方面原因造成程序进入死循环或者程序跑飞,程序的正常运行被打断,单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态。为了防止进入这个情况便产生了一种专门用于实时监测单片机程序运行状态的模块或者芯片,俗称看门狗。

根据功能不同,通常分为独立看门狗IWDG和窗口看门狗WWDG,独立看门狗受工作场合因素的影响会多一点,仅适用于一些对时间精度要求较低的场合,窗口看门狗适用于对时间精度高的场合。

1、独立看门狗 IWDG

独立看门狗实际是一个 12 位的递减计数器,当计数器的值从某个值一直减到0的时候,系统就会产生一个复位信号 ,CPU收到复位信号,系统复位重新运行。在计数没减到0之前,在寄存器IWDG_KR中写入0xAAAA, IWDG_RLR中的值就会被重新加载到计数器,从而避免产生看门狗复位,这个动作就是我们说的喂狗。

工作在主程序之外,能够完全独立工作,它的时钟是专用的低速时钟(LSI),由 VDD 电压供电, 在停止模式和待机模式下仍能工作,主要检测硬件的正常运行。

独立看门狗的时钟由独立的RC振荡器LSI提供,即使主时钟发生故障它依然可以运行。启用 IWDG后,LSI时钟会自动开启,无法停止可以重置。LSI经过一个8位的预分频器得到计数器时钟,LSI时钟频率并不精确。

在这里插入图片描述
橙色箭头:内部低速时钟LSI通过预分频后得到了分频后的时钟信号 ;
绿色箭头:该时钟信号驱动递减计数器,每来一个时钟,自减一个数,当自减到0后产生IWDG复位 ;
红色箭头:正常运行时,为了避免复位,可提前在重装寄存器写一个值,IWDG_RLR与定时器的ARR是一样的,当预先写好值之后,在运行过程中,在键寄存器里,写入一个特定的数据,控制电路进行喂狗,这时重装值就会复制到当前的计数器中,这样计数器就会回到重装值。

在这里插入图片描述
溢出时间计算公式 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。

2、窗口看门狗 WWDG

窗口看门狗是一个能产生系统复位信号和提前唤醒中断的6位计数器。 用于监测单片机程序运行时效是否精准,主要检测软件异常,一般用于需要精准检测程序运行时间的场合。

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

GPIO

1、结构框图

在这里插入图片描述
标注 “ FT ” 这代表着这个GPIO口时兼容3.3V和5V的;如果没有,就代表着不兼容5V。

4种输入模式 :浮空输入、上拉输入、下拉输入、模拟输入

4种输出模式 :开漏输出、复用开漏输出、推挽输出、复用推挽输出 
  • 1.1 浮空输入、上拉输入、下拉输入

浮空输入 没有上下拉电阻、上拉输入 打开对应的上下拉电阻,施密特触发器开,CPU可以读取 IDR输入数据寄存器
请添加图片描述

  • 1.2 模拟输入

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

请添加图片描述

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

开漏输出模式下,CPU通过设置位设置清除寄存器或者输出数据寄存器的值
复用开漏输出模式下,片上外设模块的复用功能输出来决定值,可以通过输入数据寄存器来读状态只可以输出强低电平,需要外部电阻拉高得到高电平

请添加图片描述


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

推挽输出模式下,CPU通过设置位设置清除寄存器或者输出数据寄存器的值
复用推挽输出模式下,片上外设模块的复用功能输出来决定值,可以输出强低也可以输出强高电平

请添加图片描述

2、寄存器

每个GPI/O端口有

2个16位配置寄存器(GPIOx_CRH、GPIOx_CRL) 
2个16位数据寄存器(GPIOx_IDR、GPIOx_ODR) 
一个32位置位/复位寄存器(GPIOx_BSRR)
一个16位复位寄存器(GPIOx_BRR)
一个32位锁定寄存器(GPIOx_LCKR)
  • 输入数据寄存器 IDR

在这里插入图片描述

  • 输出数据寄存器 ODR

在这里插入图片描述

  • 位/复位寄存器 BSRR

在这里插入图片描述

ADC

ADC模数转换器

USART/UART 通用同步/异步收发器

1、数据通信模式

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

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

2、结构框图

在这里插入图片描述

USART_SR 状态寄存器 ,USART_DR 数据寄存器

3、通信协议帧

请添加图片描述

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

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的调试工具。具体工作过程是通过串口发送命令给单片机,然后单片机收到命令之后调用单片机里面对应的相关函数并执行,同时支持返回结果

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 字节空间,每个区都有独立的寄存器对所连接的存储器进行配置

在这里插入图片描述

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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值