目录
仅供参考
判断什么是嵌入式系统(嵌入式的定义)
主流嵌入式处理器
ARM系列、MIPC、PowerPC
嵌入式系统的特点
专用性,可裁剪性,可靠性,具有较长的生命周期;
嵌入式处理器的层次结构
片内存储器<—>片外存储器<—>外部存储器
ARM架构(功能)
分类
Cortex-A
高端,基于虚拟内存的操作系统和用户应用
一般带有存储管理单元MMU,兼容ARM MPCore多核技术。
Cortex-R
实时领域嵌入式
Cortex-M
低端控制领域
低功耗低成本高性价比的应用
嵌入式开发
交叉开发环境
由宿主机、目标机以及他们之间的连接构成
宿主机
用于嵌入式系统开发的计算机
目标机
所/被开发的嵌入式系统,是嵌入式软件的实际运行环境。
连接方式
物理连接
宿主机与目标机上的一定物理端口通过物理线路连接在一起
逻辑连接
宿主机与目标机之间按照某种通信协议建立起来的连接
keil mdk特点
自动配置生产启动代码
强大的设备模拟器
优秀的RealView
优秀的性能分析器
集成的Flash烧写模块
专业的本地化技术支持和服务
嵌入式测试方法
黑盒测试(功能测试)
边界测试
极限测试
健壮性测试
性能测试
白盒测试(结构测试)
语句/路径测试
判断/分支覆盖
条件覆盖
Cortex-M3组成结构
主要有Cortex-M3内核和调试系统两大部分组成
内核
CM3Core(中央处理核心)
NVIC(嵌套向量中断控制器)
SYSTICK(系统定时器)
MPU(存储保护单元)
Bus Matrix(总线矩阵)
Cortex-M3总线接口类型
(前四个外部总线与总线矩阵相连)
I-code总线
在此地址空间内执行取值操作。
D-code总线
在此地址空间内执行数据访问操作。
系统总线
访问片上SRAM、片上外设、片外RAM、片外扩展设备等,既可以传送指令也可以传送数据。系统总线上所有的数据传送都是对齐的。
外部私有外设总线
用于访问私有外设,主要是调试器件。
调试访问端口总线DAP
专用于挂接调试接口,例如SWJ-DP和SW-DP。
指令系统
CISC和RISC两类
指令格式
操作码字段(表征指令的操作功能和特性)
操作数字段(表征参与操作的操作数或操作数的地址)
Thumb-2指令集
可以实现ARM指令的所有功能,可以独立工作,而且增加了12条新指令,改进了代码性能和代码密度之间的平衡,在保持接近16位Thumb指令集的密度的同时获得了近乎32位ARM指令集的性能。
Thumb-2指令集>Cotrex-M3>Thumb指令
操作模式和特权分级
特权级和用户级,线程模式和处理者模式,两种模式的切换。
特权分级
特权级
用户级
特权级 | 用户级 | |
异常handler的代码 | Handler模式 | 错误 |
主应用程序的代码 | 线程模式 | 线程模式 |
操作模式
线程模式
处理者模式
操作模式和特权级别之间的切换(p98有解释)
双堆栈机制
Cortex-M3的堆栈是一个字对齐的“满递减”栈,即该堆栈向下(低地址方向)生长且堆栈指针SP指向最后一个被压入堆栈的字数据。当执行下一次压栈操作(如PUSH指令)时,SP先自减4,再写入新的数据,如图所示;
当执行下一次出栈操作(如POP指令)时,先从SP处取出字数据,SP再自增4,如图所示。
Cortex-M3有两个SP,也就是说,它支持双堆栈:主堆栈和进程堆栈,由控制寄存器的CONTROL[0]决定当前选择使用哪一个堆栈。
CONTROL[0]决定特权级别
CONTROL[1]决定堆栈指针(0——都只能使用MSP,1——进程改用PSP,Handler模式永远使用MSP)——双堆栈机制可以防止用户程序的堆栈错误破坏OS(操作系统)使用的堆栈
存储器系统
Cortex-M3存储器从最低地址0x00000000到最高地址0xFFFFFFFF,其寻址空间总共4GB。
存储格式
大端格式(“高低低高”)
小端格式(高字节数据放高地址,低字节数据放低地址—“高高低低”)
cortex-m3支持的存储格式(大小端都支持,推荐使用小端)
STM32开发方法
寄存器开发
库函数开发
中间件开发
时钟系统
输入时钟
四种时钟源:
高速外部时钟(外部晶振)
通过一系列步骤获取系统时钟SYSCLK(p154)
高速内部时钟(片内RC振荡器)
上电开始即为初始的系统时钟
低速外部时钟(外部晶振)
主要提供给实时时钟模块
低速内部时钟(片内RC振荡器)
提供给实时时钟模块和看门狗模块
系统时钟
系统时钟SYSCLK由多路选择器SW根据用户设置选择PLLCLK、HSE或HSI中的一路输出而得。SYSCLK的最高频率可达72MHz(通常也工作在72MHz),是STM32F103大部分部件的时钟来源。通常,STM32F103从上电开始,选用HSI作为初始的系统时钟。在完成初始化后,一般选用更加稳定可靠的HSE作为系统时钟的来源。
由系统时钟分频得到的其他时钟
HCLK
FCLK
PCLK1
PCLK2
SDIOCLK
FSMCCLK
STCLK
TIMXCLK
TIMxCLK
ADCCLK
存储器启动
启动设置
STM32F103微控制器有两个启动引脚BOOT0和BOOT1。
怎么启动
通过设置这两个引脚电平的高低,可以将STM32F103微控制器存储空间的起始地址0x00000000映射到不同存储区域的起始地址。
从哪里启动
从用户flash启动
BOOT0=0,BOOT1不管,0x00000000->0x08000000(用户Flash起始地址)
从系统flash启动
BOOT0=1,BOOT1=0,0x00000000->0x1FFFF000(系统Flash起始地址)
从片内SRAM启动
BOOT0=1,BOOT1=1,0x00000000->0x20000000(片内SRAM起始地址)
GPIO
基本功能
实现微控制器与外部环境的数字交换
工作原理
提供7X16=112个多功能双向I/O引脚(GPIOX,X=A、B、C、D、E、F、G)
内部结构
输出驱动器
输入驱动器
工作模式
普通推挽输出(该模式下,引脚可以输出低电平(0)和高电平(Vdd),用于较大功率驱动的输出)
普通开漏输出(该模式下,引脚只能输出低电平(0),如果想输出高电平(外接上拉电源的电压)需要外接上拉电阻和上拉电源)
复用推挽输出(该模式下,引脚不再是普通的I/O。它不仅具有推挽输出的特点,而且还使用片内外设的功能)
复用开漏输出(该模式下,引脚不再是普通的I/O。它不仅具有开漏输出特点,而且还使用片内外设功能)
上拉输入(用于默认上拉至高电平输入)
下拉输入(用于默认下拉至低电平输入)
浮空输入(用于不确定高低电平输入)
模拟输入(用于外部模拟信号输入)
输出速度
2MHz(可用作连LED、蜂鸣器等外部设备的普通输出引脚,USART复用功能输出引脚)
10MHz(I2C复用功能的输出引脚)
50MHz(SPI复用功能的输出引脚,FSMC复用功能连接存储器的输出引脚)
复用功能重映射
在基于STM32微控制器的应用开发中,用户根据实际需求可以把某些外设的复用功能从默认引脚转移到备用引脚上。
外部中断映射和事件输出
当STM32F103微控制器的某个I/O引脚被映射为外部中断线后,该I/O引脚就可以成为一个外部中断源,可以在这个I/O引脚上产生外部中断实现对用户STM32运行程序的交互。
STM32F103微控制器的所有I/O引脚都具有外部中断能力。
STM32F103微控制器几乎每个I/O引脚(除端口F和G的引脚外)都可用作事件输出。
GPIO相关库函数
初始化函数
GPIO_InitTypeDef GPIO_InitStructure;初始化结构体
GPIO_InitStructure.GPIO_Pin定义引脚
GPIO_InitStructure.GPIO_Mode定义引脚工作状态
GPIO_InitStructure.GPIO_Speed定义引脚速率
GPIO_Init(GPIOx,&GPIO_InitStructure);根据GPIO_InitStructure中指定的参数初始化外设GPIOx寄存器
输入
模式
上拉输入GPIO_Mode_IPU(用于默认上拉至高电平输入)
下拉输入GPIO_Mode_IPD(用于默认下拉至低电平输入)
浮空输入GPIO_Mode_IN_FLOATING(用于不确定高低电平输入)
模拟输入GPIO_Mode_AIN(用于外部模拟信号输入)
GPIO_SetBits(GPIOx,GPIO_Pin)指定引脚置高电平
GPIO_ResetBits(GPIOx,GPIO_Pin)指定引脚低电平
GPIO_Write(GPIOx,value)指定端口写入数据
输出
GPIO_Mode_Out_OD:开漏输出
GPIO_Mode_Out_PP:推挽输出
GPIO_Mode_AF_OD:复用开漏输出
GPIO_Mode_AF_ PP:复用推挽输出
定时器
主要特点 | 基本定时器TIM6/7 | 通用定时器TIM2~5 | 高级定时器 TIM1/8 |
内部时钟CK_INT的来源TIMxCLK | APB1分频器输出 | APB1分频器输出 | APB2分频器输出 |
内部预分频器的位数(分频系数范围) | 16位(1~65536) | 16位(1~65536) | 16位(1~65536) |
内部计数器的位数(计数范围) | 16位(1~65536) | 16位(1~65536) | 16位(1~65536) |
更新中断和 DMA | 有 | 有 | 有 |
计数方向 | 向上 | 向上、向下、双向 | 向上、向下、双向 |
外部事件计数 | 无 | 有 | 有 |
基本定时器只具备最基本的定时功能
通用定时器除此之外主要测量输入脉冲的频率和脉冲宽度以及输出PWM脉冲等场合,还具有编码器接口
高级定时器除了具有通用定时器的所有功能外,还可以被看作是一个分配到6个通道的三相PWM发生器。
(建议把书上看一遍)
中断(这个对着书看7.1、7.2、7.3)
一个微控制器的中断系统通常包括硬件(中断控制器)和软件(中断服务函数)两部分。
当出现了某个特殊情况(或者称为“事件”)时,CPU会中止当前程序的执行,转而去执行该事件的处理程序(即中断处理或中断服务程序),待中断服务程序执行完毕,再返回断点继续执行原来的程序,这个过程称为中断。
内部中断
特点:由处理器内部的事件或异常触发。例如,时钟中断、DMA 完成中断等。
触发方式:通过设置寄存器或特定事件发生时自动触发。
优先级设置:内部中断的优先级可以通过设置中断向量表或特定寄存器进行配置。
NVIC嵌套向量中断控制器
·支持84个异常,包括16个内部异常和68个非内核异常中断。
·使用4位优先级设置,具有16级可编程异常优先级。
·中断响应时处理器状态的自动保存无须额外的指令。
·中断返回时处理器状态的自动恢复无须额外的指令。
·支持嵌套和向量中断。
·支持中断尾链技术。
优先级
优先级分组
抢占优先级—标识了一个中断的抢占式优先响应能力的高低,决定了是否会有中断嵌套发生
子优先级—仅在抢占优先级相同时才有影响,标识了一个中断非抢占式优先响应能力的高低
优先级实现
设置NVIC_PriorityGroup_x实现分组(x为抢占优先级的位数,抢占优先级的位数+子优先级的位数=4)
外部中断
在通用I/O引脚上产生中断/事件请求。
特点:由外部设备或外部引脚的状态变化触发。
触发方式:当外部引脚满足特定条件(如上升沿、下降沿、边沿触发等)时触发中断。
优先级设置:外部中断的优先级可以通过设置中断线的优先级和抢占优先级进行配置。
关于优先级设置和区分中断,可以按照以下步骤进行:
设置中断优先级:
使用 NVIC(Nested Vectored Interrupt Controller)设置中断优先级,其中每个中断通道都有一个优先级寄存器。
通过设置优先级寄存器的值来调整中断的优先级。
区分中断:
在中断服务程序(ISR)中,可以使用标志位或其他方法来区分不同的中断来源。
通过检查特定的中断标志位或寄存器状态来确定是哪个中断触发了 ISR。
引脚的映射
EXTI0~15对应Px0~15(x为A~G)
总结
STM32中断分为内部中断和外部中断,内部中断由处理器内部事件触发,外部中断由外部设备或引脚触发。优先级设置可以通过 NVIC 进行配置,而区分中断可以通过检查中断标志位或寄存器状态来实现。
DMA
是一种完全由硬件执行数据交换的工作方式。
特点
DMA一般用于高速传送成组数据的应用场合。
优点:
减轻了CPU的负担,提高了CPU使用率,提高了数据传输的效率,减少了用户开发的代码量。
弊端
由于DMA允许外设直接访问内存,从而形成在一段时间内对总线的独占,不适合硬实时。
传输模式
普通模式(结束时自动关闭,请求不被响应)
循环模式(结束时更新为初始状态)
库函数及其设置方式(p347,太多了……)
ADC
单次转换模式
ADC只进行一次转换,在转换完成后自动停止转换并输出结果。
该模式可通过软件触发(只适用于规则通道),也可通过外部触发启动(适用于规则通道或注入通道)。
一旦选择通道的转换完成,转换结果被存储在16位规则通道数据寄存器/注入通道数据寄存器中,转换结束/注入转换结束标志被设置,如果使能了相应的标志位,则产生中断。
如果是ADC1或ADC3的规则通道,可以产生DMA请求。
连续转换模式:
当ADC转换一结束马上就启动另一次转换。
无论是对于规则通道还是注入通道,该模式既可通过软件触发启动,也可通过外部触发启动。
一旦选择通道的一次转换完成,转换结果将被存储在16位规则通道数据寄存器/注人通道数据寄存器中,转换结束/注入转换结束标志被设置,如果使能相应的标志位,则产生中断。
如果是ADC1或ADC3的规则通道,可以产生DMA请求。
UART
物理连接p427
UART互连
UART和RS232互连
协议实现
数据传输p431
SPI
一种串行外设接口协议,通常用于连接芯片和芯片之间的通信。在SPI中,主设备(Master)和从设备(Slave)之间进行双向数据传输。
物理层
四根信号线(实现SPI的互联)
SCK—时钟线,由主设备产生
MOSI—主出从入
MISO—主入从出
SS/CS—SPI从设备选择信号线
协议层
时序图
数据格式
UART、SPI、I2C
发送和接收数据的方法
库函数
对应通道
实验
步骤
流程图
实验报告
核心功能源码