stm32时钟系统
时钟是具有周期性的脉冲信号,最常用的是占空比50%的方波
时钟系统配置步骤
我们在使用某个外设时,必须先使能外设时钟。
__HAL_RCC_GPIOA_CLK_ENABLE(); /* 使能 GPIOA 时钟
__HAL_RCC_GPIOA_CLK_DISABLE(); /* 禁止 GPIOA 时钟 */
sys_stm32_clock_init()函数
此函数在main函数中调用,初始化时钟。
初始化时钟函数,在sys.c中定义,sys.h中实现。这个函数内部调用 HAL_RCC_OscConfig()函数和 HAL_RCC_ClockConfig()函数
HAL_RCC_OscConfig()函数设置时钟源,配置PLL
此函数在stm32f1xx_hal_rcc.c中实现。
HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct)
typedef struct
{
uint32_t OscillatorType; /* 选择需要配置的振荡器,这里有四个振荡器选择 */
uint32_t HSEState; /* HSE 状态,打开还是关闭 */
uint32_t HSEPredivValue; /* HSE 预分频值 */
uint32_t LSEState; /* LSE 状态 */
uint32_t HSIState; /* HSI状态会随着温度和电压变动而变动,不稳定 */
uint32_t HSICalibrationValue; /* HSI 校准值 */
uint32_t LSIState; /* LSI 状态 */
RCC_PLLInitTypeDef PLL; /* PLL() 结构体 */
}RCC_OscInitTypeDef;
typedef struct
{
uint32_t PLLState; /* PLL 状态 */
uint32_t PLLSource; /* PLL 时钟源 */
uint32_t PLLMUL; /* PLL 倍频系数 */
}RCC_PLLInitTypeDef;
HAL_RCC_ClockConfig()函数配置系统时钟源和总线分频
此函数在stm32f1xx_hal_rcc.c中实现。
HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct,
uint32_t FLatency)
typedef struct
{
uint32_t ClockType; /* 要配置的时钟(SYSCLK(系统时钟)/HCLK(AHB)/PCLK1(AHB1)/PCLK2(AHB2) */
uint32_t SYSCLKSource; /* 系统时钟源 */
uint32_t AHBCLKDivider; /* AHB 时钟预分频系数 */
uint32_t APB1CLKDivider; /* APB1 时钟预分频系数 */
uint32_t APB2CLKDivider; /* APB2 时钟预分频系数 */
}RCC_ClkInitTypeDef;
uint32_t FLatency /*FLatency 取值下面这三个宏定义*/
#define FLASH_LATENCY_0 0x00000000U /* FLASH 0个等待周期 */
#define FLASH_LATENCY_1 FLASH_ACR_LATENCY_0 /* FLASH 1个等待周期 */
#define FLASH_LATENCY_2 FLASH_ACR_LATENCY_1 /* FLASH 2个等待周期 */
GPIO(General Purpose Input Output)通用输入输出端口
CPIO特点
1.不同型号,IO口数量可能不一样
2. 快速翻转,每次翻转最快只需要两个时钟周期(F1最高速度可以到50Mhz)
3. 每个IO口都可以做中断
4. 支持8种工作模式
STM32引脚类型
电源引脚、晶振引脚、复位引脚、下载引脚、BOOT引脚、GPIO引脚
GPIO的八种模式分析
F1在输出模式,禁止使用内部上下拉
F4/F7/H7在输出模式,可以使用内部上下拉
开漏式输出:P_MOS管始终不导同。往ODR对应位写0,N-MOS管导通,写1则N-MOS管不导通。
特点:不能输出高电平, 必须有外部(或内部)上拉才能输出高电平。
开漏式复用输出:电路原理一样,由其他外设控制输出,如usart。
推挽输出:可输出高低电平,驱动能力强。
F1的GPIO工作模式结构图
GPIO寄存器介绍
IDR(输入数据存储寄存器)
ODR(输出数据存储寄存器)
BSSR
我们常常使用BSSR寄存器来操作ODR寄存器中的内容
通用外设驱动模型(四步法)
- 初始化:时钟设置、参数设置、IO设置、中断设置(开中断、设NVIC)(可选)
- 读函数(可选):从外设读取数据(可选)
- 写函数(可选):往外设写入数据(可选)
- 中断服务函数(可选):根据中断标志,处理外设各种中断事务(可选)
GPIO配置步骤
- 使能时钟:__HAL_RCC_GPIOx_CLK_ENABLE() x属于A,B,C,等
- 设置工作模式:HAL_GPIO_Init()
- 设置输出状态(可选):HAL_GPIO_WritePin() ,HAL_GPIO_TogglePin()
- 读取输入状态(可选):HAL_GPIO_ReadPin()
相关HAL库函数简介
实验:点亮LED灯、按键点亮LED灯
串口
数据通信基础
串行,并行通信
串行通信
并行通信
单工,半双工(只有一根数据线,接受和发送分时使用),全双工通信
同步/异步通信
常见串行通信接口
串口:串行通信接口,指桉位发送和接收的接口。
USART(通用同步异步收发器)
STMF1的USART框图
USART寄存器介绍(F1)
控制寄存器:CR1,CR2,CR3。
发送数据寄存器:TDR。接收数据寄存器:ROR。TDP,ROR不能直接操作,是通过操作数据寄存器DR来间接操作的。
更多有关F1USART寄存器介绍参考:
STM32F10xxx参考手册_V10(中文版).pdf,25.6.2节
数据寄存器DR
状态寄存器SR;
USART_CR1(控制寄存器1)
该寄存器需要完成的配置:
位13:使能USART(1:使能)
位12:配置8个数据位(0:一个起始位,8个数据位,n个停止位;1:9个数据位);
位10:禁止检验控制(1:使能校验控制)
位5:使能接收缓冲区非空中断
(1:当USART_SR中的ORE或者RXNE为’1’时,产生USART中断。 )
位3:使能发送(1:使能,0:禁止)
位2:使能接收
USART_CR2(控制寄存器2)
USART_CR3(控制寄存器3)
STMH7的USART框图
输出接口(TX)和输入接口(RX)是连接的GPIO端口。
IIC
IIC:Inter Integrated Circuit,集成电路总线,是一种同步 串行 半双工通信总线。(系统总线通信协议)
IIC协议结构图
① 由时钟线SCL和数据线SDA组成,并且都接上拉电阻,确保总线空闲状态为高电平
② 总线支持多设备连接,允许多主机存在,每个设备都有一个唯一的地址
③ 连接到总线上的数目受总线的最大电容400pf限制
④ 数据传输速率:标准模式100k bit/s 快速模式400k bit/s 高速模式3.4Mbit/s
IIC协议时序
起始信号(S):当SCL为高电平时,SDA从高电平变为低电平
停止信号§:当SCL为高电平时,SDA从低电平变为高电平
应答信号:上拉电阻影响下SDA默认为高,而从机拉低SDA就是确认收到数据即ACK,否则NACK
AT24C02介绍
EEPROM是一种掉电后数据不丢失的储存器,常用来存储一些配置信息,在系统重新上电时就可以加载。
AT24C02是一个2K bit的EEPROM存储器,使用IIC通信方式。
A0/1/2: 设备地址决定引脚。
SCL:时钟线
SDA:数据线
AT24C02是由32页组成,每页8位。
AT24C02驱动步骤
AT24C02模块与各开发板引脚硬件连接说明
IIC驱动步骤
1、使能SCL和SDA对应时钟:__HAL_RCC_GPIOB_CLK_ENABLE()
2、设置GPIO工作模式: SDA开漏(SDA既要输入又要输出,开漏模式实现输入输出共用)/SCL推挽输出模式,使用HAL_GPIO_Init初始化
3、编写基本信号:起始信号 ,停止信号, 应答信号
4、编写读和写函数:
AT24C02驱动步骤
1、初始化IIC接口
2、编写写入/读取一个字节数据函数
3、编写连续读和连续写函数
SPI
SPI:串行外设设备接口(Serial Peripheral Interface),是一种高速的,全双工,同步的通信总线。[这里主机和从即都有SPI外设吗]
SPI与IIC对比
SPI结构框图介绍
① SPI相关引脚:MOSI(输出数据线),MISO(输入数据线),SCK(时钟),NSS(片选)。
② 数据发送和接收:与缓冲区、移位寄存器以及引脚相关
③ 时钟信号:SPI时钟信号是通过SPI_CR1寄存器配置
④ 主控制逻辑:涉及两个控制寄存器SPI_CR1/2用于配置SPI工作,SPI_SR用于查看工作状态。
STM32有三个SPI外设
主机模式下的数据发送与接收
SPI工作模式介绍
时钟极性(CPOL):没有数据传输时时钟线的空闲状态电平
时钟相位(CPHA):时钟线在第几个时钟边沿采样数据
SPI寄存器
SPI分类
- Standard SPI(标准SPI)全双工方式
标准SPI,通信线包含:片选CS、时钟线CLK、输入DI、输出DO。驱动SPI FLASH还需要写保护WR以及维持HOLD引脚。 - Dual SPI(双线SPI) 半双工方式
对标准SPI改进,DO和DI改成IO0和IO1,变为双向IO口。一个周期内,通过数据线,传输2位数据。 - Qual SPI(四线SPI) 半双工工作方式
对Dual SPI改进,写保护WR和维持HOLD复用为数据IO口,为IO2和IO3。个周期内,通过数据线,传输4位数据。
2,3两种方式主要是操作SPI通信协议的flash,速度至上。
NOR FLASH介绍
FLASH是常用的用于储存数据的半导体器件,它具有容量大,可重复擦写、按“扇区/块”擦除、掉电后数据可继续保存的特性。FLASH是有一个物理特性:只能写0,不能写1,写1靠擦除
NM25Q128,串行闪存器件,属于NOR FLASH中的一种,容量为128 Mb。擦写周期可达10W次,可以将数据保存达20年之久。使用SPI数据传输时序。
NM25Q128芯片接口示意图
CS : 片选信号输入
SI : 数据输入
SO : 数据输出
CLK : 时钟输入
HOLD : 暂停通讯
WP : 写保护功能
NM25Q128存储结构
NM25Q128常用指令:需要以命令的方式操作此存储器。