linux下使用cmake开发stm32:移植DSP库与实现usb虚拟串口printf打印
目录
前言
一、使用工具
二、前置工作
1、DSP库配置
2、usb烧录程序(按需使用)
三、操作步骤
1、usb虚拟串口配置
2、使用printf函数
3、使用DSP库
(1)CubeMX与代码操作
(2)Cmake操作
四、Cmake编译操作
1、编译生成.hex文件
2、结果展示
前言
本文重点介绍:
1、linux下如何使用Cmake开发stm32
2、Cmake与DSP(数字信号处理库)开发
3、USB虚拟串口使用printf函数
一、使用工具
1、STM32CubeMX
2、cmake
3、ubuntu
具体配置安装方式教程极多,可自行安装
二、前置工作
1、DSP库配置
参考:
CubeIDE中STM32H7移植DSP(数字信号处理)库_stm32h7 dsp库-CSDN博客
其中CubeMX配置部分,唯一区别为:
2、usb烧录程序(按需使用)
参考:linux下USB烧录STM32程序_linux 烧录stm32-CSDN博客
三、操作步骤
1、usb虚拟串口配置
之后只需在生成的main函数使用头文件即可使用
#include "usbd_cdc_if.h"
参考示例
//初始化字符串
float str[] ="abc\r\n";
//主循环
while (1)
{
CDC_Transmit_FS(str,3);
HAL_Delay(100);
}
2、使用printf函数
usb虚拟串口无法向USART使用print重定义,所以只能使用其他方案代替:
在 usbd_cdc_if.c 的末尾添加
/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */
#include <stdarg.h>
void usb_printf(const char *format, ...)
{
va_list args;
uint32_t length;
va_start(args, format);
length = vsnprintf((char *)UserTxBufferFS, APP_TX_DATA_SIZE, (char *)format, args);
va_end(args);
CDC_Transmit_FS(UserTxBufferFS, length);
}
/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */
在main.c直接调用如下函数即可。
usb_printf("Hello Dog");
经测试,无法printf浮点数。
3、使用DSP库
(1)CubeMX与代码操作
使用Cmake生成DSP库较为简单,只需在main.c添加头文件
#include "usbd_cdc_if.h"
后直接打印
usb_printf("%d\n",(int)(arm_sin_f32(1)*100));
其中:
arm_sin_f32(1) //为DSP库的函数,
(int)(arm_sin_f32(1)*100) //不直接打印arm_sin_f32(1) 原因是 usb_printf无法打印浮点数
(2)Cmake操作
使用库时,添加四舍五入宏定义
在CmakeLists.txt的最后一行添加
target_compile_definitions(${CMAKE_PROJECT_NAME}
PRIVATE
ARM_MATH_ROUNDING #四舍五入
)
四、Cmake编译操作
1、编译生成.hex文件
在CmakeLists.txt的最后一行添加
add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_OBJCOPY} -O ihex $<TARGET_FILE:${CMAKE_PROJECT_NAME}> ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}.hex
COMMENT "Generating HEX file"
)
进入项目文件夹,在项目目录中
mkdir build
cd build
cmake ..
make
在build文件夹会生成一个.hex文件,这就是需要烧录的文件夹,可以用串口烧录,也可使用USB烧录:
linux下USB烧录STM32程序_linux 烧录stm32-CSDN博客
2、结果展示
计算 sin(3.1415926/6)*10000=4999
作者:Isla_pm