0%

workflow——STM32(2)

Main Takeaway

记录我搭建CubeMX+VSCode+Ozone的STM32开发工作流的过程。

workflow——STM32(1)跟随知乎大佬NeoAndrew的博客搭建,并且适应浙大HW电控组的要求

该篇记录之前搭建workflow遇到的一些不明白的东西——包括FPU、DSP库、gcc-arm-none-eabi、GDB调试

FPU

简介

FPU(floating point unit)浮点运算单元,专用于执行十进制数计算的处理器。 也称为数学协处理器,用于执行算术运算

硬件FPU的开启

  1. 通过修改代码实现

    默认情况下,STM32F4xx的FPU是禁用的,可以通过设置协处理器控制寄存器(CPACR)来开启硬件FPU。在keil编程环境下,可以通过定义全局宏定义标识符_FPU_PRESENT和_FPU_USED都为1来开启硬件FPU。其中宏定义标识符_FPU_PRESENT用来确认处理是否带有FPU功能,标识符_FPU_USED用来确定是否开启FPU功能。实际上,因为STM32F4是带有FPU功能的,所以在stm32f4xx.h头文件中,默认定义_FPU_PRESENT为1。可以在文件stm32f4xx.h中找到如下定义。

    img

    若要开启FPU还需要在头文件stm32f4xx.h中定义标示符_FPU_USED的值为1。即在刚才的宏定义下边添加一个宏定义。

    img
  2. 通过软件设置实现

    在魔术棒中点击Target选项卡,在Code Generation区域的Floating Point Hardware中选择Use FPU即可,经过设置之后,在程序编译时编译器会自动加入宏定义标识符_FPU_USED为1。

DSP库

STM32F4xx属于Cortex M4F架构,带有32位的单精度硬件FPU(Float Point Unit),支持浮点指令集,相对比M0和M3架构,浮点运算性能高出数十倍甚至上百倍。CortexTMM4 FPU是ARMTMFPv4-SP单精度FPU一种实现形式。

STM32F4的Cortex-M4内核不仅内置硬件FPU单元,还支持DSP多种指令集

简介

DSP(Digital Signal Processing)数字信号处理技术,DSP库就是为了让MCU能够使用像DSP(数字信号处理的芯片)功能弄的一些官方库函数。

强大数据处理能力、数字信号处理的实时性和高运行速度。

DSP库主要包含以下几个分库:

  • BasicMathFunctions基本数学函数:提供浮点数的各种基本运算函数,如向量加减乘除等运算。

  • CommonTables,arm_common_tables.c文件提供位翻转或相关参数表。

  • ComplexMathFunctions复杂数学功能,如向量处理,求模运算的。

  • ControllerFunctions控制功能函数。包括正弦余弦,PID电机控制,矢量Clarke变换,矢量Clarke逆变换等。

  • FastMathFunctions快速数学功能函数。提供了一种快速的近似正弦,余弦和平方根等相比CMSIS计算库要快的数学函数。

  • FilteringFunctions滤波函数功能,主要为FIR和LMS(最小均方根)等滤波函数。

  • MatrixFunctions矩阵处理函数。包括矩阵加法、矩阵初始化、矩阵反、矩阵乘法、矩阵规模、矩阵减法、矩阵转置等函数。

  • StatisticsFunctions统计功能函数。如求平均值、最大值、最小值、计算均方根RMS、计算方差/标准差等。

  • SupportFunctions支持功能函数,如数据拷贝,Q格式和浮点格式相互转换,Q任意格式相互转换。

  • TransformFunctions变换功能。包括复数FFT(CFFT)/复数FFT逆运算(CIFFT)、实数FFT(RFFT)/实数FFT逆运算(RIFFT)、和DCT(离散余弦变换)和配套的初始化函数。

使用

DSP库移植的一些步骤(移植也分两种,一种是使用lib文件,另一种是直接的C语言函数库)

  1. 在STM32CubeMX中选择copy all used libraries

  2. 在keil中添加DSP库到工程:DSP库文件就在工程目录中,位于.

    arm_cortexM4bf_math.lib(浮点Cortex-M4大端模式)

    arm_cortexM4lf_math.lib(浮点Cortex-M4小端模式)

    STM32F4的内核CortexM4F采用小端模式,所以选择:arm_cortexM4lf_math.lib(浮点Cortex-M4小端模式)。

    Tips:‘b’表示大端格式(Big Endian),‘l’表示小端格式(Little Endian),‘f’表示带浮点数。要根据自己使用的硬件平台来选择(看是大端还是小端,是否带有FPU(浮点运算单元))

  3. 在魔术棒中点击Target选项卡,在Code Generation区域的Floating Point Hardware中选择Single Precision(单精度)

    点击C/C++选项卡,在Preprocessor Symbols区域的Define中添加如下内容:ARM_MATH_CM4,__TARGET_FPU_VFP,__FPU_PRESENT=1

    • ARM_MATH_CM4表示在CM4中使用MATH库

    • __TARGET_FPU_VFP表示在目标设备中使用FPU

    • __FPU_PRESENT=1表示开启FPU,这个宏其实在stm32f407xx.h中有定义时,但是它并没有在core_cm4.h中起作用,在编译的时候会报错,应该是跟文件的编译顺序有关系,因此为了正常编译,在这里添加它。

  4. 在相应的.c文件中添加头文件:arm_math.h、arm_const_structs.h即可使用。

    Tips:在官方的HAL库中有DSP库相关的使用例程,STM32Cube_FW_F4_V1.21.0\Drivers\CMSIS\DSP_Lib\Examples

gcc-arm-none-eabi

简介

gcc-arm-none-eabi是GNU项目下的软件,是一个面向裸机arm的编译器,更专业的,在嵌入式开发中我们一般将它叫做工具链。(工具链:一般由编译器、连接器、解释器和调试器组成)

gcc-arm-none-eabi工具链工具使用方法及介绍

在我们安装好gcc-arm-none-eabi后,我们可以在终端中输入指令来调用gcc-arm-none-eabi的功能了,那么这个工具链下茫茫多的执行软件都是做什么的呢,可以看到在路径下一共有28个工具。接下来我们就来介绍一下我们将会用到的工具和他的功能及使用方式。

  • arm-none-eabi-gcc这个工具为c语言编译器,可以将.c文件转化为.o的执行文件。 它的使用方法是,在终端中cd到工作目录,如编译当前目录下的hello.c文件,生成hello.o文件: arm-none-eabi-gcc -c hello.c

  • arm-none-eabi-g++这个工具为c++语言编译器,可以将.cpp文件转化为.o的执行文件,使用方式如上。

  • arm-none-eabi-ld这个工具为链接器即最后链接所有 .o 文件生成可执行文件的工具。一般我们不使用 arm-none-eabi-ld 的指令调用它,而是通过使用arm-none-eabi-gcc 来调用,因为前者对c/cpp文件混合型生成的.o文件们的支持性不好,所以官方的说明书中也推荐使用arm-none-eabi-gcc 指令来代替arm-none-eabi-ld,如下: arm-none-eabi-gcc -o hello hello.o

  • arm-none-eabi-objcopy此工具将链接器生成的文件转化为bin/hex等烧写的格式,用以下载进入单片机。如下:

    arm-none-eabi-objcopy hello hello.bin

  • arm-none-eabi-gdb工具链中的调试器,将它连接到调试器硬件产生的网络端口,就可以进行硬件和代码的调试了。GDB是gnu下一个独特的调试软件,它具有很多自己的特性,也许大家无法想象使用命令行调试的景象,但是之后我们会看到它的强大。

当然这一系列的指令只是一个简单且包含用法错误的例子,实际的使用中我们要输入很多设置参数,才能适配我们的单片机。

GDB调试

简介

GDB 全称“GNU symbolic debugger”,从名称上不难看出,它诞生于 GNU 计划(同时诞生的还有 GCC、Emacs 等),是 Linux 下常用的命令行程序调试工具。实际场景中,GDB 更常用来调试 C 和 C++ 程序。

Tips:使用 Vim+GDB 可以在任意一台电脑上直接调试,不用花时间安装复杂的 IDE 环境。

一般来说,GDB主要帮助我们完成以下四个方面的功能:

  1. 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
  2. 在某个指定的地方或条件下暂停程序。
  3. 当程序被停住时,可以检查此时你的程序中所发生的事。
  4. 在程序执行过程中修改程序中的变量或条件,将一个bug产生的影响修正从而测试其他bug。

如何进行调试我没有学习因为现在还没有在Linux上进行调试,以后有需要的话填坑!!!

调试ARM

windows使用gdb调试stm32可以使用几套环境:

  1. stlink硬件+openocd软件+arm-none-eabi-gdb
  2. jlink硬件+openocd软件+arm-none-eabi-gdb
  3. jlink硬件+jlink_gdb_server软件+arm-none-eabi-gdb

References