STM32L4学习

STM32L4系列是围绕Cortex-M4构建,具有FPU和DSP指令集,主频高达80MHz。

STM32CubeL4简介

STM32Cube 是 ST 提供的一套性能强大的免费开发工具和嵌入式软件模块,能够让开发人员在 STM32 平台上快速、轻松地开发应用。它包含两个关键部分:

  1. 图形配置工具STM32CubeMX。允许用户通过图形化向导来生成C语言工程。
  2. 嵌入式软件包(STM32Cube库)。包含完整的HAL库(STM32硬件抽象层API),配套的中间件,以及一系列完整的例程。

库开发与寄存器开发的关系

很多用户都是从学 51 单片机开发转而想进一步学习 STM32 开发,他们习惯了 51 单片机的寄存器开发方式,突然一个 STM32 固件库摆在面前会一头雾水,不知道从何下手。

固件库就是函数的几何,固件库函数的作用是向下负责与寄存器直接打交道,向上提供用户函数调用的接口(API)。

在51的开发中我们常常的做法是直接操作寄存器,比如要控制某些IO口的状态,我们直接操作寄存器:

c 复制代码
P0=0x11;

而在STM32的开发中,我们同样可以操作寄存器:

c 复制代码
GPIOC->BSRR=0x00000001;

这是针对STM32L4系列

这种方法当然可以,但是这种方法的劣势是要去掌握每个寄存器的用法,才能正确STM32,而对于STM32这种级别的MCU,数百个寄存器记下来又是谈何容易。

于是ST(意法半导体)推出了官方固件库,固件库将这些寄存器底层操作都封装起来,提供一套接口(API)供开发者调用,大多数场合下,不需要去直到操作的是哪个寄存器,只需要知道调用哪些函数即可。

STM32CubeL4固件包介绍


Drivers文件夹

Drivers文件夹包含BSP,CMSIS和STM32L4xx_HAL_Driver三个子文件夹。

  • BSP:板级支持包,此支持包提供的是直接与硬件打交道的API,例如触摸屏,LCD,SRAM以及SSPROM等板载硬件资源等驱动。BSP文件夹下有多种ST官方Discovery开发板,Nucleo开发板以及EVAL板的硬件驱动API文件,每一种开发板对应一个文件夹。
  • CMSIS:顾名思义就是符合CMSIS标准的软件抽象层组件相关文件。文件夹内部文件比较多。主要包括DSP(DSP_LIB文件夹),Cortex-M内核及其设备文件(include文件夹),微控制器专用头文件/启动代码/专用系统文件等(Device 文件夹)。
  • STM32L4xx_HAL_Driver:这个文件夹非常重要,包含了所有的STM32L4xx系列HAL库头文件和源文件,也就是底层硬件抽象层API声明和定义。它的作用是屏蔽了复杂的硬件寄存器操作,统一了外设的接口函数。

STM32L4总线架构

STM32L4的总线架构比51单片机就要强大很多了。

主系统由32位多层AHB总线矩阵构成,总线矩阵可实现以下部分互连:

五条主控总线:

  • Cortex-M4内核I总线,D总线和S总线。
  • DMA1存储器总线
  • DMA2存储器总线
    八条被控总线:
  • 内部FLASH ICode总线
  • 内部FLASH DCode总线
  • 内部SRAM1
  • 内部SRAM2
  • AHB1外设
  • AHB2外设
  • FMC和QSPI

I总线(S0):此总线用于将Cortex-M4内核的指令总线连接到总线矩阵。内核通过此总线获取指令。此总线访问的对象是包括代码的存储器。

D总线(S1):此总线用于将Cortex-M4数据总线连接到总线矩阵。内核通过此总线进行立即数加载和调试访问。

S总线(S2):此总线用于将Cortex-M4内核的系统总线连接到总线矩阵。此总线用于访问位于外设或SRAM中的数据。

DMA存储器总线(S3,S4):此总线用于将DMA存储器总线主接口连接到总线矩阵。DMA通过此总线来执行存储器数据的传入和传出,以及AHB外设或执行存储器之间的数据传输。

STM32L4时钟树概述

众所周知,时钟系统是CPU的脉搏,就像人的心跳一样。所以时钟系统的重要性就不言而喻了。

STM32L4的时钟系统比较复杂,不像简单的51单片机一个系统时钟就可以解决一切。

于是有人要问,采用一个系统时钟不是很简单吗?为什么STM32要有多个时钟源呢?因为首先STM32本身非常复杂,外设非常的多,但是并不是所有外设都需要系统时钟这么高的频率。比如看门狗以及RTC只需要几十K的时钟即可。同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也会越弱,所以对于较为复杂的MCU,一般都是采用多时钟源的方法来解决这些问题。

在STM32L4中,有6个重要的时钟源,为HSI、HSE、LSI、LSE、MSI、PLL。

其中PLL实际是分为三个时钟源,分别为主PLL、PLLISAI1和PLLSAI2。

从时钟频率来分可以分为高速时钟源和低速时钟源,在这6个中,HSI,HSE,MSI以及PLL是高速时钟,LSI和LSE是低速时钟。从来源可分为外部时钟源和内部时钟源,外部时钟源就是从外部通过接晶振的方式获取时钟源,其中HSE和LSE是外部时钟源,其它的是内部时钟源。

  1. LSI是低速内部时钟,RC振荡器,频率为32kHz左右。供独立看门狗、RTC和LCD使用。
  2. LSE是低速外部时钟,频率为32.768kHz的石英晶体。这个主要是RTC的时钟源。
  3. HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~48MHz。我们的开发板接的是8MHz的晶振。HSE也可以直接做为系统时钟或者PLL输入。
  4. HSI是高速内部时钟,RC振荡器,频率为16MHz。可以直接作为系统时钟或者用作PLL输入。
  5. MSI时钟信号由内部RC振荡器产生,其频率范围可通过时钟控制寄存器(RCC_CR)中的MSIRANGE[3:0]位进行调整。
  6. PLL为锁相环倍频输出。STM32L4有三个PLL:
  1. 主PLL(PLL)可由HSE、HIS或者MSI提供时钟信号,并具有三个不同的输出时钟。
    第一个输出 PLLR,用于生成高速的系统时钟(SYSTEM,最高 80MHz)
    第二个输出 PLLQ,可为 USB、RNG 和 SDMMC 提供时钟源
    第三个输出 PLLP,可用于 SAI1 和 SAI2 时钟
  2. PLLSAI1 用于生成精确时钟,同样具有三个不同的输出时钟。
    第一个输出 PLLSAI1P,可用于 SAI1 和 SAI2 时钟
    第二个输出 PLLSAI1Q,可为 USB、RNG 和 SDMMC 提供时钟源。
    第三个输出 PLLSAI1R,可为 ADC 提供时钟
  3. PLLSAI2 用于生成精确时钟,具有两个不同的输出时钟。
    第一个输出 PLLSAI2P,可用于 SAI1 和 SAI2 时钟
    第二个输出 PLLSAI2R,可为 ADC 提供时钟

从图中可以看出,主PLL的时钟源要经过一个分频系数为M的分频器,然后经过倍频系数为N的倍频器,出来之后还需要经过分频系数为R(输出PLLR时钟)、或者P(PLLP时钟)、或者Q(输出PLLQ时钟),最后才生成最终的主PLL时钟。

相关推荐
怀旧6669 分钟前
spring boot 项目配置https服务
java·spring boot·后端·学习·个人开发·1024程序员节
infiniteWei1 小时前
【Lucene】原理学习路线
学习·搜索引擎·全文检索·lucene
follycat1 小时前
[极客大挑战 2019]PHP 1
开发语言·学习·网络安全·php
并不会5 小时前
常见 CSS 选择器用法
前端·css·学习·html·前端开发·css选择器
龙鸣丿5 小时前
Linux基础学习笔记
linux·笔记·学习
Nu11PointerException7 小时前
JAVA笔记 | ResponseBodyEmitter等异步流式接口快速学习
笔记·学习
@小博的博客11 小时前
C++初阶学习第十弹——深入讲解vector的迭代器失效
数据结构·c++·学习
南宫生12 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
scan112 小时前
单片机串口接收状态机STM32
stm32·单片机·串口·51·串口接收
懒惰才能让科技进步12 小时前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝