0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32L051上使用RT-Th (二、CubeMX配置)

矜辰所致 ? 来源:矜辰所致 ? 作者:矜辰所致 ? 2022-06-26 14:02 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

得吐槽一下这个标题字数,我都写不全了
应用篇-在STM32L051上使用RT-Thread 第二篇,使用STM32CubeMX 进行对应外设配置,同时做一些简单测试。

目录

  • 前言
  • 一、使用 STM32CubeMX 配置
  • 1.1 基础步骤
  • 1.2 修改配置
  • 1.3 踩坑记录
  • 二、初始简单测试
  • 2.1 基本设计思路
  • 2.2 外设简单测试
  • 三、时刻关注占RAM大小
  • 结语

前言

上篇文章我们仅仅是开了个头,使用 RT-Thread Studio 新建了一个基于 STM32L051 的 RT-Thread Nano 工程,本文我们就在在这个工程的基础上使用 STM32CubeMX 做STM32的基本配置。

??
本 RT-Thread 专栏记录的开发环境:
RT-Thread记录(一、RT-Thread 版本、RT-Thread Studio开发环境 及 配合CubeMX开发快速上手)
RT-Thread记录(二、RT-Thread内核启动流程 — 启动文件和源码分析)
??
RT-Thread 内核篇系列博文链接:
RT-Thread记录(三、RT-Thread 线程操作函数及线程管理与FreeRTOS的比较)
RT-Thread记录(四、RT-Thread 时钟节拍和软件定时器
RT-Thread记录(五、RT-Thread 临界区保护)
RT-Thread记录(六、IPC机制之信号量、互斥量和事件集)
RT-Thread记录(七、IPC机制之邮箱、消息队列)
RT-Thread记录(八、理解 RT-Thread 内存管理)
RT-Thread记录(九、RT-Thread 中断处理与阶段小结)
??
在STM32L051C8 上使用 RT-Thread 应用篇系列博文连接:
RT-Thread 应用篇 — 在STM32L051上使用 RT-Thread (一、无线温湿度传感器 之 新建项目)

一、使用 STM32CubeMX 配置

STM32CubeMX 配合 RT-Thread Studio 使用的方法在我的博文:《RT-Thread记录(一、RT-Thread 版本、RT-Thread Studio开发环境 及 配合CubeMX开发快速上手)》

的第三小节有说明:

pYYBAGK39meANS85AAAt6SiABAg236.png

配置我们需要根据原理图进行,本应用所用到的外设原理图如下(无线通讯模块没有放进来,使用的是串口TXD3和RXD3,另外使用的外部8Mhz):

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

1.1 基础步骤

点击 CubeMX Setting,然后选择芯片类型,点击OK即可打开STM32CubeMX,如下图:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

进入CubeMX 后设置步骤就很基础了。

我们按照 时钟,调试接口,串口,GPIO,定时器,工程选项 依次配置,下面就简单列一下步骤:

时钟:

RCC选项,外部高速时钟 选择使用外部晶振:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

选择完时钟就可以在 Clock Configuration 中配置系统时钟,直接把系统时钟改成最大的 32Mhz,点击确定,系统会自动修改好时钟树:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

调试接口:

SYS选项,在 Debug Serial Wire 前打勾,表示使用SWD接口:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_19,color_FFFFFF,t_70,g_se,x_16

串口:

串口一已经用作了打印串口,在工程 drivers 文件夹里的drv_usart.c 文件中已经使用INIT_BOARD_EXPORT(rt_hw_usart_init); 初始化了,所以我们这里不需要使能。

我们直接设置一下我们需要和无线通讯模块 通信的 串口,原理图上是串口3,在L051上是LPUART1(STM32F103C8 和 STM32L051C8是 pin to pin 的):

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

GPIO:

普通GPIO设置,2个按键输入,一个LED输出,2个IO口做软件I2C

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_19,color_FFFFFF,t_70,g_se,x_16

定时器:

我们设置两个硬件定时器,一个1S,一个1ms,我们可以根据自己使用不使用选择初始化。

设置为1S的定时器 TIM2:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

设置为1ms的定时器 TIM21:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

工程选项:

最后在 Project Manager 中做最后的配置,生成工程:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

完成上述步骤,点击CubeMX右上角 GENERATE CODE 生成工程。
根据我以前的博文说明,生成好了以后,不要打开,直接关闭CubeMX即可,然后回到 RT-Thread Studio,出现下面的弹框点击确定即可。

pYYBAGK39myAdbFcAAAql5lL6pE638.png

完成以后多了cubemx 文件夹,然后编译一下,正常结果如下(其实我自己走流程的时候,出过一次问题,后面小节会说明):

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

1.2 修改配置

还是根据《RT-Thread记录(一、RT-Thread 版本、RT-Thread Studio开发环境 及 配合CubeMX开发快速上手)》中的记录,修改一下SConscript文件,使得包含我们 CubeMX 生成的 GPIO 、串口和定时器设置:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

修改完成以后不要忘了同步 scons 配置!!再重新构建!

这里要特别说明一下stm32f1xx_it.c 这个文件:

在《RT-Thread记录(一、RT-Thread 版本、RT-Thread Studio开发环境 及 配合CubeMX开发快速上手)》中我建议不需要添加,因为里面有些中断响应函数, RT-Thread 内核有自己的实现方式。但是这里我还是添加了, 但是要把stm32f1xx_it.c 文件中 一些中断响应函数的给注销了,因为在RT-Thread 内核有其他地方有实现!

我的做法是,除了下图自己后面程序设计需要使用到的,其他的都给删除了,注意这里方便说明用的是函数声明部分,需要在stm32f1xx_it.c 文件中函数实现部分删除:

poYBAGK39m2AV0a5AABWVCerPdU062.png

配置完成以后再次进行编译,结果如下:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

完成上面配置后我们就可以开始设计我们的程序了。

1.3 踩坑记录

按照上面 1.1 小节的基础步骤设置 ,完成以后,在CubeMX最后一步生成工程的时候居然卡死了,我只能强制退出CubeMX任务,重新点击CubMX Settings 打开CubeMX进行配置。

完成以后发现左边CubeMX里面的文件列表不是和当时我文章记录的一样:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

居然没有SConscript,编译报错了,即便我重新复制进去,也没有用……

一般来说,如果编译除了问题,我们应该从编译结果去查找问题,然后分析解决,但是对于这种软件联动的自动化配置,我还是建议重新操作尝试解决。所以我把工程全部删除,然后重新来一遍看看。

因为考虑到CubeMX卡死过一次,项目出问题了,两个软件没有成功的关联,所以我是重新操作了一次正常了。

而且有一个系列操作,在我们点击 RT-Thread Studio 打开CubeMX以后,最好是等待 RT-Thread Studio 的一个弹框消失以后再进行操作:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

二、初始简单测试

完成上面的配置,我们的基本框架就已经搭建好了,剩下的就是实现应用程序了,那么在实际的操作之前,我们先简单验证一下整体的框架没有问题,简单测试下LED和按键,串口的话要单独一篇文章分析。

2.1 基本设计思路

首先我们得在 main.c 文件中包含必备头文件,和在main线程中做基本的初始化:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

其实这个步骤就和裸机一样,我们完全可以把 main 当成裸机中的main函数,所有的程序在main中实现,也是可以。 这种方式就类似于 ESP32-C3 使用ESP-IDF 开发环境中,大部分操作都在 app_main 任务中实现, app_main 也不过是 FreeRTOS 启动时候创建的一个任务。


记得在上一篇博文中我们提到过 一个main 线程就占用了 2K,这个2K不能浪费,要么我们在main里面多做一些工作,要么就是到时候把main线程的大小改小。

我们一个单品温湿度传感器,有几个主要的工作:

  1. I2C 数据采集,这个部分需要移植一下代码,然后采集实现部分需要用一个线程来实现,计划是定时器到了一定的计数之后,发送一个信号量使得线程唤醒采集一次;
  2. 无线模块串口通讯,这个部分是和上一步联动的,定时器到了定时时间,通知传感器采集数据,然后把数据放置无线通讯协议中发送出出去,这个部分还得用一个线程实现,串口的通讯;
  3. LED灯,其实可有可无,但是作为我们第一个基础应用,还是加上也没关系,LED的切换,到时候可以随意加在哪里,比如采集到了数据成功发送以后,LED灯闪烁一次;
  4. 按键,按键其实也可有可无,但是还是因为我们的第一个基础应用,我想把我常用的按键驱动移植过来试一试,根据以往经验,按键驱动也需要一个线程,而且这个线程至少需要512字节的空间;
  5. 定时器,根据产品所需要的的定时时间释放信号量,使得数据采集线程开始工作,定时器是硬件定时器,使用中断实现不用额外线程;

这里思路暂时先这样,后期如果使用过程中有新的改动,再来更新。

2.2 外设简单测试

然后我们把一些外设需要的宏定义设置一下:

pYYBAGK39m-AGBVfAABIJXmHwKA241.png

LED:

然后在主函数中写一个LED灯切换的逻辑(此部分太简单了,所以截个图看看就行了):

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_13,color_FFFFFF,t_70,g_se,x_16

按键:

然后新建一个线程,给到时候按键驱动移植使用,这里就用简单的按键处理方式,大小设定为512字节。

值得注意的是,我们新建任务只能用静态初始化的方式,因为我们没有定义使用heap,新建的线程大小直接影响RAM空间大小。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_17,color_FFFFFF,t_70,g_se,x_16

定时器:

我们有一个1S的定时,我们也来简单测试一下,具体的测试方式和我们在记录九中的一致:
《RT-Thread记录(九、RT-Thread 中断处理与阶段小结)》

但是这次我们加了stm32f1xx_it.c 文件,所以我们这次直接在stm32f1xx_it.c 文件中修改(再次说明,实际使用中中断响应函数中不要添加打印操作,这里只是测试测试!!!):

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_17,color_FFFFFF,t_70,g_se,x_16

所有改完以后编译一下:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

OK!编译没问题,下载查看测试结果:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_18,color_FFFFFF,t_70,g_se,x_16

三、时刻关注占RAM大小

在小内存芯片上使用操作系统,程序运行占用的RAM大小我们不容忽略,我们在应用中务必学会观察内存占用情况:

完成CubeMX基础步骤以后,默认只添加了两个.c文件,与初始工程的比较:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_1,color_FFFFFF,t_70,g_se,x_16

修改完配置,表示着我们的基础框架基本搭建好了,我们多添加了GPIO、串口,和定时器的驱动程序:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_1,color_FFFFFF,t_70,g_se,x_16

说明!上面几张图因为刚开始,所以贴了和初始工程的比较,往后的比较我不可能从初始工程开始贴图,只能与上一次工程完善的结果做比较:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

本文的简单测试,程序运行时候需要占用 RAM的大小: 1536+5184= 6720 字节,我们的芯片 RAM:8192字节。

结语

本文依然还处于工程配置阶段,再次手把手做了次教学,如何使用 STM32CubeMX 配合 RT-Thread Studio开发。

我们详细的说明了配置步骤,同时在初始测试小节写好了本应用的的设计思路。做了基本框架设计 和 初步的测试说明。

现在看来,这系列应用篇还真算得上保姆级的教程了 = =!我自己现在都觉得真的细……

下一篇的内容应该是把 I2C 读写的程序移植过来,到时候看看篇幅,如果又有很多细节那就这一个内容,如果内容篇幅简单到时候看情况添加。

好了,本文就到这,谢谢大家!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2298

    文章

    11040

    浏览量

    366901
  • Studio
    +关注

    关注

    2

    文章

    212

    浏览量

    29992
  • RT-Thread
    +关注

    关注

    32

    文章

    1444

    浏览量

    42371
  • CubeMx
    +关注

    关注

    0

    文章

    31

    浏览量

    1713
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    对于在STM32CubeMx使用FMC中的NAND FLASH里面配置这些时间有什么说明吗?

    对于在STM32CubeMx使用FMC中的NAND FLASH里面配置这些时间有什么说明吗?
    发表于 07-21 07:07

    让开发板畅游网络:RT-Thread CherryUSB 驱动 RNDIS 模块详解 | 技术集结

    通过4G模块上网的功能,以STM32F429为例。目录新建工程配置cubemx配置cherryusbmain.c添加代码完成1新建工程2配置
    的头像 发表于 07-02 17:04 ?2041次阅读
    让开发板畅游网络:<b class='flag-5'>RT</b>-Thread CherryUSB 驱动 RNDIS 模块详解 | 技术集结

    使用CubeMX配置STM32H7R7L8的时候出现无配置问题,怎么解决?

    使用CubeMX配置STM32H7R7L8的时候出现无配置问题,但是根据正点原子提供的例程中的.ioc文件中又是可以正常配置的。
    发表于 06-23 07:40

    STM32CubeMX配置STM32G070RBT6TR时为什么无法使能PVD中断?

    STM32CubeMX 配置STM32G070RBT6TR时无法使能PVD中断
    发表于 06-18 07:59

    STM32CubeMX配置STM32G070RBT6TR时无法使能PVD中断怎么办?

    STM32CubeMX 配置STM32G070RBT6TR时无法使能PVD中断
    发表于 06-16 06:32

    使用STM32CubeMX进行配置USB的时候,有哪些小的需要注意的细节?

    在使用STM32CubeMX进行配置USB的时候,是参照例程进行的配置,自己配置的就是没有成功,例程就灭有问题,总感觉哪里没有打开?有人遇到过需要注意的小细节吗?
    发表于 04-23 06:54

    STM32开发入门进阶必备!《STM32嵌入式系统开发—基于STM32CubeMX和HAL库》新书发布!

    近日,由华清远见教育科技集团精心编撰的教育部高等学校电子信息类专业教学指导委员会规划教材、普通高等教育电子信息类专业系列教材——《STM32嵌入式系统开发—基于STM32CubeMX和HAL库》重磅
    的头像 发表于 04-03 14:54 ?935次阅读
    <b class='flag-5'>STM32</b>开发入门进阶必备!《<b class='flag-5'>STM32</b>嵌入式系统开发—基于<b class='flag-5'>STM32CubeMX</b>和HAL库》新书发布!

    使用Cubemx配置STM32H750VBT6的freertos连最基本的keil编译都过不了,为什么?

    我使用Cubemx配置STM32H750VBT6的freertos连最基本的keil编译都过不了,请问这是为什么啊?cubemx是最新版,keil使用v5v6编译器都不行,显示floa
    发表于 03-10 07:25

    STM32CubeMX用于STM32配置和初始化C代码生成

    电子发烧友网站提供《STM32CubeMX用于STM32配置和初始化C代码生成.pdf》资料免费下载
    发表于 02-26 17:32 ?677次下载

    工程师开发利器:STM32CubeMX 与 eDesignSuite 的协同开发

    的核心功能与优势STM32CubeMX 是 ST 官方推出的图形化配置工具,专为简化 STM32 微控制器开发流程而设计。以下是其核心功能和优势:硬件配置自动化支持 引脚分配与冲突检
    的头像 发表于 02-26 14:07 ?846次阅读
    工程师开发利器:<b class='flag-5'>STM32CubeMX</b> 与 eDesignSuite 的协同开发

    RT-Thread睿赛德出席中国工博会科技论坛,共话开源硬件与新工业革命

    行业领袖和技术专家,共同探讨开源硬件在推动新工业革命中的重要作用。RT-Thread睿赛德作为上海开源信息技术协会理事长单位出席本次论坛,并发表主题演讲。RT-Th
    的头像 发表于 01-22 18:53 ?655次阅读
    <b class='flag-5'>RT</b>-Thread睿赛德出席中国工博会科技论坛,共话开源硬件与新工业革命

    STM32CubeMX的菜单介绍

    相信初学者打开STM32CubeMX一定是一脸懵逼,里面都是全英文的,不知道从何入手。这里先给大家简单讲解一下。在新建工程这一栏里,我们最常用的是第一个,它会弹出一个芯片列表供你选择,然后就会创建一
    的头像 发表于 12-25 21:03 ?528次阅读
    <b class='flag-5'>STM32CubeMX</b>的菜单介绍

    STM32CubeMX为什么无法添加rt-thread-nano?

    STM32CubeMX 无法添加 rt-thread-nano
    发表于 09-27 06:17

    RT-Thread Nano 上线ST CubeMX

    感谢ST法国CubeMX团队的支持,RT-ThreadNano现已成功上线STCubeMX。本文将详细介绍如何快速上手RT-ThreadNano,并指导大家在STCubeMX上进行项目配置
    的头像 发表于 09-20 08:10 ?1378次阅读
    <b class='flag-5'>RT</b>-Thread Nano 上线ST <b class='flag-5'>CubeMX</b>

    TH反射内存交换机使用手册

    支持级联以组成更大的网络。还可通过串口或以太网端口进行状态监视、配置和控制。TH系列反射内存卡集线器特性lTH系列反射内存卡一同使用
    的头像 发表于 09-05 17:16 ?903次阅读
    <b class='flag-5'>TH</b>反射内存交换机使用手册