STM32

STM32是STMicroelectronics(意法半导体)推出的一系列基于ARM Cortex-M内核的32位微控制器(MCU)产品。这些微控制器提供了广泛的产品系列,覆盖了多种不同的性能和功能需求,适用于各种应用领域,包括工业控制、汽车电子、消费类电子、医疗设备等。

STM32系列微控制器以其高性能、低功耗、丰富的外设接口和灵活的开发工具而闻名。它们通常具有丰富的存储器、多种通信接口(如UART、SPI、I2C、CAN等)、模拟数字转换器(ADC)、定时器、PWM输出等功能,以满足不同应用场景下的需求。

STM32微控制器通常使用标准的ARM Cortex-M内核,包括Cortex-M0、M0+、M3、M4和M7等,这些内核具有不同的性能和功耗特性,可根据具体应用的需求进行选择。此外,STM32系列还提供了多种封装和引脚配置,以满足不同尺寸和集成度的要求。

STMicroelectronics为STM32系列提供了丰富的开发工具和支持资源,包括基于ARM开发环境的集成开发环境(IDE)、调试器、评估板和参考设计等。这些工具和资源有助于开发人员快速开发和部署他们的应用,并提供了全面的技术支持和文档资料,帮助用户充分发挥STM32微控制器的性能和功能优势。

意法半导体TCPP03-M20 USB Type-C端口保护 IC为双角色输电(DRP)应用量身定制,针对能给相连设备充电又能接受其他 USB-C电源的双向充放电产品,可以简化其设计。

“意法半导体端口保护

作为有ST UCPD (USB Type-C 和Power Delivery)接口IP模块的 STM32G0*、STM32G4、STM32L5 和 STM32U5 微控制器的配套芯片,TCPP03-M20让设计者以经济划算的方式进行USB Type-C 接口硬件分区,实现以 STM32 为主微控制器的双芯片解决方案,从而节省物料清单成本,缩减PCB电路板空间,降低电路复杂性。

根据 USB Type-C 规范的定义,一台USB-C 双角色输电设备,例如,智能扬声器、智能手机、平板电脑、笔记本电脑、相机等,能够动态地把输电角色从受电改为送电,把USB 数据角色从设备改为主机,反之亦然。这可以实现在电池供电设备之间保存和共享电能的新用例,并扩展设备互操作性。Type-C 规范定义的 USB DRP 功能允许任何内置意法半导体芯片的 USB 设备为所连设备的电池充电。

TCPP03-M20 采用意法半导体的BCD制造工艺。这项工艺最近通过了IEEE Milestone认证,能够在同一颗芯片上整合逻辑电路和高压电路,提高集成度和可靠性,可在同一芯片上实现 ±8kV ESD 保护(IEC61000-4-2 Level 4)、过压和过流保护。这些保护功能是防护意外短路事故或连接故障设备,符合 USB-C Power Delivery技术规范,必不可少的功能。该芯片集成了USB-C 端口的 VCONN 和 CC 两条线的开关管;带有两个 N 沟道 MOSFET 栅极驱动器的Source和Sink通道电荷泵;VBUS 和 VCONN 电源路径放电电路,以及无电量电池管理。

TCPP03-M20优化了超低功耗性能,为USB DRP用例专门设计,确保应用设备具有出色的能效。意法半导体的TCPP01-M12 和 TCPP02-M18 BCD IC是独立的Power Sink和Power Source(供电和受电)解决方案。像意法半导体的所有 TCPP 产品一样,TCPP03-M20 符合 USB-C PD 规范 3.1 标准功率范围 (SPR) 的最新功能,包括 PPS(可编程电源)。

STM32 Nucleo 扩展板 X-NUCLEO-DRP1M1X-CUBE-TCPP STM32Cube扩展软件以及应用代码示例现已上市,有助于加快基于TCPP03-M20 的高达100W DRP 应用项目的开发。开发者还可以利用STM32CubeMX的UCPD 配置支持、STM32G071B-DISCO USB-C 嗅探器和STM32CubeMonitor-UCPD 调试工具。Power Sink受电开发板X-NUCLEO-SNK1M1板现已上市,而Power Source送电开发板 X-NUCLEO-SRC1M1计划于 2021 年第四季度发布。

TCPP03-M20现已投产,采用 4mm x 4mm VFQFPN20 封装。

来源:意法半导体
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 19

STM32Cube.AI是意法半导体AI生态系统的一部分,是STM32Cube的一个扩展包,它可以自动转换和优化预先训练的神经网络模型并将生成的优化库集成到用户项目中,从而扩展了STM32CubeMX的功能。它还提供几种在桌面PC和STM32上验证神经网络模型以及测量模型性能的方法,而无需用户手工编写专门的C语言代码。

“专为STM32

上一篇文章大致介绍了STMCube.AI的基本特性,以及其工作流程。

本文将更深入地介绍它的一些高级特性。将涉及以下主题:

  • 运行时环境支持:Cube.AI vs TensorFlow Lite

  • 量化支持

  • 图形流与存储布局优化

  • 可重定位的二进制模型支持

运行时环境支持:Cube.AI vs TensorFlow Lite

STM32Cube.AI支持两种针对不同应用需求的运行时环境:Cube.AI和TensorFlow Lite。作为默认的运行时环境,Cube.AI是专为STM32高度优化的机器学习库。而TensorFlow Lite for Microcontroller是由谷歌设计,用于在各种微控制器或其他只有几KB存储空间的设备上运行机器学习模型的。其被广泛应用于基于MCU的应用场景。STM32Cube.AI集成了一个特定的流程,可以生成一个即时可用的STM32 IDE项目,该项目内嵌TensorFlow Lite for Microcontrollers运行时环境(TFLm)以及相关的TFLite模型。这可以被看作是Cube.AI运行时环境的一个替代方案,让那些希望拥有一个跨多个项目的通用框架的开发人员也有了选择。

“专为STM32

虽然这两种运行时环境都是为资源有限的MCU而设计,但Cube.AI在此基础上针对STM32的独特架构进行了进一步优化。因此,TensorFlow Lite更适合有跨平台可移植性需求的应用,而Cube.AI则更适合对计算速度和内存消耗有更高要求的应用。

下表展示了两个运行时环境之间的性能比较(基于一个预训练的神经网络参考模型)。评价指标是在STM32上的推断时间和内存消耗。

“专为STM32

如表中所示,对于同一模型,Cube.AI运行时环境比TFLite运行时环境节约了大概20%的flash存储和约8%的RAM存储。此外,它的运行速度几乎比TFLite运行时环境快了2倍。

对于TFLite模型,用户可以在STM32Cube.AI的网络配置菜单中对2个运行时环境进行选择。

“专为STM32

量化支持

量化是一种被广泛使用的优化技术,它将32位浮点模型压缩为位数更少的整数模型,在精度只略微下降的情况下,减少了存储大小和运行时的内存峰值占用,也减少了CPU/MCU的推断时间和功耗。量化模型对整数张量而不是浮点张量执行部分或全部操作。它是面向拓扑、特征映射缩减、剪枝、权重压缩等各种优化技术的重要组成部分,可应用在像MCU一样资源受限的运行时环境。

通常有两种典型的量化方法:训练后量化(PTQ)和量化训练(QAT)。PTQ相对容易实现,它可以用有限的具有代表性的数据集来量化预先训练好的模型。而QAT是在训练过程中完成的,通常具有更高的准确度。

STM32Cube.AI通过两种不同的方式直接或间接地支持这两种量化方法:

  • 首先,它可以用来部署一个由PTQ或QAT过程生成的TensorFlow Lite量化模型。在这种情况下,量化是由TensorFlow Lite框架完成的,主要是通过“TFLite converter” utility导出TensorFlow Lite文件。

  • 其次,其命令行接口(CLI)还集成了一个内部的训练后量化(PTQ)的过程,支持使用不同的量化方案对预训练好的Keras模型进行量化。与使用TFLite Converter工具相比,该内部量化过程提供了更多的量化方案,并在执行时间和精确度方面有更好的表现。

“专为STM32

下表显示了在STM32上部署量化模型(与原有浮点模型相比)的好处。此表使用FD-MobileNet作为基准模型,共有12层,参数大小145k,MACC操作数24M,输入尺寸为224x224x3。

“专为STM32

从表中很容易看出,量化模型节省了约4倍的flash存储和RAM存储,且运行速度提高了约3倍,而精确度仅仅下降了0.7%。

如果已经安装了X-Cube-AI包,用户可以通过以下路径找到关于如何使用命令行界面(CLI)进行量化的教程:

C:\Users\username\STM32Cube\Repository\Packs\STMicroelectronics\X-CUBE-AI\7.0.0\Documentation\quantization.html。

在文档的末尾还附上了一个快速实践示例:“量化一个MNIST模型”。

图形流与存储布局优化

除了量化技术,STM32Cube.AI还通过使用其C代码生成器的优化引擎,针对推理时间优化内存使用(RAM & ROM)。该引擎基于无数据集的方法,无需验证或测试数据集来应用压缩和优化算法。

第一种方法:权重/偏置项压缩,采用k -均值聚类算法。该压缩算法仅适用于全连接层。其优势是压缩速度快,但是结果并不是无损的,最终的精度可能会受到影响。STM32Cube.AI提供“验证”功能,用于对所生成的C模型中产生的误差进行评估。

“压缩”选项可以在STM32Cube.AI的网络配置中激活,如下图所示:

“专为STM32

第二种方法:操作融合,通过合并层来优化数据布局和相关的计算核。转换或优化过程中会删除一些层(如“Dropout”、“Reshape”),而有些层(如非线性层以及卷积层之后的池化层)会被融合到前一层中。其好处是转换后的网络通常比原始网络层数少,降低了存储器中的数据吞吐需求。

“专为STM32

最后一种方法是优化的激活项存储。其在内存中定义一个读写块来存储临时的隐藏层值(激活函数的输出)。此读写块可以被视为推理函数使用的暂存缓冲区,在不同层之间被重复使用。因此,激活缓冲区的大小由几个连续层的最大存储需求决定。比如,假设有一个3层的神经网络,每一层的激活值分别有5KB, 12KB和3KB,那么优化后的激活缓冲区大小将是12KB,而不是20KB。

可重定位的二进制模型支持

非可重定位方法(或“静态”方法)指的是:生成的神经网络C文件被编译并与最终用户应用程序堆栈静态链接在一起。

如下图所示,所有对象(包括神经网络部分和用户应用程序)根据不同的数据类型被一起链接到不同的部分。在这种情况下,当用户想要对功能进行部分更新时(比如只更新神经网络部分),将需要对整个固件进行更新。

“专为STM32

相反,可重定位二进制模型指定一个二进制对象,该对象可以安装和执行在STM32内存子系统的任何位置。它是所生成的神经网络C文件的编译后的版本,包括前向核函数以及权重。其主要目的是提供一种灵活的方法来更新AI相关的应用程序,而无需重新生成和刷写整个终端用户固件。

生成的二进制对象是一个轻量级插件。它可以从任何地址(位置无关的代码)运行,其数据也可放置于内存中的任何地方(位置无关的数据)。

STM32Cube.AI简单而高效的AI可重定位运行时环境可以将其实例化并使用它。STM32固件中没有内嵌复杂的资源消耗型动态链接器,其生成的对象是一个独立的实体,运行时不需要任何外部变量或函数。

下图的左侧部分是神经网络的可重定位二进制对象,它是一个自给自足的独立实体,链接时将被放置于终端用户应用程序的一个单独区域中(右侧部分)。它可以通过STM32Cube.AI的可重定位运行时环境被实例化以及动态链接。因此,用户在更新AI模型时只需要更新这部分二进制文件。另外,如果有进一步的灵活性需求,神经网络的权重也可以选择性地被生成为独立的目标文件。

“专为STM32

可重定位网络可以在STM32Cube.AI的高级设置中激活,如下图所示:

“专为STM32

最后,作为意法半导体人工智能生态系统的核心工具,STM32Cube.AI提供许多基本和高级功能,以帮助用户轻松创建高度优化和灵活的人工智能应用。

来源:意法半导体中国
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 123

使用FlyMCU往STM32中烧写程序

cathy的头像

1、软硬件环境

1)操作系统:Windows

2)软件:

  • Keil
  • FlyMcu

3)硬件:

  • PC
  • STM32最小系统开发板
  • USB转TTL CH340G

2、生成hex文件

编写好要烧写的程序后,点击菜单栏的【Flash】,选择【Config Flash Tools】。首先,在【Device】页面中选择设备类型,这里是STM32F103C8。

“使用FlyMCU往STM32中烧写程序"

然后,切换到【Output】页面,勾选【Create HEX File】,最后点击【OK】。

本文我们来学习下STM32的待机唤醒功能。要实现的功能是:系统运行时 D1 指示灯闪烁,5 秒后进入待机模式,D1 指示灯熄灭,同时串口 printf输出相关提示信息,可通过 K_UP 按键实现唤醒。学习本内容可以参考《STM32F10x中文参考手册》-4 电源控制器(PWR)章节。

STM32低功耗模式介绍

很多单片机具有低功耗模式,比如 MSP430、STM8L等。我们的STM32也不例外,相关文章:STM32低功耗模式。默认情况下,系统复位或上电复位后,微控制器进入运行模式。在运行模式下,HCLK 为 CPU 提供时钟,并执行程序代码。当 CPU 不需继续运行(例如等待外部事件)时,可以利用多种低功耗模式来节省功耗。用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。

当然在运行模式下,也可以通过如下方式降低功耗:

(1)降低系统时钟速度

(2)不使用 APBx 和 AHB 外设时,将对应的外设时钟关闭

STM32 提供了 3 种低功耗模式,以达到不同层次的降低功耗的目的,这三种模式如下:

(1)睡眠模式( CM3 内核停止工作,外设仍在运行)

(2)停止模式(所有时钟都停止)

(3)待机模式( 1.8 V 内核电源关闭)

这三种模式所需的功耗是逐级递减,也就是说待机模式功耗是最低的。三种低功耗模式汇总表如下图所示:

“STM32实例-待机唤醒实验"

我们仅对 STM32 的待机模式进行介绍,其他 2 种模式可以参考《STM32F10x 中文参考手册》-4电源控制器(PWR)章节,里面有详细的介绍。

(1)待机模式

在睡眠模式中,仅关闭了内核时钟,内核停止运行,但其片上外设, CM3 核心的外设全都照常运行。在停止模式中,进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其 1.8V 区域的部分电源没有关闭,还保留了内核的寄存器、内存的信息,所以从停止模式唤醒,并重新开启时钟后,还可以从上次停止处继续执行代码。在待机模式中, 它除了关闭所有的时钟, 还把 1.8V 区域的电源也完全关闭了,也就是说,从待机模式唤醒后,由于没有之前代码的运行记录,只能对芯片复位,重新检测 BOOT 条件,从头开始执行程序。低功耗开发相关文章:STM32低功耗开发时,需要注意的GPIO配置问题。

那么我们如何进入待机模式呢?其实很简单,只要按下图所示待机模式进入与退出步骤的步骤执行就可以了。

“STM32实例-待机唤醒实验"

上图还列出了退出待机模式的操作,当检测到外部复位(NRST 引脚)、

IWDG 复位、 WKUP 引脚上升沿、 RTC 闹钟事件的上升沿时,微控制器退出待机模式。本文我们是通过 WKUP 引脚(PA0)上升沿来退出待机模式,当然也可以直接通过芯片复位管脚 NRST退出。

从待机模式唤醒后,除了电源控制/状态寄存器(PWR_CSR),所有的寄存器豆被复位,程序将按照复位(启动引脚采样、复位向量已获取等)后的方式重新执行。电源控制/状态寄存器(PWR_CSR)将会指示内核由待机状态退出。

在进入待机模式后,除了复位引脚以及被设置为防侵入或校准输出时的

TAMPER (PC13)引脚和被使能的唤醒引脚( WK_UP 脚(PA0)),其他的 IO 引脚都将处于高阻态。

由于篇幅限制,本文并没有对待机模式相关寄存器进行介绍,大家可以参考《STM32F10x 中文参考手册》-4 电源控制器(PWR)章节,里面有详细的讲解。如果看不懂的可以暂时放下,因为我们使用的是库函数开发。

待机模式配置步骤

接下来我们介绍下如何使用库函数进入和退出待机模式。这个也是在编写程序中必须要了解的。

具体步骤如下:(电源管理相关库函数在 stm32f10x_pwr.c和 stm32f10x_pwr.h 文件中)

(1)使能电源时钟

因为低功耗模式是通过 STM32 电源(PWR)系统进行管理的,所以需要使能电源时钟,调用的库函数为:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//使能 PWR 外设时钟

(2)设置 WK_UP 引脚为唤醒源

待机唤醒方式有很多种,我们选择 WK_UP 引脚(PA0)上升沿来退出待机模式。在库函数中,设置使能 WK_UP 用于唤醒 CPU 待机模式的函数是:

PWR_WakeUpPinCmd(ENABLE);

因为按键 K_UP 连接在PA0 管脚上,并且是高电平有效,这样一来就可以使用 K_UP按键来退出待机模式。

(3)进入待机模式

进入待机模式, 首先要设置 SLEEPDEEP 位 ( 详见 《 Cortex M3 权威指南(中文)》 , chpt13 Cortex-M3 的其它特性--电源管理章节) ,接着我们通过 PWR_CR设置 PDDS 位,使得 CPU 进入深度睡眠时进入待机模式,最后执行 WFI 指令开始进入待机模式,并等待 WK_UP 中断的到来。整个操作可以通过一个库函数完成,如下:

PWR_EnterSTANDBYMode();//进入待机模式

通常在进入待机模式前,我们会清除唤醒标志,以等待下次进入。清除唤醒标志库函数为:

PWR_ClearFlag(PWR_FLAG_WU);//清除 Wake-up 标志

以上几步全部配置好后,我们就可以正常进入待机模式了,并且可以通过按键 K_UP或者复位按键唤醒。

特别提醒下,如果学到 RTC 实时时钟实验的时候,需要进入待机模式,如果使能了 RTC 闹钟中断的时候,进入待机模式前,必须按如下操作处理:

1.禁止 RTC 中断( ALRAIE、 ALRBIE、 WUTIE、 TAMPIE 和 TSIE 等)。

2.清零对应中断标志位。

3.清除 PWR 唤醒(WUF)标志(通过设置 PWR_CR 的 CWUF 位实现)。

4.重新使能 RTC 对应中断。

5.进入低功耗模式。

本实验使用到硬件资源如下:

(1)D1 指示灯

(2)串口 1

(3)K_UP 按键

D1指示灯、K_UP 按键、串口 1 电路在前面章节都介绍过,这里不多说。D1指示灯用来提示系统正常运行,K_UP 按键用来唤醒待机模式,串口 1 用来输出提示信息。

所要实现的功能是:系统运行时 D1 指示灯闪烁,5 秒后进入待机模式,D1 指示灯熄灭,同时串口 printf 输出相关提示信息,通过 K_UP 按键实现唤醒。

程序框架如下:

(1)配置进入与退出待机模式

(2)编写主函数

前面介绍待机模式配置步骤时,就已经讲解如何配置。下面我们打开“待机唤醒实验”工程,在 APP 工程组中可以看到添加了wkup.c文件(里面包含了待机模式驱动程序),在 StdPeriph_Driver 工程组中添加了 stm32f10x_pwr.c 库文件。电源系统管理相关操作的库函数都放在stm32f10x_pwr.c 和 stm32f10x_pwr.h 文件中,所以使用到电源系统管理就必须加入 stm32f10x_pwr.c 文件,同时还要包含对应的头文件路径。

这里我们分析几个重要函数,其他部分程序大家可以打开工程查看。

待机模式配置函数

要让系统进入待机模式,我们必须对它进行配置。进入待机模式代码如下:

/****************************************************************
* 函 数 名 : Enter_Standby_Mode
* 函数功能 : 进入待机模式
* 输 入 : 无
* 输 出 : 无
*****************************************************************/
void Enter_Standby_Mode(void)
{
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//使能 PWR 外设时钟
  PWR_ClearFlag(PWR_FLAG_WU);//清除 Wake-up 标志
  PWR_WakeUpPinCmd(ENABLE);//使能唤醒管脚 使能或者失能唤醒管脚功能
  PWR_EnterSTANDBYMode();//进入待机模式
}

该函数首先使能电源PWR时钟,然后清除唤醒标志位,并使能 WK_UP管脚为唤醒方式,最后进入待机模式。这一过程在前面步骤介绍中已经提了。

主函数

配置待机模式后,我们就可以编写主函数,代码如下:

/****************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*****************************************************************/
int main()
{
  SysTick_Init(72);
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2 组
  LED_Init();
  USART1_Init(9600);
  while(1)
  {
    printf("time: 5\r\n");
    led1=0;
    delay_ms(1000); //隔 1 秒显示计数
    printf("time: 4\r\n");
    led1=1;
    delay_ms(1000);
    printf("time: 3\r\n");
    led1=0;
    delay_ms(1000);
    printf("time: 2\r\n");
    led1=1;
    delay_ms(1000);
    printf("time: 1\r\n");
    led1=0;
    delay_ms(1000);
    printf("进入系统待机模式\r\n");
    Enter_Standby_Mode();
  }
}

主函数实现的功能很简单,首先调用之前编写好的硬件初始化函数,包括

SysTick 系统时钟,中断分组,LED 初始化等。然后进入 while 循环,每间隔一秒让 printf 输出一个信息,同时指示灯状态发生变化。倒计 5 秒钟后,调用函数 Enter_Standby_Mode进入待机模式,此时指示灯熄灭。

将工程程序编译后下载到开发板内,可以看到系统运行时 D1 指示灯不断闪烁,5 秒钟后进入待机模式,此时 D1 指示灯熄灭。当按下 K_UP 按键或复位按键时,待机模式被唤醒,系统重新运行,同时串口打印提示信息。如果想在串口调试助手上看到输出信息,可以打开“串口调试助手”,首先勾选下标号 1 DTR 框,然后再取消勾选。这是因为此串口助手启动时会把系统复位住, 通过 DTR 状态切换下即可。然后设置好波特率等参数后,串口助手上即会收到 printf发送过来的信息。(串口助手上先勾选下标号1 DTR框,然后再取消勾选)如下图所示。

“STM32实例-待机唤醒实验"

实验说明:下载待机唤醒实验程序后,若使用普中 ARM 仿真器下载其他的程序会出现报警,这是因为处于低功耗模式时,所有外设时钟都已关闭,所以需要在下载程序前先复位下系统。

来源:STM32嵌入式开发
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 220

1、FreeRTOS

由于RTOS需占用一定的系统资源(尤其是RAM资源),只有μC/OS-II、embOS、salvo、FreeRTOS等少数实时操作系统能在小RAM单片机上运行。

相对于C/OS-II、 embOS等商业操作系统,FreeRTOS操作系统是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行,其最新版本为6.0版。

作为一个轻量级的操作系统,FreeRTOS提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能等,可基本满足较小系统的需要。

FreeRTOS内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU总是让处于就绪态的、优先级最高的任务先运行。

FreeRT0S内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU的使用时间。

FreeRTOS的不足:相对于常见的μC/OS—II操作系统,FreeRTOS操作系统既有优点也存在不足。其不足之处, 一方面体现在系统的服务功能上,如FreeRTOS只提供了消息队列和信号量的实现,无法以后进先出的顺序向消息队列发送消息;另一方 面,FreeRTOS只是一个操作系统内核,需外扩第三方的GUI(图形用户界面)、TCP/IP协议栈、FS(文件系统)等才能实现一个较复杂的系统, 不像μC/OS-II可以和μC/GUI、μC/FS、μC/TCP-IP等无缝结合。

“STM32嵌入式开发中的RTOS,你用过哪些?"

在STM32CubeIDE中直接可以配置FreeRTOS,如上图。STM32使用FreeRTOS的相关文章,请移步此处:使用STM32CubeMx工具,写FreeRTOS的demo程序。

FreeRTOS资料多、生态活跃,在Cube中通过配置界面,三两下上手这款操作系统,推荐拿来入门。

基于不同的需求,下文再介绍下其他RTOS。

2、μClinux

μClinux是一种优秀的嵌入式Linux版本,其全称为micro-control Linux,从字面意思看是指微控制Linux。

同标准的Linux相比,μClinux的内核非常小,但是它仍然继承了Linux操作系统的主要特性,包括良好的稳定性和移植性、强大的网络功能、出色的文件系统支持、标准丰富的API,以及TCP/IP网络协议等。因为没有MMU内存管理单元,所以其多任务的实现需要一定技巧。

μClinux在结构上继承了标准Linux的多任务实现方式,分为实时进程和普通进程,分别采用先来先服务和时间片轮转调度,仅针对中低档嵌入式CPU特点进行改良,且不支持内核抢占,实时性一般。

综上可知,μClinux最大特点在于针对无MMU处理器设计,这对于没有MMU功能的STM32F103来说是合适的,但移植此系统需要至少512KB的RAM空间,1MB的ROM/FLASH空间,而STM32F103拥有256K的FLASH,需要外接存储器,这就增加了硬件设计的成本。

μClinux结构复杂,移植相对困难,内核也较大,其实时性也差一些,若开发的嵌入式产品注重文件系统和与网络应用则μClinux是一个不错的选择。

“STM32嵌入式开发中的RTOS,你用过哪些?"

3、μC/OS-II

μC/OS-II是在μC/OS的基础上发展起来的,是用C语言编写的一个结构小巧、抢占式的多任务实时内核。μC/OS-II能管理64个任务,并提供任务调度与管理、内存管理、任务间同步与通信、时间管理和中断服务等功能,具有执行效率高、占用空间小、实时性能优良和扩展性强等特点。

在文件系统的支持方面,由于μC/OS-II是面向中小型嵌入式系统的,即使包含全部功能,编译后内核也不到10 KB,所以系统本身并没有提供对文件系统的支持。但是μC/OS-II具有良好的扩展性能,如果需要也可自行加入文件系统的内容。

在对硬件的支持上,μC/OS-II能够支持当前流行的大部分CPU,μC/OS-II由于本身内核就很小,经过裁剪后的代码最小可以为2KB,所需的最小数据RAM空间为4 KB,μC/OS-II的移植相对比较简单,只需要修改与处理器相关的代码就可以。

综上可知,μC/OS-II是一个结构简单、功能完备和实时性很强的嵌入式操作系统内核,针对于没有MMU功能的CPU,它是非常合适的。它需要很少的内核代码空间和数据存储空间,拥有良好的实时性,良好的可扩展性能,并且是开源的,网上拥有很多的资料和实例,所以很适合向STM32F103这款CPU上移植。

“STM32嵌入式开发中的RTOS,你用过哪些?"

4、eCos

eCos(embedded Configurable operating system),即嵌入式可配置操作系统。它是一个源代码开放的可配置、可移植、面向深度嵌入式应用的实时操作系统。

最大特点是配置灵活,采用模块化设计,核心部分由小同的组件构成,包括内核、C语言库和底层运行包等。

每个组件可提供大量的配置选项(实时内核也可作为可选配置),使用eCos提供的配置工具可以很方便地配置,并通过不同的配置使得eCos能够满足不同的嵌入式应用要求。

eCos操作系统的可配置性非常强大,用户可以自己加入所需的文件系统。eCos操作系统同样支持当前流行的大部分嵌入式CPU,eCos操作系统可以在16位、32位和64位等不同体系结构之间移植。

“STM32嵌入式开发中的RTOS,你用过哪些?"

eCos由于本身内核就很小,经过裁剪后的代码最小可以为10 KB,所需的最小数据RAM空间为10 KB。

在系统移植方面 eCos操作系统的可移植性很好,要比μC/OS-II和μClinux容易。

综上所述,eCos最大特点是配置灵活,并且支持无MMU的CPU的移植,开源且具有很好的移植性,也比较合适于移植到STM32平台的CPU上。但eCOS的应用还不是太广泛,还没有像μC/OS-II那样普遍,并且资料也没有μC/OS-II多。eCos适合用于一些商业级或工业级对成本敏感的嵌入式系统,例如消费电子领域中的一些应用。

5、mbed OS

开源嵌入式操作系统,ARM公司将mbed OS免费提供给所有厂商使用,mbed提供了一个相对更加系统和更加全面的智能硬件开发环境。

主要功能:

提供用于开发物联网设备的通用操作系统基础,以解决嵌入式设计的碎片化问题。支持所有重要的连接性与设备管理开放标准,以实现面向未来的设计。使安全可升级的边缘设备支持新增处理能力与功能。通过自动电源管理解决复杂的能耗问题。

主要特点:

开发速度快,功能强大,安全性高,为了量产化而设计,可离线开发,也可以在网页上编辑。

“STM32嵌入式开发中的RTOS,你用过哪些?"

6、RTX

是ARM公司的一款嵌入式实时操作系统,使用标准的C结构编写,运用RealView编译器进行编译。不仅仅是一个实时内核,还具备丰富的中间层组件,不但免费,而且代码也是开放的。

主要功能:

开始和停止任务(进程),除此之外还支持进程通信,例如任务的同步、共享资源(外设或内存)的管理、任务之间消息的传递。开发者可以使用基本函数去开启实时运行器,去开始和终结任务,以及去传递任务间的控制(轮转调度)。开发者可以赋予任务优先级。

主要特点:

支持时间片,抢占式和合作式调度。不限制数量的任务,每个任务都具有254的优先级。不限制数量的信号量,互斥信号量,消息邮箱和软定时器。支持多线程和线程安全操作。使用MDK基于对话框的配置向导,可以很方便的完成MDK的配置。

7、都江堰

都江堰操作系统,简称djyos,得名于一个伟大的水利工程:都江堰。

与传统操作系统不同,djyos不是以线程而是以事件为调度核心,这种调度算法使程序员摆脱模拟计算机执行过程编写程序的思维方式,而是按人类认知世界的方式编写应用程序,就如同在嵌入式编程中引入了VC似的。

djyos的调度算法使程序员可以摆脱线程和进程的束缚,djyos没有有关线程的api,一个完全不懂线程知识的程序员也可以顺利地在djyos下编写应用程序。

djyos 操作系统是以事件为核心进行调度的,这种调度策略使程序员可以按人类认知事物的习惯而不是计算机的习惯来编程。

“STM32嵌入式开发中的RTOS,你用过哪些?"

8、RT-Thread

嵌入式操作系统RTOS介绍,RT-Thread是一个集实时操作系统(RTOS)内核、中间件组件和开发者社区于一体的技术平台,由熊谱翔先生带领并集合开源社区力量开发而成,RT-Thread也是一个组件完整丰富、高度可伸缩、简易开发、超低功耗、高安全性的物联网操作系统。

RT-Thread具备一个IoT OS平台所需的所有关键组件,例如GUI、网络协议栈、安全传输、低功耗组件等等。经过11年的累积发展,RT-Thread已经拥有一个国内最大的嵌入式开源社区,同时被广泛应用于能源、车载、医疗、消费电子等多个行业,累积装机量超过两千万台,成为国人自主开发、国内最成熟稳定和装机量最大的开源RTOS。

国内最有可能成为Top 1,优势在于丰富的组件,中立立场!赶上了时机,得到诸多芯片厂商的支持,也挺受开发者喜欢的。缺点在于本身的教程文档和freertos等之类的比还是很弱。

来源:http://www.sylixos.com/

直接来源:STM32嵌入式开发
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 888

最近因为要为芯片选定核,所以就在了解哪些核合适且性价比好,这是一个需要结合产品各类技术、市场分析的活,看似简单却还是需要一些储备的,今天选了一篇ARM Cortex系列的科普文章与大家分享。

众所周知,英国的ARM公司是嵌入式微处理器世界当中的佼佼者。ARM一直以来都是自己研发微处理器内核架构,然后将这些架构的知识产权授权给各个芯片厂商,精简的CPU架构,高效的处理能力以及成功的商业模式让ARM公司获得了巨大的成功,使它迅速占据了32位嵌入式微处理器的大部分市场份额。

目前,随着对嵌入式系统的要求越来越高,作为其核心的嵌入式微处理器的综合性能也受到日益严峻的考验,现在一个高端智能手机的处理能力几乎可以和几年前的笔记本电脑相当。为了迎合市场的需求,ARM公司也在加紧研发他们最新的 ARM架构,Cortex系列就是这样的产品。那么我们今天就不妨好好了解一下ARM Cortex系列处理器知识点汇总。

“​

ARM Cortex系列处理器

ARM公司在经典处理器ARM11以后的产品改用Cortex命名,并分成A、R和M三类,旨在为各种不同的市场提供服务。

1、Cortex-A:面向尖端的基于虚拟内存的操作系统和用户应用

2、Cortex-R:针对实时系统

3、Cortex-M:微控制器

“​

ARM Cortex系列处理器——Cortex-A

ARM Cortex-A 系列是一系列用于复杂操作系统和用户应用程序的应用程序处理器。Cortex-A 系列处理器支持 ARM、Thumb 和 Thumb-2 指令集。

RM公司的Cortex-A系列处理器适用于具有高计算要求、运行丰富操作系统以及提供交互媒体和图形体验的应用领域。

“​

如图所示,绿色的部分都是v7-A的架构,蓝色的是v8-A架构,基本上绿色都是可以支持到32和64位的,除了A32,只支持到32位。在右边的每个部分,比如说需要高效能的最上面的A15-A73这个部分是最高效的,接下来就是比较注重整个效率的部分了,中间那个部分是比较高效率的,最下面那栏的是效率最好的,在电池的效能方面达到了最好的标准。

如果非要给他们一个排序的话,从高到低大体上可排序为:Cortex-A73处理器、Cortex-A72处理器、Cortex-A57处理器、Cortex-A53处理器、Cortex-A35处理器、Cortex-A32处理器、Cortex-A17处理器、Cortex-A15处理器、Cortex-A7处理器、Cortex-A9处理器、Cortex-A8处理器、Cortex-A5处理器。

“​

ARM Cortex系列处理器——Cortex-M

Cortex-M处理器家族更多的集中在低性能端,但是这些处理器相比于许多微控制器使用的传统处理器性能仍然很强大。例如,Cortex-M4和Cortex-M7处理器应用在许多高性能的微控制器产品中,最大的时钟频率可以达到400Mhz。

当然,性能不是选择处理器的唯一指标。在许多应用中,低功耗和成本是关键的选择指标。因此,Cortex-M处理器家族包含各种产品来满足不同的需求:

“​

不同于老的经典ARM处理器(例如,ARM7TDMI, ARM9), Cortex-M处理器有一个非常不同的架构。例如:

—仅支持ARM Thumb指令,已扩展到同时支持16位和32位指令Thumb-2版本

—内置的嵌套向量中断控制负责中断处理,自动处理中断优先级,中断屏蔽,中断嵌套和系统异常处理。

—中断处理函数可以使用标准的C语言编程,嵌套中断处理机制避免了使用软件判断哪一个中断需要响应处理。同时,中断响应速度是确定性的,低延迟的。

—向量表从跳转指令变为中断和系统异常处理函数的起始地址。

—寄存器组和某些编程模式也做了改变。

这些变化意味着许多为经典ARM处理器编写的汇编代码需要修改,老的项目需要修改和重新编译才能迁移到Cortex-M的产品上。

“​

ARM Cortex系列处理器——Cortex-R

R4:第一个基于ARMv7-R体系的嵌入式实时处理器。专用于大容量深层嵌入式片上系统应用,如硬盘驱动控制器、无限基带处理器、消费产品手机MTK平台和汽车系统的电子控制单元。

R5:2010年推出,基于ARMv7-R体系,扩展了 Cortex-R4 处理器的功能集,支持在可靠的实时系统中获得更高级别的系统性能、提高效率和可靠性并加强错误管理。这些系统级功能包括高优先级的低延迟外设端口 (LLPP) 和加速器一致性端口 (ACP),前者用于快速外设读写,后来用于提高效率并与外部数据源达成更可靠的高速缓存一致性。

基于 40 nm G 工艺,Cortex-R5 处理器可以实现以将近 1 GHz 的频率运行,此时它可提供 1,500 Dhrystone MIPS 的性能。该处理器提供高度灵活且有效的双周期本地内存接口,使 SoC 设计者可以最大限度地降低系统成本和功耗。

R7:Cortex-R7 处理器是性能最高的 Cortex-R 系列处理器。它是高性能实时 SoC 的标准。Cortex-R7 处理器是为基于 65 nm 至 28 nm 的高级芯片工艺的实现而设计的,此外其设计重点在于提升能效、实时响应性、高级功能和简化系统设计。基于 40 nm G 工艺,Cortex-R7 处理器可以实现以超过 1 GHz 的频率运行,此时它可提供 2700 Dhrystone MIPS 的性能。该处理器提供支持紧密耦合内存 (TCM) 本地共享内存和外设端口的灵活的本地内存系统,使 SoC 设计人员可在受限制的芯片资源内达到高标准的硬实时要求。

“​

“​

“​

来源:嵌入式资讯精选
直接转载来源:
大鱼机器人
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 449

如今电池供电的产品很多,电池供电通常设计到一个问题,那就是低功耗。本文为大家讲讲基于STM32、FreeRTOS实现低功耗思想和原理。

1、低功耗设计常规思路

应用中使用的 RTOS 一般采用基于时间片轮转的抢占式任务调度机制,一般的低功耗设计思路如下:

1)当 Idle 任务运行时,进入低功耗模式;
2)在适当的条件下,通过中断或者外部事件唤醒 MCU。

但是, 从第二点可以看出,每次当 OS 系统定时器产生中断时,也会将 MCU 从低功耗模式中唤醒,而频繁的进入低功耗模式/从低功耗模式中唤醒会使得 MCU 无法进入深度睡眠,对低功耗设计而言也是不合理的。

在 FreeRTOS 中给出了一种低功耗设计模式 ——Tickless Idle Mode, 这个方法可以让 MCU 更长时间的处于低功耗模式。

2、Tickless Idle Mode原理及实现

1)情景分析

FreeRTOS各任务情况:

“基于STM32、FreeRTOS低功耗设计思路和原理"

上图是任务调度示意图,横轴是时间轴, T1, T2, T3, T4 是 RTOS 的时间片基准,有四个任务分别是 TaskA,B,C,D。

Task A:周期性任务
Task B:周期性任务
Task C:突发性任务
Task D:周期性任务

从图中可以看出在四个任务进行调度之间,会有四次空闲期间(此时 RTOS 会调度 Idle 任务运行, 软件设计的目标应该是尽可能使 MCU 在 Idle 任务运行时处于低功耗模式) 。

Idle1: Idle 任务运行期间,会产生一次系统时钟滴答,此时会唤醒 MCU,唤醒后 MCU 又会进入低功耗模式, 这次唤醒是无意义的。期望使 MCU 在 Idle1 期间一直处于低功耗模式, 因此适当调整系统定时器中断使得 T1 时不触发系统时钟中断, 中断触发点设置为 Task B 到来时;

Idle2:Task C 在系统滴答到达前唤醒 MCU(外部事件) , MCU 可以在 Idle2 中可以一直处于低功耗模式;

Idle3: 与 Idle2 情况相同,但 Idle3 时间很短,如果这个时间很短,那么进入低功耗模式的意义并不大,因此在进入低功耗模式时软件应该添加策略;

Idle4: 与 Idle1 情况相同。

2)Tickless Idle Mode 的软件设计原理

Tickless Idle Mode 的设计思想在于尽可能得在 MCU 空闲时使其进入低功耗模式。从上述情景中可以看出软件设计需要解决的问题有:

a、合理的进入低功耗模式(避免频繁使 MCU 在低功耗模式和运行模式下进行不必要的切换) ;

RTOS 的系统时钟源于硬件的某个周期性定时器(Cortex-M 系列内核多数采用 SysTick) ,RTOS 的任务调度器可以预期到下一个周期性任务(或者定时器任务) 的触发时间,如上文所述,调整系统时钟定时器中断触发时间,可以避免 RTOS 进入不必要的时间中断,从而更长的时间停留在低功耗模式中,此时 RTOS 的时钟不再是周期的而是动态的(在原有的时钟基准时将不再产生中断,即 Tickless) ;

b、当 MCU 被唤醒时,通过某种方式提供为系统时钟提供补偿。

MCU 可能被两种情况所唤醒, 动态调整过的系统时钟中断或者突发性的外部事件,无论是哪一种情况,都可以通过运行在低功耗模式下的某种定时器来计算出 MCU 处于低功耗模式下的时间,在 MCU 唤醒后对系统时间进行软件补偿;

c、软件实现时,要根据具体的应用情景和 MCU 低功耗特性来处理问题。

尤其是 MCU 的低功耗特性, 不同 MCU 处于不同的低功耗模式下所能使用的外设(主要是定时器) 是不同的, RTOS 的系统时钟可以进行适当的调整。

3)Tickless Idle Mode 的实现

这里以 STM32F407 系列的 MCU 为例, 首先需要明确的是 MCU 的低功耗模式, F407 有 3 种低功耗模式:Sleep、Stop、 Standby。

“基于STM32、FreeRTOS低功耗设计思路和原理"

在 RTOS 平台时, SRAM 和寄存器的数据不应丢失, 此外需要一个定时器为 RTOS 提供系统时钟, 这里选择 Sleep 模式下进行实现。

使能Tickless Idle:

#define configUSE_TICKLESS_IDLE 1

RTOS空闲任务(空闲时自动调用)实现:

/* Idle 任务 */
void prvIdleTask( void *pvParameters )
{
  for( ; ; )
  {
    //...
#if(configUSE_TICKLESS_IDLE != 0)
    {
      TickType_t xExpectedIdleTime;
      /* 用户策略以决定是否需要进入 Tickless Mode */
      xExpectedIdleTime = prvGetExpectedIdleTime();
      if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP )
      {
        vTaskSuspendAll(); // 挂起调度器
        {
          configASSERT( xNextTaskUnblockTime >= xTickCount );
          xExpectedIdleTime = prvGetExpectedIdleTime();
          if( xExpectedIdleTime >=
          configEXPECTED_IDLE_TIME_BEFORE_SLEEP )
          {
            /* 用户函数接口 */
            /* 1. 进入低功耗模式和如何退出低功耗模式 */
            /* 2. 系统时间补偿 */
            portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime );
          }
        }
        (void) xTaskResumeAll(); // 恢复调度器
      }
    }
#endif /* configUSE_TICKLESS_IDLE */
    //...
  }
}

然后,低功耗模式处理(根据 MCU 的低功耗模式编写代码, 代码有点长……)

void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime )
{
  unsigned long ulReloadValue, ulCompleteTickPeriods,
  ulCompletedSysTickDecrements;
  portTickType xModifiableIdleTime;
  /* 最长睡眠时间不可以超过定时器的最大定时值 */
  /* 通过调整定时器的时间基准可以获得更理想的最大定时值 */
  if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )
  {
    xExpectedIdleTime = xMaximumPossibleSuppressedTicks;
  }
  /* 停止 SysTick */
  portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT;
  
  /* 计算唤醒时的系统时间,用于唤醒后的系统时间补偿 */
  ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );
  
  if( ulReloadValue > ulStoppedTimerCompensation )
  {
    ulReloadValue -= ulStoppedTimerCompensation;
  }
  __disable_interrupt();
  /* 确认下是否可以进入低功耗模式 */
  if( eTaskConfirmSleepModeStatus() == eAbortSleep )
  {
    /* 不可以,重新启动系统定时器 */
    portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG;
    portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT |
    portNVIC_SYSTICK_INT_BIT |
    portNVIC_SYSTICK_ENABLE_BIT;
    portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
    __enable_interrupt();
  }
  else
  {
    /* 可以进入低功耗模式 */
    /* 保存时间补偿,重启系统定时器 */
    portNVIC_SYSTICK_LOAD_REG = ulReloadValue;
    portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT |
    portNVIC_SYSTICK_INT_BIT |
    portNVIC_SYSTICK_ENABLE_BIT;
    /* 进入低功耗模式,可以通过 configPRE_SLEEP_PROCESSING 函数进行低功耗模式下
    时钟及外设的配置*/
    xModifiableIdleTime = xExpectedIdleTime;
    configPRE_SLEEP_PROCESSING( xModifiableIdleTime );
    if( xModifiableIdleTime > 0 )
    {
      __DSB();
      __WFI();
      __ISB();
    }
    /* 退出低功耗模式 */
    configPOST_SLEEP_PROCESSING( xExpectedIdleTime );
    portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT |
    portNVIC_SYSTICK_INT_BIT;
    __disable_interrupt()
    __enable_interrupt();
    /*唤醒有两种情况:系统定时器或者外部事件(中断) */
    if((portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT) != 0)
    {
      /* 系统定时器唤醒,时间补偿 */
      unsigned long ulCalculatedLoadValue;
      ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) –
      ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG );
      if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) ||
      ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) )
      {
      ulCalculatedLoadValue = (ulTimerCountsForOneTick - 1UL);
      }
      portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue;
      ulCompleteTickPeriods = xExpectedIdleTime - 1UL;
    }
    else
    {
      /* 外部事件(中断)唤醒 */
      ulCompletedSysTickDecrements = ( xExpectedIdleTime *
      ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG;
      ulCompleteTickPeriods = ulCompletedSysTickDecrements /
      ulTimerCountsForOneTick;portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1 ) *
      ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements;
    }

    /* 重启 Systick,调整系统定时器中断为正常值 */
    portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;
    portENTER_CRITICAL();
    {
      portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT |
                                  portNVIC_SYSTICK_INT_BIT |
                                  portNVIC_SYSTICK_ENABLE_BIT;
      vTaskStepTick( ulCompleteTickPeriods );
      portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;
    }
    portEXIT_CRITICAL();
  }
}

3、最后

低功耗的设计存在很多影响功耗的因素,比如电路设计、IO引脚配置等。

MCU实现低功耗的方法和种类有很多,设计时需要注意一些低功耗细节问题。

最后,以上方法仅供学习参考,具体请按照实际项目选择合理的低功耗设计方案。

来源:strongerHuang
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 427

意法半导体发布了最新版的STM32* 微控制器 (MCU)图形界面开发软件TouchGFX Version 4.18 ,新增了视频播放功能,改进了多名开发者协同开发工具,支持新的 X-NUCLEO 显示板。

“意法半导体更新TouchGFX软件,增加视频功能,丰富STM32用户体验"

通过可以播放 Motion-JPEG (MJPEG) 视频文件,TouchGFX 为家庭自动化产品、穿戴设备、医疗设备和工业传感器等小型设备带来了更多产品力,实现丰富的功能,例如,用户操作指南或有趣的启动和暂停屏幕,提升图形用户界面的视觉效果。开发人员可以使用自己的 MJPEG 文件或从软件提供的电影示例中选择。TouchGFX Designer中的新视频小程序有开始、停止、重复和转到帧等属性,可以简化原型设计,并可以拖放到应用程序中。

TouchGFX 4.18可以用软件或硬件进行视频解码。硬件解码可以用带有适合的解码外设的 STM32 MCU,例如,STM32F769 和 STM32H7B3。除STM32G0外,全系都有软件解码功能。视频缓冲采用不同的策略方法,包括直接渲染到帧缓冲区和双缓冲区技术,有助于优化内存要求和性能。

TouchGFX 4.18的其他新功能包括加强对协作开发的支持,使用 XML 存储文本数据和翻译。当有多个团队成员参与项目开发时,XML可以简化团队共享和整合不同的项目模块。最新的TouchGFX保留了上一版本中的强大而便利的功能,包括用于小RAM的部分帧缓冲区、防止图像断裂的超高效渲染,以及对低成本非内存映射 SPI闪存的支持。

为了方便GUI 开发项目轻松启动,TouchGFX 4.18附带一些示例,演示如何在热门的 STM32 Discovery 开发板上使用新的视频功能和必要的 TouchGFX 开发板设置 (TBS)。

意法半导体还更新并增加了显示板的种类,帮助开发人员加快用户界面项目开发。更新后的Nucleo 64开发板的显示板X-NUCLEO-GFX01M2 有 2.2 英寸 QVGA 串口显示器,现在支持NUCLEO-WB55RG开发板,方便在Bluetooth®蓝牙应用设备中加装显示器。新的与Nucleo 144开发板配套的 X-NUCLEO-GFX02Z1 显示板配备高速并行接口和QSPI 闪存,支持 NUCLEO-U575ZI-Q等开发板。两款显示板都在 TouchGFX 4.18的支持设备列表内。

TouchGFX 4.18现在可以从 st.com 免费下载使用。新的 X-NUCLEO-GFX02Z1 Nucleo 144 Display Shield 显示板也已上市,X-NUCLEO-GFX01M2 将于 12 月上市。

来源:意法半导体
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 37

页面

订阅 RSS - STM32