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

物联沃分享整理
物联沃-IOTWORD物联网 » linux下使用cmake开发stm32:移植DSP库与实现usb虚拟串口printf打印

发表回复