此文章写给我即将到来的Robocon学弟
目录
一、vscode自动提示
如果用vscode开发stm32,使用Makefile插件就会自动提示。Makefile插件会根据当前vscode打开的文件夹下的makefile文件内容工作。如果还是出现红色波浪线,出现像找不到头文件等问题,一般重启试vscode一下,或者卸载重装插件可以解决。如果自己添加的文件找不到,应该是makefile文件写错了。注意:makefile可能和cmake等插件冲突。
二、printf打印问题
如果想用串口(usart)打印信息,C语言的printf一定是大家使用最熟悉的函数。那么怎么在STM32实现呢?如下代码即可实现:
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
int UART_Print(char *fmt, ...)
{
int ret;
va_list ap;
va_start(ap, fmt);
ret = vsprintf(UART_TxBuf, fmt, ap);
va_end(ap);
if (ret > 0)
{
HAL_UART_Transmit(&PRINT_UART, (uint8_t *)UART_TxBuf, ret, WAIT_DELAY);
}
return ret;
}
但是实际应用的时候发现无法打印浮点数。这个时候更改一下makefile文件的编译选项。可以在140多行找到libraries添加-u _printf_float -u _scanf_float。
# libraries
LIBS = -lc -lm -lnosys
LIBDIR =
LDFLAGS = $(MCU) -specs=nano.specs -u _printf_float -u _scanf_float -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections
二、编译输出
编译的时候可以看见编译速度很快,但是有些电脑在编译的时候发现终端输出太多信息,看起来很卡顿怎么办?在makefile的150多行的编译输出更改一下就好看很多。
# list of c objects
OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o)))
vpath %.c $(sort $(dir $(C_SOURCES)))
# list of c++ objects
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(CPP_SOURCES:.cpp=.o)))
vpath %.cpp $(sort $(dir $(CPP_SOURCES)))
# list of ASM program objects
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o)))
vpath %.s $(sort $(dir $(ASM_SOURCES)))
$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR)
@$(CC) -c $(CFLAGS) $< -o $@
@echo "[ c ] $@"
$(BUILD_DIR)/%.o: %.cpp Makefile | $(BUILD_DIR)
@$(CPP) -c $(CFLAGS) $< -o $@
@echo "[c++] $@"
$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR)
@$(AS) -c $(CFLAGS) $< -o $@
@echo "[asm] $@"
$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile
$(CC) $(OBJECTS) $(LDFLAGS) -o $@
$(SZ) $@
@echo "[->] $@"
$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
$(HEX) $< $@
$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
$(BIN) $< $@
$(BUILD_DIR):
mkdir $@
编译后的效果如下:
三、断言assert
如果看Hal库的代码,可以看见有很多的assert_param。这个东西在代码初始化的时候如果出现了问题会触发断言。
打开STM32CubeMX的这个选项。
然后在main.c文件的最下边就会出现这个assert_failed函数。然后更改里面的printf函数就可以实现判断初始化时有没有出现问题了,出现问题会直接串口打印错误文件和行数(Hal库官方的基本不会出现问题,但是我们可以在自己的初始化代码里使用)。