赞
踩
硬件:WeAct-STM32H743VIT6
软件:RT-Thread Studio
一上来的界面还是挺简洁明了的,就按照自己的硬件选择就可以了。
直接编译,看了一下,默认就是用了68.9KB的flash,如果用Nano版的应该会小很多,不过因为H7资源并不紧张,所以就直接用了普通的。
直接下载,可以看到串口直接有输出的。
上图创建工程的时候就已经在最下面提示了,默认使用的是内部时钟,请修改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生成的文件了,这无疑方便很多!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。