导图社区 STM32部分知识点
1,课本P1-2,STM32MCU三大组成部分→详细组成部分;2,课本P21,通用并行接口GPIO基本组成部分→8种工作模式;3,中断处理流程,不同中断源同时请求中断时,STM32怎么处理。
编辑于2022-05-16 13:38:47STM32
1,课本P1-2,STM32MCU三大组成部分→详细组成部分
控制单元
Cortex-M3内核
两个DMA控制器(DMA1和DMA2)
从属单元
存储器
Flash
SRAM
等等
设备
连接片外设备的接口-片外设备:
并行接口-
即通用I/O接口GPIO
GPIO口配置,课本P22,24
通用并行接口GPIO
包括多个16位I/O端口(PA0~PA15、PB0~PB15和PC0~PC15等),每个端口可以独立设置三种输入方式和四种输出方式,并可以独立地置位或复位。
寄存器
配置寄存器(CRL和CRH)
输入数据寄存器IDR(Input data register)
输出数据寄存器ODR
位设置/清除寄存器(BSRR和BRR)
等
输入驱动器
输出驱动器
等
串行接口-
串行接口(Universal asynchronous receiver/transmitter)
异步串行接口-通用异步收发器接口UART
同步串行接口-具有同步功能的UART称为同步/异步收发器接口USART
SPI
I^2C
等
通用同步/异步收发器接口USART、
串行设备接口SPI、
内部集成电路总线接口I^2C、
通用串行总线接口USB
控制器局域网络接口CAN
等
片内设备
定时器TIM、
高级控制定时器TIM1/8、通用定时器TIM2-5、基本定时器TIM6/7、实时钟RTC、独立看门狗IWDG和窗口看门狗WWDG等
模数转换器ADC和
数模转换器DAC等,
总线矩阵
2,课本P21,通用并行接口GPIO基本组成部分→8种工作模式
寄存器
配置寄存器(CRL和CRH),课本P22
,
CRL
CRH
输入数据寄存器IDR
输出数据寄存器ODR
位设置/清除寄存器(BSRR和BRR)
BSRR
BRR
配置锁定寄存器
LCKR
输入驱动器
上拉电阻
下拉电阻
施密特触发器
输出驱动器
八种工作模式-课本P22表2.2
输入
模拟输入
浮空输入
上拉/下拉输入
保留
输出
通用推挽输出
通用开漏输出
复用推挽输出
复用开漏输出
3,中断处理流程,不同中断源同时请求中断时,STM32怎么处理
通过从之前通过中断控制器 NVIC之前配置过的中断优先级, 设置的中断向量表来判断中断优 先级,根据两个中断源的抢占优先级 和响应优先级来判断 先执行那个中断,数值小的优先 级高,如果抢占优先级相同,然 后再通过响应优先级来判断。
STM32的中断处理
STM32最多有32个中断源,大体上可分为两类,外部中断源与内部中断源(引起ARM芯片执行指令/内部功能模块),
中断优先级
FIQ(快速中断请求)、向量IRQ、非向量IRQ,其级别依次递减.
中断向量表
Cortex内核具有强大的异常响应系统,它把能够打断当前代码执行流程的事件分为异常和中断,并将其用一个表管理,编号为0-15的称为内核异常,而16以上的则称为外部中断,这个表即为中断向量表。
NVIC中断控制器
因STM32有很多的中断,故配置起来并不容易,因此便需要一个强大而方便的中断控制器NVIC(Nested Veectored Interrupt Controller ),且其属于Cortex内核的器件。 嵌套向量中断控制器NVIC相关的中断管理工作主要有开放中断、关闭中断设置中断请求标志、读中断请求标志、清除中断请求标志和配置中断优先级等。 对于中断的配置,最重要即为配置其优先级,但STM32的同一个中断向量需要设置两个优先级,抢占优先级和响应优先级
中断向量的两个中断优先级
抢占优先级
抢占,是指打断其它中断的属性,即因为具有这个属性会出现嵌套中断(在执行中断服务函数A的过程中被中断B打断,执行完中断服务函数B再继续执行中断服务A)。
响应优先级
响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时达到,则先处理响应优先级高的中断。
例子
如内核正在执行C的中断服务函数,则它能被抢占优先级更高的中断A打断,由于B和C的抢占优先级相同,所以C不能被B打断。但如果B和C中断时同时到达的,内核就会首先响应 优先级别更高的B中断。
NVIC的优先级组
在配置优先级的时候,还要注意中断种类的数量。NVIC只可以配置16种中断向量的优先级,即为,抢占优先级和响应优先级的数量由一个4位的数字来决定,把这个4位数字的位数分配成抢占优先级部分和响应优先级部分,由5组分配方式。
注意:一个工程文件中NVIC的优先级组只需设置一次即可。 NVIC的优先级分组,只是为以后的中断程序设置了一个规则,例如,设置第1组,则表示,抢占优先级只能是0级或1级,响应优先级为0~7级。即,配置中断的优先级时,只能在这个范围中取值。
4,数据通信(并行、串行 、单工、全双工、半双工、同步、异步)USART,T^2C ,UART,SPI区别
数据传输主要有三种不同的划分方式。 传送方式:并行/串行通信; 数据同步方式:同步/异步传输; 按数据传输方向:分为单工、半双工、全双工。
并行通信
(1)并行通信 并行通信是同时传送数据的各个位进行发送or接收的通信方式。 传输率比串行接口快8倍,理论值为1Mbits/s. 传输的信息不要求固定格式 通信抗干扰能力差 传输距离小于30m
是指数据的各位同时在多根数据线上发送或接收。如下图 并行通信的特点:控制简单,传输速度快;由于传输线较多,适用于短距离通信。
串行通信
(2)串行通信 串行通信是常用的通信协议,其会将数据按位一次传输。 线路简单、成本较低 传输速度比并行通信慢。 RS-232一般通信距离较近时使用(<12m),最大速度为20Kbits/s。 RS-422/485通信距离与速率成反比,理论最大距离为1.2KM,最大速度为10Mbits/s。 422最多可以接10个节点,485最多可以接32个节点。
串行通信:是指数据的各位在同一根数据线上逐位发送和接收。如下图  串行通信的特点:控制复杂,传输速度慢;只需要一根数据线,适用于远距离通信。
同步传输
(1)同步传输 同步传输,是将许多字符组成一个信息组,字符可以一个接一个地传输,但是,在每组信息的开始要加上同步字符,如果没有信息要传输,则要填上空字符,因为同步传输不允许有间隙。在整个系统中,由统一的时钟控制发送端来发送空字符。接收端同样要求能识别同步字符,当见检测到有一串位和同步字符相匹配时,就认为开始一个信息帧,于是,把此后的BIT作为实际传输信息来处理。
同步通信 同步通信是指发送端和接收端必须使用同一时钟,是一种连续传送数据的通信方式,一次通讯传送多个字符数据(一帧数据)。下图是同步串行通信帧格式:
异步传输
(2)异步传输 异步传输,是指位被划分成小组独立传送。每次异步传输都以一个开始位开头,它通知接收方数据已经到达了;在传输结束时,一个停止位表示一次传输的终止。 常用于低速设备,传送负载也要比同步通讯大25%。
异步通信 异步通信是指发送和接收端使用的是各自的时钟,并且它是一种不连续的传输通信方式,一次通信只能传输一个字符数据(字符帧)。字符帧之间的间隙可以是任意的,在STM32中USART就是使用的是异步通信方式,下图是异步串行通信帧格式:
单工
(1)单工方式 单工通信使用一根导线,信息只能由一方A传到另一方B。
单工:是指数据传输仅能沿一个方向,不能实现反向传输。
半双工
(2)半双工方式 同样使用一根传输线,它既作接收又作发送,收/发的开关实际由软件的电子开关控制。
半双工:是指数据传输可以沿两个方向,但需要分时进行传输。
全双工
(3)全双工方式 当数据的发送和接收分流,分别由两根不同的传输线传送时,通信双方都能在同一时刻发送和接收。
全双工:是指数据可以同时进行双向传输
UART和USART的区别
综上可以看出,USART相对UART来说是在异步通信的基础上还有同步的功能,USART能够提供主动时钟。
UART需要固定的波特率,就是说两位数据的间隔要相等。 UART总线是异步串口,一般由波特率产生器(产生的波特率等于传输波特率的16倍)、UART接收器、UART发送器组成,硬件上有两根线,一根用于发送,一根用于接收。 显然,如果用通用IO口模拟UART总线,则需一个输入口,一个输出口。 UART是一个并行输入成为串行输出的芯片,通常集成在主板上,多数是16550AFN芯片。因为计算机内部采用并行数据,不能直接把数据发到Modem,必须经过UART整理才能进行异步传输,其过程为:CPU先把准备写入串行设备的数据放到UART的寄存器(临时内存块)中,再通过FIFO(First Input First Output,先入先出队列)传送到串行设备,若是没有FIFO,信息将变得杂乱无章,不可能传送到Modem。 作为接口的一部分,UART还提供以下功能:将由计算机内部传送过来的并行数据转换为输出的串行数据流。将计算机外部来的串行数据转换为字节,供计算机内部使用并行数据的器件使用。在输出的串行数据流中加入奇偶校验位,并对从外部接收的数据流进行奇偶校验。在输出数据流中加入启停标记,并从接收数据流中删除启停标记。处理由键盘或鼠标发出的中断信号(键盘和鼠标也是串行设备)。可以处理计算机与外部串行设备的同步管理问题。 USART收发模块一般分为三大部分:时钟发生器、数据发送器和接收器。控制寄存器为所有的模块共享。时钟发生器由同步逻辑电路(在同步从模式下由外部时钟输入驱动)和波特率发生器组成。发送时钟引脚XCK仅用于同步发送模式下,发送器部分由一个单独的写入缓冲器(发送UDR)、一个串行移位寄存器、校验位发生器和用于处理不同浈结构的控制逻辑电路构成。使用写入缓冲器,实现了连续发送多浈数据无延时的通信。接收器是USART模块最复杂的部分,最主要的是时钟和数据接收单元。数据接收单元用作异步数据的接收。除了接收单元,接收器还包括校验位校验器、控制逻辑、移位寄存器和两级接收缓冲器(接收UDR)。接收器支持与发送器相同的帧结构,同时支持桢错误、数据溢出和校验错误的检测。USART是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备。
SPI、I2C、UART三种串行总线协议的区别
SPI和UART可以实现全双工,但I2C不行;
SPI总线由三条信号线组成:串行时钟(SCLK)、串行数据输出(SDO)、串行数据输入(SDI)。SPI总线可以实现 多个SPI设备互相连接。提供SPI串行时钟的SPI设备为SPI主机或主设备(Master),其他设备为SPI从机或从设备(Slave)。主从设备间可以实现全双工通信,当有多个从设备时,还可以增加一条从设备选择线。 如果用通用IO口模拟SPI总线,必须要有一个输出口(SDO),一个输入口(SDI),另一个口则视实现的设备类型而定,如果要实现主从设备,则需输入输出口,若只实现主设备,则需输出口即可,若只实现从设备,则只需输入口即可。 I2C总线是双向、两线(SCL、SDA)、串行、多主控(multi-master)接口标准,具有总线仲裁机制,非常适合在器件之间进行近距离、非经常性的数据通信。在它的协议体系中,传输数据时都会带上目的设备的设备地址,因此可以实现设备组网。 如果用通用IO口模拟I2C总线,并实现双向传输,则需一个输入输出口(SDA),另外还需一个输出口(SCL)。(注:I2C资料了解得比较少,这里的描述可能很不完备) UART总线是异步串口,因此一般比前两种同步串口的结构要复杂很多,一般由波特率产生器(产生的波特率等于传输波特率的16倍)、UART接收器、UART发送器组成,硬件上由两根线,一根用于发送,一根用于接收。 显然,如果用通用IO口模拟UART总线,则需一个输入口,一个输出口。
5,库开发指南,13-3,代码清单(P117)解释代码分析
代码清单 13-3 检测按键的状态 1 /** 按键按下标置宏 2 * 按键按下为高电平,设置 KEY_ON=1, KEY_OFF=0 3 * 若按键按下为低电平,把宏设置成 KEY_ON=0 ,KEY_OFF=1 即可 4 */ 5 #define KEY_ON 1 6 #define KEY_OFF 0 7 8 /** 9 * @brief 检测是否有按键按下 10 * @param GPIOx:具体的端口, x 可以是(A...G) 11 * @param GPIO_PIN:具体的端口位, 可以是 GPIO_PIN_x(x 可以是 0...15) 12 * @retval 按键的状态 13 * @arg KEY_ON:按键按下 14 * @arg KEY_OFF:按键没按下 15 */ 16 uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin) 18 /*检测是否有按键按下 */ 19 if (GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON ) { 20 /*等待按键释放 */ 21 while (GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON); 22 return KEY_ON; 23 } else 24 return KEY_OFF; 25 } 在这里我们定义了一个 Key_Scan 函数用于扫描按键状态。GPIO 引脚的输入电平可通 过读取 IDR 寄 存 器 对 应 的 数 据 位 来 感 知 , 而 STM32 标 准 库 提 供 了 库 函 数 GPIO_ReadInputDataBit 来获取位状态,该函数输入 GPIO 端口及引脚号,函数返回该引脚 的电平状态,高电平返回 1,低电平返回 0。Key_Scan 函数中以 GPIO_ReadInputDataBit 的 返回值与自定义的宏“KEY_ON”对比,若检测到按键按下,则使用 while 循环持续检测 按键状态,直到按键释放,按键释放后 Key_Scan 函数返回一个“KEY_ON”值;若没有 检测到按键按下,则函数直接返回“KEY_OFF”。若按键的硬件没有做消抖处理,需要在 这个 Key_Scan 函数中做软件滤波,防止波纹抖动引起误触发。
6,库开发指南(P402),ADC(数模转换)根据时钟频率算转换时间. 开发指南,P406 转换时间
5. ⑤转换时间 ADC 时钟 ADC 输入时钟 ADC_CLK 由 PCLK2 经过分频产生,最大是 14M,分频因子由 RCC 时 钟配置寄存器 RCC_CFGR 的位 15:14 ADCPRE[1:0]设置,可以是 2/4/6/8 分频,注意这里 没有 1 分频。一般我们设置 PCLK2=HCLK=72M。 采样时间 ADC 使用若干个 ADC_CLK 周期对输入的电压进行采样,采样的周期数可通过 ADC 采样时间寄存器 ADC_SMPR1 和 ADC_SMPR2 中的 SMP[2:0]位设置,ADC_SMPR2 控制 的是通道 0~9,ADC_SMPR1 控制的是通道 10~17。每个通道可以分别用不同的时间采样。 其中采样周期最小是 1.5 个,即如果我们要达到最快的采样,那么应该设置采样周期为 1.5 个周期,这里说的周期就是 1/ADC_CLK。 ADC 的转换时间跟 ADC 的输入时钟和采样时间有关,公式为:Tconv = 采样时间 + 12.5 个周期。当 ADCLK = 14MHZ (最高),采样时间设置为 1.5 周期(最快),那么总 的转换时间(最短)Tconv = 1.5 周期 + 12.5 周期 = 14 周期 = 1us。 一般我们设置 PCLK2=72M,经过 ADC 预分频器能分频到最大的时钟只能是 12M,采 样周期设置为 1.5 个周期,算出最短的转换时间为 1.17us,这个才是最常用的。
7,最小系统→框图
8,课本P124,计算定时程序设计
当 PCLK2 =8MHz时,16位定时器的最大定时时间是 65536 / 8MHz = 8.192ms 为了实现1s定时,必须使用16位预分频器,使用预分频器后的最大定时时间是 65536×8.192ms= 536.871s 定时精度要求0.5ms,即要求预分频后的频率为 1/ 0.5ms = 2kHz 预分频值为 8MHz/2kHz = 4000 自动重装载值为 1s×2kHz=2000
9,PPT→GPIO(main)→点亮彩灯→代码。学习通资料
while (1) { LED1_ON; SOFT DELAY; LED1_OFE; LED2_ON; SOFT_DELAY; LED2_OFF; LED3_ON; SOFT DELAY; LED3_OFE; }
10,课本P128,定时器输出矩形波(子程序)
void TIM1_Proc(void) { u16 CCR1_Val; if(TIM_GetFlagStatus (TIM1,TIM_FLAG_Update)) { TIM_ClearFlag(TIM1,TIM_FLAG_Update); CCR1_Val = TIM_GetCapture1(TIM1)+ 200; if(CCR1_Val == 2000)CCR1_Val = 200; TIM_SetCompare1 (TIM1,CCR1_Val); printf("%4u\r\n"CCR1_Val); } }
其他
第七章:模数转换器ADC
功能:将模拟信号转换为数字信号,以便于微控制器进行数据处理。
ADC按转换原理分为
逐次比较型ADC
通过逐次比较将模拟信号转化为数字信号,转换速度快,但精度比较低,是最常用的ADC
双积分型ADC
通过两次积分将模拟信号转化为数字信号,精度高,抗干扰能力强,但速度慢,主要用于万用表等测量仪器
∑-△型ADC
具有逐次比较型和双积分型的双重优点,正在逐步广泛地得到应用。
ADC使用的GPIO引脚