前言
最近的项目由于要用到RTT,但是官方BSP中并没有L1系列芯片的BSP,故依据官方手册进行制作。在最后编译的时候,出现了四个错误和一堆警告;分别是:UART1_DMA_RX_CONFIG
、DMA_INSTANCE_TYPE
、UART1_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)
√.