看到了好多文章,在rtthread studio中启用mx,后总是复制mx相关msp函数到rt的board.c文件下,实际使用过程中发现并不需要,这里我们看下rt启动流程,看下到底需要不。
1.打开startup_stm32h743xx.S文件,看下芯片启动流程,具体位置如图:
2.我们看这里,启动过程中先执行systeminit函数,接着执行entry函数,我们顺藤摸瓜往下看
3.看下systeminit函数都在干啥,如图就是配置了一些寄存器就完了。
4.接下来看看entry函数都在干啥
可以看到entry调用了rtthread_startup函数,rtthread_startup函数干活很多,调用了非常多的函数,我们继续往下看。
5.第一个函数rt_hw_interrupt_disable关闭中断,没啥可以看的,第二个rt_hw_board_init进去看下,他进了board.c文件,直接进hw_board_init函数
6.跳转到了drv_common.c文件中,这里可以看到HAL Init函数,这个在裸机中常用,rt就启动时候自己调用了,另一个clk init,进去看看
7.我们在 drv_clk.c 中再进去,结果到了mx生成的main函数中,这里就说明rt调用了mx生成的时钟,需要把mx中的时钟配置粘贴到rt的drv_clk.c 中么?答案是不需要,rt已经自己把这里改到使用mx生成的时钟配置函数了.
所以,mx配置好就完事了,不用复制粘贴那么麻烦。
8.其他外设呢?我们继续往下看,加入我们要使用spi外设,我们就在mx中配置相关参数和管脚,分别会生成mx工程下的init函数和mspinit函数。如图打开board.h文件,打开#define BSP USING SPI1,这时候我们看到dnv spi.c中spi1已经被启用
继续往下看,有个自动初始化,将对spi进行初始化,继续顺藤摸瓜
9.我们看到rt_hw_spi_bus_init中用了stm_spi_ops,stm_spi_ops包含了spi_configure,其中又用了stm32_spi_init,1处为软件协议层面上的设置,就是MX_SPI1_Init中的设置.
10.2处继续往下看,其跳转到了stm32h7xx hal spl.c文件中,这里面我们发现了HAL_SPI_MspInit
打开HAL_SPI_MspInit函数,结果是个弱定义,而正好mx生成的msp配置函数也参与构建,所以这里被自动屏蔽掉了,mx中的外设msp函数就起作用了。并且会在编译过程中自动调用,完全不用复制粘贴。
10.结论,rtthread studio中的mx配置不用粘贴到rt工程中,必要的部分会自动调用。