完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
有三个错误。 .\build\keil\Obj\rt-thread.axf: Error: L6218E: Undefined symbol rt_hw_spi_device_attach (referred from usart.o). .\build\keil\Obj\rt-thread.axf: Error: L6218E: Undefined symbol rt_spi_configure (referred from usart.o). .\build\keil\Obj\rt-thread.axf: Error: L6218E: Undefined symbol hdma_usart1_tx (referred from STM32f1xx_hal_msp.o). 一个drv_spi.c文件没有添加,我尝试搜素了,发现在bsp的libraary中(其他的板子),我搜了STM32f10x(野火的开发板)。还有一个extern hdma_usart1_tx,是hal_dri_msp中定义的,我忘记是怎么加进来的了(也许是本来就有的)。还有一个是和第二个一样的问题。 是我env+cubemx工具没用嘛,对于Kconfig文件,spi_config,我问notion ai:它给我这样的回答: 我没有搜索到spiconfig文件。只搜索到spi_config文件。这里是进行硬件参数的配置,spi_config才是对的吧,我看了很多博客,怎么加的drv_xxx.h和drv-xxx.h文件啊?是直接复制嘛还是去env工具设置啊。 我刚才提问,有人给我了两个回答,一个用CubeMX生成驱动,然后修改,然后在board.h文件添加定义,为什么要在这里添加定义?然后呢,就这样嘛? |
|
相关推荐
2个回答
|
|
你有没有在env中使能SPI?
如果使能了,你的rtconfig.h中应该如下内容。若没有,你肯定没有打开总的SPI开关。 #define RT_USING_SPI 是否在board.h中使能对应的SPIx?如下示例代码使能了SPI1和SPI2,且SPI2使用DMA #define BSP_USING_SPI1 #define BSP_USING_SPI2 #define BSP_SPI2_TX_USING_DMA #define BSP_SPI2_RX_USING_DMA 在RT-Thraed中使能SPI的具体过程,在board.h中有详细说明,按照步骤来不会错。以下comments代码摘自board.h /** 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 */ 你现在在链接过程中出错,大概率是你没有打开RT_USING_SPI开关。 至于在board.h中添加HAL_SPI_MspInit的原因,你可以从查找HAL_SPI_MspInit开始,逐步分析函数调用过程,最终形成个人理解的SPI初始化过程。这个函数在stm32f4xxhal_spi.c中是\_weak 形式,即,若用户代码定义了HAL_SPI_MspInit,则调用用户撰写的函数,否则调用该文件的函数。 RTT对驱动进行了抽象处理,分层结构良好,最底层的硬件引脚初始化为SPI功能,就是在该函数中实现的。 这个函数可以不放在board.c中,可以放置到任何一个*.c中。但是,board的意思不就是电路板吗?这部分与硬件完全相关,其他部分与硬件关联不大。以后你换一个芯片的话,只需要在board部分修改对应的SPI引脚初始化代码即可,相当于软件与硬件做了一个解耦处理,软件架构更清晰,代码与硬件依赖度进一步降低,对开发者而言是一件比较方便的事情。 |
|
|
|
注:MSPInit,是MCU support package Initialization的缩写,即微控制器 支持包 初始化。
硬件引脚初始化。 STM32的HAL库,本身就是Hardware Abstraction Layer,硬件抽象层。 而RTT的驱动代码,则分别从device -> 外设驱动 drv_xx.c(调用HAL) -> MCU引脚 的角度,从上层到底层依次进行抽象。 在不同的芯片上,修改drv_xx.c 以及 更底层的引脚初始化,同样的device代码,就可以适用于不同的芯片。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
655 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
2448 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1292 浏览 0 评论
1895 浏览 0 评论
1486 浏览 0 评论
74860 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 15:33 , Processed in 0.780607 second(s), Total 40, Slave 33 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号