当前位置:   article > 正文

(STM32)从零开始的RT-Thread之旅--基础项目构建与时钟配置_rt-thread的系统时钟如何创建

rt-thread的系统时钟如何创建

硬件:WeAct-STM32H743VIT6

软件:RT-Thread Studio

           STM32CubeMX

1.新建项目

一上来的界面还是挺简洁明了的,就按照自己的硬件选择就可以了。

2.下载验证

直接编译,看了一下,默认就是用了68.9KB的flash,如果用Nano版的应该会小很多,不过因为H7资源并不紧张,所以就直接用了普通的。 

直接下载,可以看到串口直接有输出的。 

3.使用STM32CubeMX代码生成

上图创建工程的时候就已经在最下面提示了,默认使用的是内部时钟,请修改drv_clk.c,那为什么要修改这个文件呢,要解释这个问题,我们需要从源头看起。其实STM32系列很简单,因为无论哪个系列的芯片,都是从.s启动文件开始的,H7也不例外。

先看一下文件夹结构:

熟悉STM32的朋友应该知道,我们可以直接搜索startup开头的文件,这个算是ST固定的启动文件名:

根据文件夹结构可以很快找到:

打开启动文件,找到reset中断函数,入口函数一般都会在这里面跳转:

可以看到,和普通的启动文件差不多,都是data段数据的搬运以及bss段数据赋0,这个有没有使用RTOS都一样的,我们主要看结束后跳转到了哪里。(对.s文件感兴趣的可以去看我很早之前写的一篇:启动文件解析) 

这里可以看到是跳转到了entry,这个函数全局搜索后,可以看到位于:

这里到了RTT的源码中,也就是由操作系统接管了。后续的调用路径为:

所以调用路径为:

entry->rtthread_startup->rt_hw_board_init->hw_board_init->clk_init->system_clock_config

我们知道了在哪修改时钟,但是对于F1还好,像H7这种高性能MCU的时钟是比较复杂的,如何能快速设置时钟,我想大家都很清楚:使用STM32CubeMX,它可以根据你需要的频率自动帮你配置,最重要的是,它会提示你你的某些外设时钟是否设置的有冲突,这十分方便和重要。

双击文件列表中的CubeMX Setting:

如果你没有装CubeMX或者使用的非安装模式,它可能会找不到.exe文件,这时候需要你自己设置这个程序的可执行文件路径,设置好后会自动打开CubeMX。打开后,剩下的就是对CubeMX的使用,本文不是CubeMX教程,所以不再赘述。我这里只是简单开启了我自己板子上的一些外设,没有具体研究设置,大概开启了

SPI1/SPI4/USBD/TIME1-PWM/DMA/I2C/QSPI/DMA2D/DCMI/JPEG/DBUG等,一般刚上手开启RCC和DEBUG就可以了。

我基本设置好之后只选择了生成makefile,其他都没有改动,而是直接生成的。

生成后你会发现左侧文件列表多出来一个cubemx的文件夹,这个文件夹顶层有一个名叫SConscript的编译脚本,类似CMake一样,是一个自动化编译工具。注意,你如果生成很多文件,但是你发现有些文件没有在左侧显示出来,实际文件却是存在的,这是因为RTT Studio对文件管理的时候,会解析目录下的SConscript文件,如果这个文件存在的时候。所以只有添加进这个脚本里面的头文件路径,或者.c文件才会在左侧显示出来。

其次会提示你有一个HAL库的配置头文件被重命名了。这是因为CubeMX在生成代码的时候会根据你的配置生成一个HAL库的配置头文件,也就是只包含你启用的那些外设的HAL库头文件。这个文件本来就有,CubeMX生成一个新的后,原来的那个被RTT Studio重新命名为了stm32h7xx_hal_conf_bak.h,新的那个则在cubemx/Inc目录下叫做stm32h7xx_hal_conf.h。

我们怎么使用CubeMX生成的这些文件呢?

很简单,把你想用的文件添加到SConscript这个文件中就可以了。这里就拿我自己生成的cubemx这个文件夹来举例子,我本身配置的外设已经很多了,其中还有两个额外的库:USB和JPEG。以下是我生成的文件夹结构:

可以看到Drivers下面的文件是没啥用的,因为我们本身已经有了在libraries里面,其他文件都是我需要的,但是注意,有两个文件不需要加进去,一个是system_stm32h7xx.c,这个文件是时钟配置,而且是板子上电后最开始的时钟配置,即使你用的HSE,其实一上电也是先用的这个文件中对于时钟的配置,启动后再改成你自己想要用的时钟源。

所以这个文件是必须有的,而CubeMX又生成了一个,所以重复了。

还有就是stm32h7xx_it.c这个文件中有所有中断的回调函数,RTT中对于一些特殊中断都使用了自己的回调实现,所以也不必使用这个文件中的,否则OS就运行异常了,当然里面还有一些其他中断,比如我在CubeMX中开启的DMA中断,RTT里面是没有的,这些中断你可以等后续使用的时候再添加,目前这个文件也先不加进SConscript脚本文件中。

添加文件无非就是把.h文件目录添加到目前整个工程的头文件搜索范围内,然后把.c文件添加到工程编译的文件范围内。具体如下:

上图已经很明白了,照葫芦画瓢就能添加完成。添加完成后再次编译:

可以看到,整个固件大小基本没太大变化!这是因为此时虽然编译了SConscript脚本里我们添加的文件,但是因为我们就没有调用那些函数,所以最后都没有链接进生成的固件里!但是有一个函数例外,我们仅仅使用了它,也就是SystemClock_Config。

这个时候你打开上文中分析到时钟配置的drv_clk.c中你会发现,里面的一部分代码在使用CubeMX后被自动更改了:

它提示我们,时钟用的是CubeMX生成的了。如果你没有按上文中修改 SConscript的方法把CubeMX中的main.c添加进去就会提示找不到SystemClock_Config函数。但是这又有一个疑问,我们在使用CubeMX前就有一个main.c,现在又有一个main.c,那不是重复了吗?其实文件名重复不要紧,毕竟实际编译的时候其实是有路径作为前缀的,只要路径不同,在编译器看来就是不同的,但是两个main函数总归在链接的时候分不出来吧?

其实这又是RTT Studio帮我们做好了,仔细看cubemx下的main函数:

它使用了weak关键字去定义,这会使如果工程内有两个一样的函数,优先使用没有weak定义的。也就是实际main链接的时候用的我们原始的那个。

到此为止,我们把CubeMX所有生成的文件都包含进了我们的工程里,我们可以在工程任意一个.c内调用CubeMX生成的文件了,这无疑方便很多! 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/478612
推荐阅读
相关标签
  

闽ICP备14008679号