赞
踩
手上有块STM32L4的板子,想要在上面把FreeRTOS给用起来,顺便把这个板子也用起来。
自己在网上找了下Free RTOS的源码,下载下来后发现移植目录下有Core-M4的移植版本。
本想着拿来直接用,但是发现又缺少了STM32L4的驱动,然后通过一些其它渠道了解到,现在STM芯片开发方式大都是通过ST公司提供的STM32 CubeMX来生成驱动和Free RTOS。这里记录下学习使用STM32 CubeMX生成含FreeRTOS 操作系统和驱动工程的过程。
STMCube 源自意法半导体,旨在通过减少开发工作量、时间和成本,让开发人员的开发时更轻松。 STM32Cube 基于 Arm®(a) Cortex® 内核,涵盖 STM32 微控制器整个产品系列。
STM32Cube 包括:
这个工具实际上和之前用MG21开发zigbee设备时,用的Silicon labs的 SSV5/ SSV4 IDE很像,就是可以通过选择具体的芯片型号,然后通过图形化的界面配置设备类型(协调器、路由器、终端设备)、endpoint的数量、支持的class和attribute,以及配置各个引脚的功能、是否低功耗和时钟频率包括产生各种事件等。
其实最主要的目的就是简化使用STM32开发的流程,使用户能够以更简单、更快速且稳定的方式去完成基于STM32的应用开发。
我之前体会过类似的工具,如上述所说的Siliconlabs的ssv5,我最直观的感受是用习惯后,真的很好用。
当时刚接触这款芯片,什么都不清楚,然后就按照视频指导,在IDE上点一点就很快生成了自己想要的demo原型。
特别是通过IDE借助图形化的操作方式,去操作底层GPIO和时钟等芯片基本配置时,可以很直观的看到当前所有GPIO处于什么工作模式,同时不需要去阅读底层源码就能实现对GPIO输入输出模式、默认电平等的控制,特别是对I2C和SPI以及ADC进行IO配置时,特别方便,只需要选中要用的I2C或者ADC自动就会把对应引脚给配好,同时还能根据自己的需要去切换为可以配置为I2C或者ADC的其它引脚。
而在之前我们操作GPIO和SPI以及ADC时首先要去熟悉芯片手册,知道哪些IO口可以当作输入输出IO、ADC、SPI使用,然后再查看怎么去进行配置。
另外通过图形化界面去配置设备的类型、支持的endpoint数量、产生事件、以及动态加载各种组件时,都只需要在IDE上点击选中后,直接生成新的代码即可。
过去想要在原有的基础上增加一个enpoint(其下会有一些新的class和attibute)或者组件时,要先熟悉代码框架,然后再一点点的细心调整,耗时且容易出错。从而让开发者不能聚焦在自己所关注的业务上,进而降低产品竞争力。
引脚配置:可以通过图形界面轻松配置微控制器的引脚功能,包括GPIO、串口、定时器等。
时钟配置:可配置系统时钟源、频率、分频器等参数,帮助用户优化系统时钟设计。
中断配置:可以设置各个外设的中断优先级和使能状态,方便中断管理。
外设配置:支持配置各种外设,如UART、SPI、I2C、定时器等,包括模式选择、时钟频率等。
电源管理:可配置电源管理模式,包括低功耗模式、唤醒源等,帮助优化功耗。
RTOS配置:支持FreeRTOS等实时操作系统的集成,可以方便地配置RTOS相关参数。
代码生成:可以自动生成基本的启动代码和初始化代码,加快项目开发速度。
外设库集成:可选择集成HAL库或LL库,方便使用ST提供的外设驱动库。
时序图配置:支持配置时序图,帮助用户调试和验证时序要求。
本次我们主要关注标黑的部分。
下载地址
在学习使用一款IDE工具时,最全的手册一般就是官方提供的用户手册,这里我们也主要是参考这些手册来进行学习。
如果后续有一些特殊的需求,也建议先去官网的文档中找找看,是否有可以满足自己需求的文档。
可以通过在官网中直接搜索"STM32CubeMx"进行跳转找到下载界面,也可以在如下地址直接跳转
下载完成后,双击进行安装
安装完成后,会生成一个如下所示的图标,点击该图标运行
安装完成并运行成功后,会有一个如上所示的界面被打开。
按照官方提供的信息,生成代码主要分为以下几步:
快捷按键
如上图所示,该IDE主要提供了四种选择器。
MCU Selector
就是可以通过各种你设置的条件,例如Core的类型、flash大小、RAM大小等等然后生成一系列满足该条件的芯片型号。
除了用于根据自己的需求去寻找合适的芯片外,也是后续生代码时必不可少的一部分。
Boader Selector
根据条件筛选开发板
Cross Selector
交叉选择器使用户可以找到STM32产品组合中可以替代当前使用的MCU或MPU(来自意法半
导体或其他芯片供应商)的最佳产品
Example Selector
生成各种代码范例
使用MCU Selector 选中所需要的单片机型号
输入自己单片机的型号,然后双击选中后会跳转到如上图所示的配置界面。
引脚配置的方式主要有两种,分别是直接单机引脚进行配置,另外一种则是通过配置I2C和SPI等外设进行间隔配置。
直接点击引脚进行配置
点击要配置的引脚,然后会出现当前引脚可以配置的状态。这种主要适合配置IO口的输入输出模式。
这里我们选中一个PA13作为LED的控制引脚,设置为上拉模式
通过外设进行简介配置
可以选择要开启的功能,然后会自动反应到引脚图上。
例如这里我们选中的是ADC1, 然后IN1 差分输入,那么PC0和PC1就分别被自动配置为了ADC1_IN1和ADC1_IN2。
其余的还有SPI和I2C、UART配置等
还是在Pinou下我们切换到System view视图可以看到,Middleware是空的。这里按照实际想法应该是要放置我们的FreeRTOS的
注意该视角下的配置状态说明
选中Free RTOS
在Free RTOS的配置栏里,我们可以配置rtos的互斥锁、事件、堆的大小、task和队列、以及信号和定时器等等
创建个FreeRTOS 下的task任务
在FreeRTOS中创建一个任务,然后在生成的代码中,实现一个定时控制LED的函数即可。
1.选中MDK-ARM生成Keil5下的工程文件
2. 选中makefile生成该项目对应的make文件
HSE(高速外部时钟)
产生源:
● HSE外部晶体/陶瓷谐振器
● HSE用户外部时钟
HSI时钟(高速内部时钟:)
HSI时钟信号由内部8MHz的RC振荡器产生,可直接作为系统时钟或在2分频后作为PLL输入。
HSI RC振荡器能够在不需要任何外部器件的条件下提供系统时钟。它的启动时间比HSE晶体振荡器短。然而,即使在校准之后它的时钟频率精度仍较差。
PLL(锁相环)
在STM32微控制器中,PLL(Phase-Locked Loop,锁相环)时钟是通过对外部晶体振荡器提供的低频时钟信号进行倍频操作,从而产生高频时钟信号的一种技术。PLL的作用是通过调节其反馈路径中的除数和乘法器来生成稳定的高频时钟信号。
上述三种时钟可被用来驱动系统时钟(SYSCLK)
LSE时钟
LSE晶体是一个32.768kHz的低速外部晶体或陶瓷谐振器。它为实时时钟或者其他定时功能提供
一个低功耗且精确的时钟源。(注意这里的32768Khz是很有讲究的,对RTC的时钟准确运行起到很重要的作用)
系统时钟(SYSCLK)选择
系统复位后,HSI振荡器被选为系统时钟。当时钟源被直接或通过PLL间接作为系统时钟时,它
不能被停止。
只有当目标时钟源准备就绪了(经过启动稳定阶段的延迟或PLL稳定),从一个时钟源到另一个时
钟源的切换才会发生。在被选择时钟源没有就绪时,系统时钟的切换不会发生。直至目标时钟
源就绪,才发生切换。
在时钟控制寄存器(RCC_CR)里的状态位指示哪个时钟已经准备好了,哪个时钟目前被用作系统
时钟。
RTC时钟
如果LSE被选为RTC时钟:
如果LSI被选为自动唤醒单元(AWU)时钟:
看门狗时钟
如果独立看门狗已经由硬件选项或软件启动,LSI振荡器将被强制在打开状态,并且不能被关
闭。在LSI振荡器稳定后,时钟供应给IWDG
时钟输出
微控制器允许输出时钟信号到外部MCO引脚。
相应的GPIO端口寄存器必须被配置为相应功能。以下8个时钟信号可被选作MCO时钟:
● SYSCLK
● HSI
● HSE
● 除2的PLL时钟
● PLL2时钟
● PLL3时钟除以2
● XT1外部3~25MHz振荡器(用于以太网)
● PLL3时钟(用于以太网)
在MCO上输出的时钟必须小于50MHz(这是I/O端口的最大速度)。
我目前也只是初步了解了下STM32 CubeMX的使用方式,所知还尚浅特别是上述我的疑问中还有很多都没弄清楚,这里我会边学边记录,有了新的收获和成果后也会在该文档中同步给大家。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。