STM32&HAL笔记00:STM32及HAL库介绍
一直想着有机会从头开始学习下STM32这款单片机,前端时间对CubeMX和HAL库的操作很好奇,因为之前做项目都是直接用正点原子的例程,所以这次我打算利用学习CubeMX和HAL库的这个机会,从新系统的学习下STM32,重点学习其相关外设的原理,并使用HAL库来实战。目前我将安排两类文章,一类属于笔记部分,主要介绍相关理论知识,另外一类属于实战部分,介绍操作方法,根据该操作方法可以将内容复现。那我们就先大致了解下STM32以及HAL库吧~
STM32
STM32功能概述
整个学习准备采用最基础的STM32F103系列的单片机,先来大致看一下这款单片机的功能。
- 芯片属于ARM架构32位的处理芯片,时钟频率为72MHz
- 存储器为32K字节至128K字节闪存程序存储器
- I/O引脚电压3.3V,内嵌4至16Mhz高速晶体振荡器
- 芯片有三种省电模式,分别为睡眠、停机和待机模式,VBAT引脚为RTC和后备寄存器供电
- 拥有2个12位的数模转换器,转换电压0-3.6V
- 可以采用SWD和JTAG接口进行调试,但是一般优先选择SWD
- 7通道的DMA控制器,支持的外设有定时器、ADC、SPI、I2C、和USART
- 多达32个快速I/O口,所有的I/O口均可以映射到16个外部中断
- 有7个定时器,3个同步的16位定时器,每个定时器有4个输入捕获/输出比较/PWM或脉冲计数通道
- 通信接口包含2个I2C、3个USART、2个SPI同步串行接口、CAN接口、USB2.0全速接口
单片机包含5种封装类型,在整个学习过程中,我们采用的是LQFP48这种封装类型,如下图所示,列出了这几种封装类型 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O2k8lu9k-1629420690419)(https://i.loli.net/2021/03/24/VPQNI7rjndJipax.png)]
嵌套的向量式中断控制器(NVIC)
芯片内置嵌套的向量式中断控制器,能够处理43个可屏蔽中断通道和6个优先级
外部中断/事件控制器(EXIT)
外部中断/事件控制器包含19个边沿检测器,连接16个外部中中断线,用于产生中断/事件请求。每个中断线都可以单独配置,并且可以单独屏蔽,有一个挂起寄存器维持所有中断请求的状态。
时钟和启动
首先系统时钟的选择是在启动时完成的,8MHz的RC振荡器被选择为默认时钟,然后可以选择外部的时钟,如果外部的时钟无效,则会产生相应的中断,最后使用多个预分频器配置时钟
供电监视器
芯片内部有一个上电复位/掉电复位的电路,该电路一直处于工作状态,作用在于当供电电压低于2V时,不必使用外部的复位电路就可以复位。器件中还有一个可编程的电压检测器,作用是检测VDD的电压,当电压低于VPVD时,产生一个中断,这个中断可以使芯片进入安全模式,注意需要通过程序开启此功能
低功耗模式
器件包含三种低功耗模式,分别是睡眠模式、停机模式、待机模式
- 睡眠模式:只有CPU停止工作,其他外设均处于工作状态,中断可以唤醒CPU
- 停机模式:所有1.8V内部功能停止工作,PLL HSI HSE RC振荡器将会关闭,但是SRAM和寄存器的内容不会丢失。EXIT的信号会唤醒该模式
- 待机模式:在停机模式的基础上,SRAM和寄存器的内容会发生丢失,但是后备寄存器的内容还有,并且待机电路还在工作状态。可以采用NSRST、IWDG或者RTC闹钟唤醒。
DMA
首先DMA可以实现存储器到存储器、设备到存储器、存储器到设置之间的数据传输,一共有7个通道。然后每个通道有专门的硬件DMA请求逻辑,同时可以用软件对长度、传输源和目标地址进行单独设置,最后DMA可以用于SPI I2C USART 定时器和ADC等外设中。
RTC和后备寄存器
RTC和后备寄存器供电既可以选择VDD供电也可以选择VABT引脚供电,由一个开关控制。后备寄存器是10个16位的寄存器,可以用来在VDD没电时保存数据。实时时钟具有一组连续运行的计数器,可以为系统提供日历、闹钟功能,在时钟选择方面,可以选择使用外部晶体的32.768kHz振荡器,也可以使用内部RC振荡器,或者还可以使用高速外部时钟。一般考虑到精度问题等,优先选择用外部晶体的32.768kHz振荡器。
独立看门狗
首先看门狗的时钟是独立的32kHz内部RC振荡器,该振荡器独立于主时钟,因此可以工作在低功耗模式中。在系统发生问题时,可以复位整个系统,或者作为一个自由定时器为应用程序提供超时管理。最后可以通过选择字节配置成软件看门狗或者硬件看门狗。
定时器
定时器分为高级定时器TIM1和通用定时器TIM2-4,其中高级定时器就是一个分配到6通道的三相PWM发生器,也可以当作普通定时器使用。每个通用定时器都包含一个16位的自动加载递增/递减计数器、一个16位的预分频器、和4个独立通道,4个独立通道都可以用于输入捕获、输出比较、PWM和单脉冲输出。还可以通过定时器连接功能与高级定时器协同工作。
I2C总线
器件有2个I2C总线接口,能够工作与多主和从模式,支持标准和快速模式
通用同步/异步接收发送器(USART)
器件包含3个串口,其中一个串口通信速率可以达到4.5兆/秒。接口具有硬件的CTS和RTS信号管理
SPI串行外设接口
包含2个SPI通讯接口,在从或者主模式下,全双工和半双工的通信速率可以达到18兆位/秒。3位的预分频器可产生8种主模式频率。
控制器区域网络(CAN)
CAN接口不仅可以接收和发送11位标识符的标准帧,也可以处理29位标识符的扩展帧,含有2个接收FIFOs,3级14个可调节的滤波器。
通用串行总线(USB)
器件内嵌一个usb设备,遵循全速标准,具有可软件配置的端点和待机/恢复功能。专门的48MHZ时钟由PLL直接产生
通用输入输出接口(GPIO)
每个IO口都可以配置成输出(推拉、开路)、输入(带或者不带上拉或者上拉)或者其他外设的功能,与数字模拟的外设功能关键共用,并且所有引脚都是大电流通过的能力。
ADC(模拟/数字转换器)
器件内嵌2个12位的数字/模拟转换器,每个ADC有16个外部通道,可以执行单次扫描或者扫描转换模式。 对上述功能做简单介绍后,可以根据下面的方框原理图大致了解该器件内部的组成结构。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5kVHnWgg-1629420690422)(https://i.loli.net/2021/03/25/bTYGRpPW941SxCU.png)]
HAL库
C语言对程序的编程其实就是对寄存器的操作,但是随着32系类芯片的寄存器越来越多,这时很多人已经记不住每个寄存器的名称等,这时意法半导体非常友好地为编程人员提供了一套操作寄存器的API接口,这套东西就成为HAL库。有了HAL库,我们就不用去记每个寄存器的地址和操作方法,只需要根据HAL库函数操作即可。 CubeMX是意法半导体为编程人员提供的一款开发软件,使用该软件可以进行图形化编程,其实在开发过程中,最耗费精力的就是IO口的配置,然后CubeMX这款软件目的在于简化IO口的操作,说白了就是配置IO,然后自动生成代码的工具,生成后的代码我们不需要关注IO口的配置,只需要进行程序的逻辑处理即可,使用起来非常的方便。
总结
这篇文章主要对32的功能进行了简单的介绍,比如包含几个定时器等等,以及对HAL库的介绍,后续将根据实战和理论相结合的方式一一探讨这些功能。鉴于笔者知识面有限,如上述内容存在问题,请联系笔者更正,谢谢!
|