导图社区 嵌入式单片机
干货分享!我整理了关于嵌入式单片机STM32设计及应用技术重要知识,下图包括了系统概述 、结构和最小系统 、基于标准外设库的C语言程序设计基础 等方面的知识点,十分详细全面,快收藏加关注不迷路哦!
编辑于2019-05-20 07:59:20嵌入式单片机

1系统概述
选择题、填空题、简答题
嵌入式系统的定义 P1
目前嵌入式系统国内普遍认同的定义是:以计算机技术为基础,以应用为中心,软件硬件可剪裁,适合应用系统对功能可靠性、成本、体积、功耗严格要求的专业计算机系统。
嵌入式系统发展 P1
从单片机到嵌入式系统
从芯片级设计到系统设计
从单处理器设计到多处理器设计
子ARM Cortex-M3处理器的特点 P5
性能丰富成本低
低功耗
可配置性强
丰富的链接
STM32处理器的常用开发工具 P9
keil
IAR
Hitex
Rowley
2结构和最小系统
选择题、填空题、简答题
STM32系列命名规则 P11
1. 芯片系列:STM32代表ST品牌Cortex-Mx系列内核(ARM)的32位MCU。 2. 芯片类型:F——通用快闪,L——低电压(1.65~3.6V),W——无线系统芯片。 3. 芯片子系列:103——ARM Cortex-M3内核,增强型;050——ARM Cortex-M0内核;101——ARM Cortex-M3内核,基本型; 102——ARM Cortex-M3内核,USB基本型;105—ARM Cortex-M3内核,USB互联网型; 107——ARM Cortex-M3内核,USB互联网型、以太网型;215/217——ARM Cortex-M3内核,加密模块;405/407——ARM Cortex-M4内核,不加密模块等。 4. 引脚数目:R——64PIN,F——20PIN,G——28PIN;K——32PIN,T——36PIN,H——40PIN,C——48PIN,U——63PIN, O——90PIN,V——100PIN,Q——132PIN,Z——144PIN,I——176PIN。 5. Flash容量:B——128KB Flash(中容量),4——16KB Flash(小容量), 6——32KB Flash(小容量),8——64KB Flash(中容量),C——256KB Flash(大容量),D——384KB Flash(大容量),E——512KB Flash(大容量),F——768KB Flash(大容量),G——1MKB Flash(大容量)。 6. 封装信息:T——LQFP,H——BGA,U——VFQFPN,Y——WLCSP。 7. 工作温度范围:6——-40℃~85℃(工业级), 7——-40℃~105℃(工业级)。 8. 可选项:此部分可以没有,可以用于标示内部固件版本号。
引脚数目:R——64PIN; 64个引脚 封装信息:T——LQFP;薄型四方扁平式封装技术 Flash容量:B——128KB Flash(中容量)
STM32F103芯片的引脚功能 P12
电源
VDD_x,
VSS_x ,
VBAT,
VDDA,
VSSA
复位
NRST
时钟控制
OSC_IN
OSC_OUT
OSC32_IN
OSC32_OUT
启动配置
BOOT0
BOOT1(PB2)
输入输出口
PAx, PBx, PCx, PD2
存储器结构和映射 P14
STM32的时钟控制 P20
HSI
高速内部时钟信号 8MHz
HSE
高速外部时钟信号 4~25MHz
LSE
低速外部时钟信号 32.768MHz
LSI
低速内部时钟信号 30~60MHz
PLL
锁相环倍频输出 倍频HIS 和 HSE 最大不超72MHz
STM32F10x的复位形式 P22
电源复位
上电掉电复位
从待机模式中返回
系统复位
NRST引脚上的低电平(外部复位)
窗口看门狗计数终止(WWDG)复位
独立看门狗计数终止(IWDG)复位
软件复位(SW复位)
低功耗管理复位
备份区复位
只影响备份区域的寄存器
STM32F10x的启动配置 P23
从Flash启动
从系统存储器启动
从内置SRAM启动
最小系统定义及其组成部分 P23
定义
仅包含必需的元器件、仅可运行最基本软件的简化系统
组成
供电电路
微控制芯片
时钟电路
复位电路
启动配置电路
程序下载电路
2,4,8,9,10,11,12
子主题
总线系统构成
驱动单元
指令总线 ICode
将Cortex-M3内核的指令总线与Flash指令接口相连接。取指操作在该总线上进行。
数据总线 DCode
将Cortex-M3内核的数据总线与Flash数据接口相连接,用于常量加载和调试访问。
系统总线 System
将Cortex-M3内核的系统总线连接到总线矩阵,总线矩阵协调着内核和DMA间的访问
直接内存访问总线 DMA
将DMA的AHB主机接口连接到总线矩阵,总线矩阵协调着CPU的DCode和DMA到SRAM、内存和外设的访问。
被动单元
总线矩阵
3基于标准外设库的C语言程序设计基础
简答题、读程序题
关键字 P31
一类具有固定名称及特定含义的特 殊标识符,又叫保留字,编程时不 能另作他用。C语言中有32个关键字
数据类型12
char
double
enum
声明枚举类型
float
int
long
short
signed
声明有符号类型变量或函数
struct
声明结构体变量或函数
union
声明共用体(联合)数据类型
unsigned
声明无符号类型变量或函数
void
声明函数无返回值或无参数,声明空类型指针
控制语句12
for
do
while
break
continue
if
else
goto
无条件跳转语句(少用)
switch
case
default
return
存储类型4
auto
extern
声明变量是在其他文件中声明(也可看作是引用变量)
register
声明寄存器变量
static
声明静态变量
其他4
const
声明只读变量
sizeof
计算对象所占空间大小
typedef
给数据类型取别名 (不改数据量类型)
volatile
说明变量在程序执行中
运算符 P33
算数运算符
加减乘除求余自加自减等
比较运算符
大于小于等于不等于等
逻辑运算符
与 && 或 || 非!
位逻辑运算符
&
and
|
OR
~
NOT
^
XOR
<<
左移
<<
右移
指针 P38
专门用于表示地址的变量
指向数组元素的指针
int a[10]; int *p=NULL; //指针定义初始化 p=a; //a数组第0个元素的地址 //p指针指向数组a中第0个元素 //与p=&a[0]等价
p+i和a+i均表示a[i]的地址
*(p+i)与*(a+i) 都表示p+i 与a+i的内容
字符指针
字符串常量是由双引号括起来的字符序列,存储他的方法有两种
char s[]="Hello World!";
把字符常量存放在一个字符数组中
char *cp="Hello World!";
用字符指针指向字符串,通过指针访问存储区;但不可以用指针修改字符串常量
指针函数
当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数以用于需要指针或地址的表达式中。
int *pfun(int,int); //由于优先级,返回值为指针。
结构体 P40
子主题
3,4,5
4输入输出GPIO
选择题、填空题、读程序题、程序设计题
IO端口的模式 P53
输入浮空
端口在默认情况下什么都不接,呈高阻态。
输入上拉
输入高电平,接一个上拉电阻(保护作用),表示该端口默认情况输入为高电平
输入下拉
输入低电平,接一个下拉电阻(保护作用),表示该端口默认情况输入为低电平
模拟输入
用于ADC模拟输入
开漏输出
本身不输出电压,要想输出高电平接上拉电阻
推挽式输出
直接输出高低电压,低电平接地,高电平时输出电源电压,这种方式可不接上拉电阻
推挽式复用功能
片内外设
开漏复用功能
片内外设
GPIO相关功能寄存器P54
GPIOx_CRL 端口配置低寄存器
GPIOx_CRH 端口配置高寄存器
GPIOx_IDR 端口输入数据寄存器
GPIOx_ODR 端口输出数据寄存器
GPIOx_BSRR 端口位置为复位寄存器
GPI0x_BRR 端口位置位寄存器
GPIOx_LCKR 端口配置锁定寄存器
GPIO使用流程 P75
流程
声明GPIO初始化结构体GPIO_InitTypeDef
使能GPIO端口时钟 RCC_APB2PeriphClockCmd
填充GPIO初始化结构体参数 GPIO_Pin、GPIO_Speed、GPIO_Mode
完成GPIO端口设置 GPIO_Init
GPIO应用实例 P75
#include "stm32f10x.h" void GPIO_Config(void); viod delay(viod); int main(viod) { GPIO_Config(); //GPIO配置 while(1) { GPIO_ResetBit(GPIOA,GPIO_Pin_8); //低电平,点亮LED GPIO_ResetBit(GPIOD,GPIO_Pin_2); //低电平,打开蜂鸣器 delay(); GPIO_SetBit(GPIOA,GPIO_Pin_8); //高电平,熄灭LED GPIO_SetBit(GPIOD,GPIO_Pin_2); //高电平,关闭蜂鸣器 delay(); } } viod GPIO_Confit(viod) { GPIO_InitTypeDef GPIO_InitStructure: //声明GPIO结构体变量 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPI OA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //蜂鸣器 ——PA.2 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //输出速率 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED——PA.8 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); } void delay(void) { int i=0xffffff; while(i--); }
1,2,3,10,11,12
9模数转换器
选择题、填空题
ADC的性能指标 P209
分辨率
量化误差
偏移误差
满刻度误差
线性度
绝对精度
相对精度
转换速率
ADC的分类 P211
逐次逼近型
双积分型
电压-频率变换型
STM32所带的12位ADC是一种逐次逼近型模拟数字转换器。
STM32的ADC特性 P211
子主题
ADC的几种模式 P224
单次转换模式和连续转换模式
扫描模式
间断模式
注入组间断模式
规律组间断模式
双ADC模式
1,2,3
8直接存储器存储DMA
选择题、填空题
DMA的概念和传输过程 P181
DMA用来提供外设与外设之间、外设与存储器之间、存储器与存储器之间的高速数据传输,无需CPU干预,数据可以通过DMA快速传输,节省CPU的资源。
一个完整的DMA传输过程包括DMA请求、DMA响应、AMD传输、DMA结束等4个步骤。
STM32的DMA包含哪些结构 P181
2个DMA控制器
DMA1
7个独立的可配置通道
DMA2
5个独立可配置通道
每个通道用来管理来自于一个或多个外设对存储区访问的请求
外设
SPI
I2C
通用和高级定时器
ADC
DMA的主要特性 P181
DMA使用流程 P198
2,3
7通用同步/异步收发器USART
选择题、填空题
串行通信与并行通信 P150
串行通信是数据字节的各位一位一位地一次传送的通信方式。串行通信的速度慢,但占用的传输线条数少,适用于远距离的数据传送。 并行通信数据字节的各位同事传送的通信方式。并行通信的优点是数据传送速度快,缺点是占用的传输线条数多,适用于近距离通信。在通信距离比较远的情况下成本比较高。
串行通信的数据传输形式 P151
单工通信
数据只允许像一个方向进行传送。
半双工通信
数据允许向两个方向进行传送,但是传送数据的过程和接收数据的过程不能同时进行。
全双工通信
数据允许向两个方向进行传送,并且传送数据的过程与接收数据的过程可以同时进行。
USART的数据发送和接收(了解) P162
USART的使用流程 P174
1,6,8
6通用定时器
选择题、填空题、读程序题
STM32芯片的定时器 P110
STM32系列芯片最多包含8个定时/计数器。其中TIM6和TIM7为基本定时器,TIM2-TIM5为通用定时器,TIM1和TIM8为高级控制定时器。此外,在STM32中还有两个看门狗定时器和一个系统滴答定时器。
定时器的类型 P111
基本定时器
基本定时器内部集成了1个16位自动加载递增计数器、1个16位预分频器。连个基本定时器是相互独立的、,不共享任何资源。
通用定时器
通用定时器内部集成了1个16为自动加载递增/递减计数器、1个16位预分频器和4个独立通道。适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。
高级控制定时器
高级控制定时器内部集成了1个16位自动加载递增/递减计数器、1个16位预分频器和4个独立通道。高级控制定时器可以被看成分配到6个通道的三相OWM发生器,它具有带死区插入到的PWM输出,还可以用作完整的通用定时器。
窗口看门狗定时器
用于系统发生问题时复位系统。
独立看门狗定时器
用作系统问题时复位整个系统,或者用作一个自由定时器为应用程序提供超时管理。
系统滴答定时器
系统滴答定时器专门用于实时操作系统。
STM32的计数模式 P131
向上计数模式
当控制寄存器TIMx_CR1中CMS=00,DIR=1时选择为向上计数模式。
向下计数模式
当控制寄存器TIMx_CR1中CMS=00,DIR=0时选择为向下计数模式。
中央对齐模式
当控制寄存器TIMx_CR1中CMS=01、10、11时选择为中央对齐模式。
定时器使用流程 P143
定时器设计实例 P145
1,8,10,11
5外部中断
选择题、填空题、读程序题、程序设计题
中断的相关概念 P79
定义:单片机执行主程序时,由于某个时间的原因,暂停主程序 的执行,调用相应的程序处理该事件,处理完毕后在自动继续执 行主程序的过程。步骤:中断请求、终端响应、中断处理及中断返回。
STM32F103的中断源 P80
STM32F103中断系统提供10个系统异常和60个可屏蔽中断源,具有16个终端优先级。 可屏蔽中断源包括外部中断和定时器中断、串口中断、直接内存访问中断、模数转换中断、集成电路总线中断、串行外设接口中断等外设中断。
STM32F103的中断系统组成 P83
嵌套中断向量控制器
外部中断/事件控制器
各外设终端控制部分
中断优先级的分配 P88
STM32的终端向量有两个属性,即抢占属性和响应属性,属性编号越小,优先级越高。
STM32中断的设计 P100
子主题
外部中断应用实例 P105
#include "stm32f10x.h" void GPIO_Config(void); viod delay(viod); int main(viod) { GPIO_Config(); //GPIO配置 while(1) { GPIO_ResetBit(GPIOA,GPIO_Pin_8); //低电平,点亮LED GPIO_ResetBit(GPIOD,GPIO_Pin_2); //低电平,打开蜂鸣器 delay(); GPIO_SetBit(GPIOA,GPIO_Pin_8); //高电平,熄灭LED GPIO_SetBit(GPIOD,GPIO_Pin_2); //高电平,关闭蜂鸣器 delay(); } } viod GPIO_Confit(viod) { GPIO_InitTypeDef GPIO_InitStructure: //声明GPIO结构体变量 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED——PB.8 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); } void KEY_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //LED——PB.6 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入 GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource6);//选择中断线 路 EXTI_InitStructure.EXTI_Line = EXTI_Line6; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void EXTI9_5_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line6) != RESET) { GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)((1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)))); EXTI_ClearITPendingBit(EXTI_Line6); } }
1,2,3,5,11,12