STM32 - CubeL4使用手册

STM32Cube开发包里面包含STM32 ARM芯片的各种示例和开发板相关的demo工程。

这个可以去官网下载,我下载的是STM32L4系列芯片的Cube开发包:en.stm32cubel4_v1-17-0.zip。

下载之后解压,里面有一个使用手册文档,下面就介绍一下。

UM1860 User manual

Getting started with STM32CubeL4 MCU Package for STM32L4 Series  and STM32L4+ Series

STM32CubeL4的主要功能:

STM32Cube开发包里,有HAL层代码,使用HAL能最大的保证基于STM32系列芯片的代码可重用性。

不使用HAL,也可以只使用low-layer APIs,实现最好的性能和代码占用量,并对硬件进行更深度的控制。

里面还有中间件,比如FAT文件系统,RTOS,USB Host and Device,Touch library and Graphics。

并提供了所有片上外设的应用例子。

提供的这些软件组件,既包括中间件层也包括应用层,各种例子可以跑在相应型号的开发板上。

HAL和LL API是开源的BSD license。

STemWin是一个二进制图形软件库,由合作伙伴Segger提供。

CMSIS-RTOS的实现是开源的FreeRTOS。

FAT文件系统基于开源的FatFS解决方案。

STMTouch触摸屏处理库。

STM32CubeL4的架构概览:

Level 0里的例子,分Examples, Examples_LL and Examples_MIX三种,分别表示适用HAL的,适用LL的和混使用两种的。

Level 1里的例子被成为Applications,提供了每个中间件组件的具体应用。

在实际项目种,可以直接使用这些模板项目进行快速开发。

BSP,Board support package

板级支持包

该层提供了一套与板子的硬件组件(即LCD、音频、microSD™和MEMS驱动器)相对应的API。它由两部分组成。

- 组件

这是与电路板上的外部设备相关的驱动,不属于STM32。

组件驱动为外部组件提供了特定的API。

并且可以在任何其他板子上移植。

- BSP驱动

它允许将组件驱动链接到一个特定的板子上,并提供一套用户友好的APIs。

API的命名规则是BSP_FUNCT_Action()。

例如:BSP_LED_Init(), BSP_LED_On()

BSP基于一个模块化的结构,只需实现低级的例程就可以轻松地移植到任何硬件。

Hardware abstraction layer (HAL) and low-layer (LL)

STM32CubeL4的HAL和LL是互补的,涵盖了广泛的应用需求。

- HAL驱动提供了高层次的功能导向的和高度可移植的API。它们向最终用户隐藏了MCU和外围设备的复杂性。

HAL驱动提供通用的面向功能的支持多实例的API,通过提供现成的例程来简化用户应用的实现。

举例,对于通信外设(如I2S或UART),HAL驱动提供了API允许初始化和配置外设,管理基于轮询的、中断的和DMA方式的数据传输,以及处理可能出现的通信错误。

HAL驱动程序的API分为两类:

1.通用API,为所有STM32系列提供通用的功能

2.扩展API,为特定的系列或特定的部件号提供特定和定制的功能。

- 低层API提供寄存器级别的低层API,性能经过优化,但可移植性较差。

它们需要对MCU和外设规格有深入的了解。

LL驱动的设计是为了提供一个快速的、面向专家的轻量级层,它比HAL更接近硬件。

与HAL相比,LL API不适用于给那些性能优化不是关键问题的外设,也不适用那些需要大量软件配置或复杂的上层软件框架,如FSMC,USB,或SDMMC。

LL驱动的功能:

1.一组函数用来根据数据结构中指定的参数初始化外设的主要功能。

2.一组函数用来适用复位默认值来填充初始化数据结构。

3.用于外设的功能的销毁处理(外设寄存器恢复到其默认值)。

4.一套用于直接访问寄存器的内联函数

5.完全独立于HAL,能够在独立模式下使用(没有HAL驱动)

6.全面覆盖所支持的外设特性。

Middleware components

各个中间件之间的通信,属于水平级别交互,直接调用API。

垂直方向交互方式是通过特定的callback函数和底层驱动交互,和适用一些静态的宏定义来实现调用。

还可以通过一个抽象层,通过配置文件的形式来实现垂直通信,避免中间件软件库依赖于特定LL。

具体的Cube内基于MCU的包文件结构:

在Cube里提供的工程类型,由EWARM、MDK-ARM和SW4STM32三种。

-------------------------------------------- 

开始使用STM32CubeL4

运行开发包内的例子项目程序。找到里面的Examples文件夹,里面的每个文件夹都是一个片上外设的应用例程项目,可以打开工程并运行。

开发用户的应用程序:

1,基于HAL层的应用修改

找一个模板项目。根据芯片型号或相应的开发板,找到里面的Examples、Templates、Applications和Demonstrations,选择相应的一个工程作为模板。

模板项目里有在板子上开发需要的最小组件,包括HAL、CMSIS和BSP。

工程还设定好了各个组件的include头文件路径。

设置了芯片型号和相关的配置文件。

初始化了ARM core Systick,用来实现HAL_Delay功能。

2,按需添加中间件。

可以添加:USB Host and Device library, STMTouch touch sensing, STemWin, FreeRTOS™ and FatFS. 

注意需要的源文件和头文件都要添加。可参照:\Projects\STM32xxx_yyy\Applications\<MW_Stack>

3,配置软件组件

HAL 和中间件组件提供了一组构建时配置选项,使用宏 #define 在头文件中声明。 

比如文件:stm32l4xx_hal_conf.h

这里面每个宏就是个开关,表示某个外设模块的驱动是否启用。

4,启动HAL库。

在main函数开始,需要执行HAL_Init API来初始化HAL库。

执行的任务包括设置1ms的systick。设置NVIC。

调用HAL_MspInit的函数,定义在stm32l4xx_hal_msp.c里,这里是用户具体实现的硬件初始化。

5,设置系统时钟

HAL_RCC_OscConfig()函数设置外部或内部时钟,包括PLL设置。如果系统没有高频率运行需求,可以不使用PLL。

HAL_RCC_ClockConfig()设置时钟频率。

6,初始化外设

启用外设时钟。

配置外设的GPIO。

设置DMA通道,或者启用DMA中断。

启用外设中断源。

stm32xxx_it.c这个文件存放具体的用户的中断设置。

在main函数里,调用HAL_PPP_Init函数初始化外设。

7,进行具体应用的开发和编程

到这一步,系统准备就绪,用户可以开始编码了。

注意:在外设的中断服务例程ISR中,如果调用HAL_Delay的话,就要保证systick interrupt的优先级要更高。

使用__weak定义的函数,用户可以重新实现定义,以覆盖原有的__weak声明的函数定义。

创建的工程里,main.c文件里都会有一个main loop function,例子里面的模板功能一般都是空的实现。

还有SystemClock_Config( )函数。

在根据示例项目创建自己的项目是,需要注意替换的文件:

stm32l4xx_it.h,stm32l4xx_it.c

使用STM32CubeMX工具可以生成初始化C代码。通过界面配置各种资源,包括GPIO、Clock Tree、Power等。

下载和更新的方法:

可以访问www.st.com/stm32l4。选择“Tools & Software” -> Ecosystems ->STM32CubeL4, 直接点击下载。

或者在STM32CubeMX里,点击"INSTALL/REMOVE"按键,选择相应的芯片系列,可以安装相应版本的Cube包。

安装后会存放在STM32CubeMX的代码仓库下。比如地址:C:\Users\XXX\STM32Cube\Repository\STM32Cube_FW_L4_V1.17.0

问答:

是否有任何随现成可用的示例项目?

有的。 STM32CubeL4 提供了一组丰富的示例和应用程序。 它们带有用于 IAR Embedded Workbench®、Keil® 和 GCC 工具链的预配置项目。

与标准外设库(SPL - Standard Peripheral Libraries)有任何联系吗?

STM32Cube HAL 和 LL 驱动程序替换了标准外设库:

• 与标准外设API相比,HAL 驱动程序提供更高的抽象级别。 他们专注于外围通用功能而不是硬件。 更高

抽象级别允许定义一组用户友好的 API,这些 API 可以很容易地从一种产品移植到另一种产品。

• LL 驱动程序在寄存器级别提供低级API。 它们的组织方式比直接寄存器访问更简单和清晰。 LL 驱动程序还包括外围设备初始化,相比标准外设库经过了优化。

和HAL相比,将标准驱动库移植到LL更加容易一些,因为标准外设库和LL API都有对等的API。

HAL 驱动程序是否使用中断或 DMA?如何实现?

是的,使用了。 HAL 层支持三种 API 编程模型:轮询、中断和 DMA(包括使用和不适用中断)。

如何管理产品/外设的特殊独有功能?

HAL驱动程序提供扩展API; 也就是说,在公共API之外的特殊功能通过附加形式添加,以支持某些产品独有的功能。

STM32Cubemx如何生成嵌入式软件代码?

STM32Cubemx具有STM32微控制器的内置信息,包括其外设和软件,为用户提供图形操作界面,并根据用户的配置生成* .h / *c文件。

我应该什么时候使用Hal而不是LL驱动程序?

HAL驱动程序提供high level的和面向功能的API,有更好的移植性。 产品或IP的复杂性对最终用户是隐藏的。

LL驱动程序在寄存器级别提供low level的API,具有更好的优化,但移植性差一些。 它们需要深入了解产品/ IPs的规范。

如何在我的环境中包含LL驱动程序?有没有和HAL一样的用于L的L配置文件?

没有配置文件。 源代码应直接包含必要的STM32L4XX_LL_PPP.H文件。

我可以一起使用Hal和LL驱动程序吗? 如果是的话,有什么约束?

可以使用HAL和LL驱动程序。 用HAL处理IP初始化阶段,然后使用LL驱动程序管理I / O操作。

HAL和LL之间的主要区别是HAL驱动程序需要创建和使用资源句柄进行操作管理,而LL驱动程序直接在外围寄存器上运行。 混合HAL和LL的示例在Examples_MIX里。

是否有HAL所没有的LL API?

是的,有的。

在stm32l4xx_ll_cortex.h中增加了一些Cortex® API,例如访问SCB或SysTick寄存器。

为什么在LL驱动上不启用SysTick中断?

因为在独立模式下使用LL驱动时,没有必要启用SysTick中断,因为它们不用于LL APIs,而HAL函数需要SysTick中断来管理超时。

LL初始化API是如何启用的?

LL初始化API的定义和相关资源(结构体、字面常量和原型)是由USE_FULL_LL_DRIVER编译开关决定的。

为了能够使用LL APIs,请在工具链编译器的预处理程序中添加这个开关。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜流冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值