使用studio2.2.1建立项目后自带hal和cmsis库,再使用cubemx配置后反而要删除cubemx文件加下的重复文件。而且在cubemx下配置了外设后,在rtt工程下的相应的头文件也没有启用相关设备,请问使用cubemx的意义在哪儿,以及如何自动生成相关外设的配置操作呢。谢谢。
cubemx 配置主要是配置了引脚的功能,使用哪个外设除了要在 cubemx 配置外,还需要在 board.h 中打开相应的宏,例如要使用 SPI2 外设,根据 board.h 中的定义,打开 BSP_USING_SPI2 宏,在 cubemx 需要配置 SPI2 的引脚,生成配置的代码即可。官方也有相应的文档和cubemx联合使用的 RT-Thread Studio 用户手册
总的来说 cubemx 就是省去了自己来编写引脚复用的初始化的步骤。
/** if you want to use spi bus you can use the following instructions.
*
* STEP 1, open spi driver framework support in the RT-Thread Settings file
*
* STEP 2, define macro related to the spi bus
* such as #define BSP_USING_SPI1
*
* STEP 3, copy your spi init function from stm32xxxx_hal_msp.c generated by stm32cubemx to the end of board.c file
* such as void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
*
* STEP 4, modify your stm32xxxx_hal_config.h file to support spi peripherals. define macro related to the peripherals
* such as #define HAL_SPI_MODULE_ENABLED
*/
/*#define BSP_USING_SPI1*/
#define BSP_USING_SPI2
/*#define BSP_USING_SPI3*/
以调试串口的初始化过程为例分析,可以看到最终的寄存器的配置就调用了 cubemx 生成的 HAL_UART_MspInit() 代码,该代码在文件 (cubemx/Src/stm32f4xx_hal_msp.c) 中
rtthread_startup(components.c)
|-> rt_hw_board_init(board.c)
|-> hw_board_init(drv_common.c)
|-> rt_hw_usart_init(drv_usart.c)
|-> rt_hw_serial_register(serial.c)
|-> rt_device_register(device.c) // 注册串口设备,使用list_device可以该设备
|-> rt_object_init(object.c)
|-> rt_console_set_device(kservice.c)
|-> rt_device_find(device.c) // 查找注册串口设备
|-> rt_device_open(device.c) // 打开串口设备
|-> device_init(device.c)
|-> rt_serial_init(serial.c) // 串口设备初始化
|-> serial->ops->configure(serial, &serial->config);(serial.c)
|-> stm32_configure(drv_usart.c)
|-> HAL_UART_Init(libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c)
|-> HAL_UART_MspInit(cubemx/Src/stm32f4xx_hal_msp.c) // 初始化串口底层硬件,CubeMX配置后生成的
非常感谢,昨晚思考了一下 确实应该是这么个套路,那么用cubemx配置后应该可以删除rt工程自动生成的libraries文件夹内容吧
这个是不可以的,虽然 cubemx 也生成了一份库文件, 但是默认使用的是 rtt 工程下的 libraries 文件夹下的库文件,cubemx 生成的库文件并不会被编译进工程,工程如下所示,建议不要更改 rtt 的工程结构,按照默认的就行,cubemx 生成的库文件只在本地有一份,并不会加入到工程中,所以不用理会。
@wemtaaron 主要是这个文件 stm32xxx_hal_conf.h 使用cubemx配置后 drivers 下的该文件会修改为 xxx_bak.h,然后就会使用 cubemx下的 stm32xxx_hal_conf.h
@Game7 不好意思啊,系统一直也没提示有回复,直到今天才看到。
串口驱动的初始化函数调用流程如下,最终会调用到函数 HAL_UART_MspInit()
进行串口引脚的初始化,没有函数 HAL_UART_MspInit()
也是可以的,因为在文件 board.h 中已经指定了串口收发的引脚,我觉得 rtt 这部分实现的不是很好,对于串口确实会存在重复初始化的问题,但是对于 SPI 的话,就必须实现 HAL_SPI_MspInit()
要不然不能初始化相关引脚,这部分串口外设实现的有多余的部分。
|-> rt_device_find(device.c) // 查找注册串口设备
|-> rt_device_open(device.c) // 打开串口设备
|-> device_init(device.c)
|-> rt_serial_init(serial.c) // 串口设备初始化
|-> serial->ops->configure(serial, &serial->config);(serial.c)
|-> stm32_configure(drv_usart.c)
|-> stm32_gpio_configure(drv_usart.c) // 串口引脚和时钟初始化
|-> HAL_UART_Init(libraries/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c)
|-> HAL_UART_MspInit(cubemx/Src/stm32f4xx_hal_msp.c) // 初始化串口底层硬件,CubeMX配置后生成的
不过我也怀疑是这样的,因为使用 rtt 的话一般都会使用控制台,这样的话就必须使用至少一个串口,如果 board.h 中不定义控制台串台的引脚的话,新建工程后没有使用 CubeMX 之前控制台串口初始化就会有问题,也就不利于入手学习使用。
另外,我觉得重复初始化就重复初始化吧,所有使用的串口还是需要在 CubeMX 是、里面配置一下,即使使用多个串口只配置一个也能用,但是不配置的话就不能生成对应的 HAL_UART_MspDeInit()
,这样在做低功耗的时候不能有效的关闭串口的时钟,所以还是都配置一下,然后重复初始化吧。
非常感谢,昨晚思考了一下 确实应该是这么个套路,那么用cubemx配置后应该可以删除rt工程自动生成的libraries文件夹内容吧