【RT-Thread】制作STM32L1系列芯片BSP时未定义DMA_INSTANCE_TYPE、UART1_CONFIG的解决办法

前言

最近的项目由于要用到RTT,但是官方BSP中并没有L1系列芯片的BSP,故依据官方手册进行制作。在最后编译的时候,出现了四个错误和一堆警告;分别是:UART1_DMA_RX_CONFIGDMA_INSTANCE_TYPEUART1_CONFIG未被定义、和UART_INSTANCE_CLEAR_FUNCTION()函数为隐式声明的警告。

问题原因

DMA_INSTANCE_TYPE举例。在错误上方其实有对DMA_INSTANCE_TYPE的定义语句,但是由于宏定义的编译开关中并没有L1的芯片,于是该语句并没有执行导致出错。
其他几个错误和警告都是相似原因

#if defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32L0) \
 || defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32G4)
 
#define DMA_INSTANCE_TYPE              DMA_Channel_TypeDef

#elif defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7)\
   || defined(SOC_SERIES_STM32H7)
   
#define DMA_INSTANCE_TYPE              DMA_Stream_TypeDef

#endif /*  defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32L4) */

解决办法

查询HAL库的数据类型,可以得到L1系列是DMA_Channel_TypeDef,所以在上面#if后面直接添加

|| defined(SOC_SERIES_STM32L1)

UART1_CONFIG需要先打开文件\stm32\libraries\HAL_Drivers\drv_config.h,可以发现里面也是有L0/L4系列唯独缺少L1系列,只需要安装上方格式添加相应头文件即可

#elif  defined(SOC_SERIES_STM32L1)
#include "l1/adc_config.h"
#include "l1/dma_config.h"
#include "l1/pulse_encoder_config.h"
#include "l1/pwm_config.h"
#include "l1/sdio_config.h"
#include "l1/spi_config.h"
#include "l1/tim_config.h"
#include "l1/uart_config.h"
#include "l1/usbd_config.h"

此时编译会出现三个新的错误

Undefined symbol Error_Handler (referred from stm32l1xx_hal_msp.o)
Undefined symbol hdma_usart1_rx (referred from stm32l1xx_hal_msp.o).
Undefined symbol UART_INSTANCE_CLEAR_FUNCTION (referred from drv_usart.o).

最后一个错误和之前类似,找到UART_INSTANCE_CLEAR_FUNCTION的定义,并在#if后面直接添加

#if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F2) \
    || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32L0) || defined(SOC_SERIES_STM32G0) \
    || defined(SOC_SERIES_STM32G4) || defined(SOC_SERIES_STM32L1)
#define UART_INSTANCE_CLEAR_FUNCTION    __HAL_UART_CLEAR_FLAG
#elif defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32H7)
#define UART_INSTANCE_CLEAR_FUNCTION    __HAL_UART_CLEAR_IT
#endif

关于前后两个错误需要对stm32l1xx_hal_msp.c文件进行修改

/* 去掉这句前面的 extern */
DMA_HandleTypeDef hdma_usart1_rx;

/* 从CubeMX生成的 main.c 中复制 Error_Handler(void) 函数*/
void Error_Handler(void)
{
    /* Your code here */
}

再次编译即可0 Error(s), 0 Warning(s)√.

你可能感兴趣的:(STM32)