完善资料让更多小伙伴认识你,还能领取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代码,就可以适用于不同的芯片。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束
864 浏览 0 评论
2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
2550 浏览 9 评论
1592 浏览 0 评论
IaaS+on+DPU(IoD)+下一代高性能算力底座技术白皮书
2837 浏览 0 评论
飞凌嵌入式-ELFBOARD 常用的USB接口及其不同版本介绍第1期
1159 浏览 0 评论
66994 浏览 21 评论
嵌入式热门DIY项目:智能机器人开源资料合集(原理图、代码、论文)
68302 浏览 22 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-3 14:20 , Processed in 0.889586 second(s), Total 41, Slave 33 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191