STM32的SPI控制器
[施工中..]
SPI控制器SPI控制器原理
上图展示了STM32F4系列的SPI控制器框图。由波特率发生器产生时间信号,逻辑控制器进行MOSI和MISO控制,并产生片选信号。同时由Tx Rx两个缓冲寄存器+移位寄存器构成发送模块。控制寄存器主要有SPI_CR1,SPI_CR2,BR。
发送流程
数据写入Tx Buffer
Tx Buffer内的的数据填入移位寄存器
移位寄存器逐个bit发至MOSI线
发送完毕,SPI_SR TXE寄存器置位
接收流程
数据写入移位寄存器
移位寄存器写入 Rx Buffer
接收完成,SPI_SR EXNE置位
读取Rx Buffer内的内容
片选信号在SPI_CR1寄存器中的SSI信号即是该控制器内的片选信号发生器。可通过配置SPI_CR1 SSM寄存器来决定该信号是否对外输出。以此实现不同的片选效果。在NSS对外输出时,配置SPI_CR1 SSOE寄存器又可定义两种不同的硬件管理模式
STM32的SPI控制器支持三种片选模式:
软件管理:(SSM=1)外部NSS引脚空闲,可复用其他功能。自定义GPIO通过写高低电平实现片选
硬件管理(输出使能 ...
STM32核心板设计
HSE时钟电路——皮尔斯(Pierce)震荡器简介单片机上常见的HSE时钟——一个无源晶振配合两个电容的时钟电路,就是使用的皮尔斯振荡电路,其完整电路如下图,由两个电容 ($C_1\&C_2$) ,一个晶体振荡器 ($X_1$),一个反馈电阻 ($R_1$) 和一个反相放大器 ($U_1$) 组成。$U_1$和$R_1$一般集成在芯片内部,因此这就是在STM32中选择HSE(外部晶体振荡器)时钟时,有两个引脚 RCC_OSCIN 和 RCC_OSC_OUT 被占用的原因。
石英晶振的等效电路
在分析电路如何震荡之前,需要先了解石英的一个物理特性。
压电效应:当对压电材料施以压力时,能产生电;反过来,当给压电材料通电,能产生形变;因此,在石英晶体的两端施加持续变化的交流电压,即可让石英音叉形变“震荡”起来,物理的形变又回反过来改变电压,从某种意义上来说这也是一个储能元件。在计算上可以把晶振等效为一个RLC电路,如下图所示。其中$C_0$是石英晶体两脚间产生的寄生电容(一般取3-5pF),其余部分是晶振本身的等效R ...
STM32的UART通信(Register)
基本工作原理(F4系列)F4的USART模块支持可编程字长、自定义波特率、单线半双工模式(RX,TX使用一条线,半双工收发)、唤醒MCU、可编程的停止位长度、可启用/禁用/设置模式的就校验位。其硬件模块如下
F4系列的USART模块还支持IRDA协议和LIN协议,这里不会详细介绍
USART硬件系统可以被拆分成如下几个重要部分:
控制初始化工作部分
使能USART:由CR1寄存器UE位(bit13)进行控制,使能后USART模块才会开始工作,不用时失能减少功耗;
设置数据字长:F4系列支持8bit和9bit两种长度,通过对CR1寄存器M位(bit12)配置进行控制;
设置波特率:波特率生成器负责生成控制发送速率的时钟,由USART_BRR寄存器控制。
设置停止位长度:由CR2寄存器中bit[12:13]控制,支持0.5 / 1 / 1.5 / 2四种停止位长度
设置奇偶校验:CR1寄存器PCE位(bit10)控制。
控制收发工作部分
DR(数据寄存器):用于寄存要发送的数据或者收到的数据。发送时,该寄存器内的值会被逐个读取至TDR,并通过移位寄存器逐个bit发送;接受时,RDR ...
STM32的中断(Register)
NVIC不同于普通单片机的软中断(单一入口,软件识别flag)或硬中断(不同入口)会在多个中断同时发生时挂起后发生的,STM32支持对中断的优先级进行编程,在中断中触发中断。用于管理这一优先级的系统被称为NVIC。
NVIC:Nested vectoredinterrupt controller,嵌套向量中断控制器,属于内核 (M3/4/7)。NVIC支持256个中断(16个内核中断+240个外部中断),内核支持256个中断优先级。ST公司把256个优先级裁切为了16个优先级(所有系列都是如此)。对于F407xx系列芯片,有10个内核中断,82个外部中断。
STM32的中断优先级又分为几类:抢占式优先级、响应式优先级、自然优先级。在STM32中,优先级设置的数值越小,其优先级越高
抢占式优先级:当两个中断同时发生时,优先执行抢占式优先级高的中断,可形成中断嵌套(在执行某低优先级中断中被高优先级再次中断,先执行高的再回来继续执行低的)
响应式优先级:当两个同抢占式优先级的中断同时发生时,优先响应 响应式优先级 高的中断,另一个被挂起。响应式优先级无法打断执行过程中的中断。
自然优先级 ...
STM32——HAL库
GPIO控制GPIO口寄存器的封装和总线时钟123456789101112131415161718192021222324252627282930313233//GPIO_TypeDef 结构体如下:typedef struct{ __IO uint32_t MODER; /*!<模式寄存器, Address offset: 0x00 */ __IO uint32_t OTYPER; /*!<输出数据类型寄存器, Address offset: 0x04 */ __IO uint32_t OSPEEDR; /*!<输出速度寄存器, Address offset: 0x08 */ __IO uint32_t PUPDR; /*!<上拉下拉电阻选择寄存器, Address offset: 0x0C */ __IO uint32_t IDR; /*!<输入数据寄存器, Ad ...