STM32学习笔记(二)

STM32学习笔记(二)

常见问题

  1. MX_DMA_Init()应放在MX_ADCx_Init()前面

  2. AD9910 康威的模块,二极管压降0.8v,DC5V供电,ams1117-3.3输入只有4.2v,输出3v不够。同时需要注意ad9910需要电流较大 5V 0.3A+。

  3. 串口重定向

    Keil工程迁移至STM32CubeIDE,Keil转cubeide,超详细图文教程

    # 【STM32CubeIDE】重定向printf

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    /* USER CODE BEGIN 0 */

    #include "stdio.h"

    // 重定向print start

    int __io_putchar(int ch)

    {

    //具体哪个串口可以更改USART1为其它串口

    while ((USART1->SR & 0X40) == 0); //循环发送,直到发送完毕

    USART1->DR = (uint8_t) ch;

    return ch;

    }



    //_write函數在syscalls.c中, 使用__weak定義, 所以可以直接在其他文件中定義_write函數

    __attribute__((weak)) int _write(int file, char *ptr, int len)

    {

    int DataIdx;

    for (DataIdx = 0; DataIdx < len; DataIdx++)

    {

    __io_putchar(*ptr++);

    }

    return len;

    }

    // 重定向print end

    /* USER CODE END 0 */
  4. SDK配置

    Lib/include要同时添加到C和汇编的引用配置中

    或者使用Export Settings把原来的工程设置导入

常用代码

DMA-TIM-GPIO 读取AD9220

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#define DATATYPE float_t
#define ADC_SAMPLE_NUM 256
#define ADC_RUNNING 0
#define ADC_STOP 1
volatile uint8_t ad9220_flag = ADC_STOP;
uint16_t AD9220_dmaData[ADC_SAMPLE_NUM + 1] __attribute__((section(".ARM.__at_0x24000000")));
uint16_t AD9226_dmaData[2047] __attribute__((section(".ARM.__at_0x24000000")));
DATATYPE AD9220_Data[ADC_SAMPLE_NUM] __attribute__((section(".ARM.__at_0x24000000")));
void AD9220_CpltCallback(DMA_HandleTypeDef *hdma)
{
ad9220_flag = ADC_STOP;
HAL_TIM_PWM_Stop(&htim5, TIM_CHANNEL_2);
}
void AD9220_Init()
{
hdma_tim5_ch2.XferCpltCallback = AD9220_CpltCallback;
}
void AD9220_Read(DATATYPE *AD9220_Data, uint32_t length)
{
if (ad9220_flag == ADC_STOP && length)
{
// HAL_TIM_Base_Stop(&htim3);
HAL_TIM_PWM_Stop(&htim5, TIM_CHANNEL_2);
ad9220_flag = ADC_RUNNING;
//HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);
//HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_DMA_Start_IT(&hdma_tim5_ch2, (uint32_t)AD9220_dmaData, (uint32_t) & (GPIOB->ODR), length);
__HAL_TIM_ENABLE_DMA(&htim5, TIM_DMA_CC2);
HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_2);
// HAL_TIM_Base_Start(&htim3);
}
#ifdef DBG_MODE
else
{
BSP_ERROR_HANDLER(__FILE__, __LINE__, "ADCs aren't stop or length is invalid");
}
#endif // DBG_MODE
while (ad9220_flag != ADC_STOP)
{
// waiting for ADC
}
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_TIM_PWM_Stop(&htim5, TIM_CHANNEL_2);
// for (int i = 0; i < length; i++)
// {
// AD9220_Data[i] = 5000.0 * AD9220_dmaData[i] / 4096.0;
// }
}
int main(void){
AD9220_Init();
AD9220_Read(AD9220_Data, ADC_SAMPLE_NUM +1);
while (1)
{
AD9220_Read(AD9220_Data, ADC_SAMPLE_NUM);
HAL_Delay(1000);
for (int i = 0; i < ADC_SAMPLE_NUM; i++)
{
printf("%d\n", AD9220_dmaData[i]);
}
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
}
}

定时器触发ADC

FFT

Define USE_HAL_DRIVER,STM32H743xx,ARM_MATH_LOOPUNROLL,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
```

## AD7606的使用

1. [AD7606的使用【Stm32F4】](https://blog.csdn.net/K_zqhag/article/details/113574743#%E6%A6%82%E8%A7%88)

> 采样率提高时电压值跳动
> 在解决了通讯的问题后,便可以读取出正确的电压值了。然后就使用信号发生器对AD7606输入了一个交流正弦信号,单片机读取到采样值后,使用串口屏显示波形,以观察连续采样的完整度。
> 测试发现,当采样率即定时器中断溢出频率提高时(约10K以上),所得到的电压值偶尔会出现跳动。经过观察,这个偶尔跳动所得到的电压值恰好就是AD7606输入悬空时所得到的采样值,猜测是隔壁通道虽然没有使用但处于悬空状态,而AD7606又是8通道同时转换的,有可能是隔壁通道产生的干扰。将没有使用的输入通道进行接地后,采样率提高到20K也没有出现跳动了。

## SPI 定时器 DMA

1. [STM32定时器触发SPI逐字收发之应用示例](https://zhuanlan.zhihu.com/p/601801239)

2. [STM32F4 SPI接口驱动AD7606问题](https://www.amobbs.com/thread-5729282-1-1.html)

3. [通过STM32外部中断触发DMA传输](https://zhuanlan.zhihu.com/p/519782292)

4. [stm32f-how-to-config-dma-transfer-to-spi-triggered-by-timer](https://electronics.stackexchange.com/questions/353152/stm32f-how-to-config-dma-transfer-to-spi-triggered-by-timer)

5. ADS8688

![image-20230706162146162](STM32%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%BA%8C%EF%BC%89/image-20230706162146162.png)

# 算法

## 峰值检测算法

### 二阶差分

峰值检测算法是一种常用的信号处理算法,可以在信号中找到所有的峰值。以下是一种简单的峰值检测算法,基于二阶差分:

1. 首先对信号进行二阶差分,得到一个新的序列。二阶差分可以通过对信号进行两次一阶差分得到,公式如下:

`d[i] = x[i] - 2*x[i-1] + x[i-2]`

2. 在新的序列中,如果当前点的值大于前一个点和后一个点的值,则说明当前点是一个峰值点。

3. 将所有峰值点存储在一个数组中,即可得到所有的峰值。

以下是一个使用C语言编写的示例代码:

```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define SIGNAL_LENGTH 1000 // 假设信号长度为1000

int main() {
double signal[SIGNAL_LENGTH]; // 假设信号存储在signal数组中
double peaks[SIGNAL_LENGTH]; // 存储所有峰值的数组
int num_peaks = 0; // 存储峰值数量的变量

// 计算二阶差分序列
double diff2[SIGNAL_LENGTH-2];
for (int i = 2; i < SIGNAL_LENGTH; i++) {
diff2[i-2] = signal[i] - 2*signal[i-1] + signal[i-2];
}

// 找到所有峰值点
for (int i = 1; i < SIGNAL_LENGTH-2; i++) {
if (diff2[i-1] < 0 && diff2[i] > 0) { // 判断当前点是否为峰值点
peaks[num_peaks] = signal[i];
num_peaks++;
}
}

// 输出所有峰值点的幅值和频率
for (int i = 0; i < num_peaks; i++) {
printf("Peak %d: amplitude=%lf, frequency=%d\n", i+1, peaks[i], i+1);
}

return 0;
}

基于信噪比的自适应阈值峰值检测算法代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define SIGNAL_LENGTH 1000 // 假设信号长度为1000
#define SNR_THRESHOLD 3.0 // 设置信噪比阈值为3.0

int main() {
double signal[SIGNAL_LENGTH]; // 假设信号存储在signal数组中
double peaks[SIGNAL_LENGTH]; // 存储所有峰值的数组
int num_peaks = 0; // 存储峰值数量的变量

// 计算信噪比
double noise_power = 0.0;
for (int i = 0; i < SIGNAL_LENGTH; i++) {
noise_power += signal[i]*signal[i];
}
noise_power /= SIGNAL_LENGTH;
double signal_power = 0.0;
for (int i = 0; i < SIGNAL_LENGTH; i++) {
signal_power += (signal[i] - noise_power)*(signal[i] - noise_power);
}
double snr = 10*log10(signal_power/noise_power);

// 自适应设置阈值
double threshold = snr > SNR_THRESHOLD ? noise_power + snr/10.0 : noise_power + snr/20.0;

// 找到所有峰值点
for (int i = 1; i < SIGNAL_LENGTH-1; i++) {
if (signal[i] > threshold && signal[i] > signal[i-1] && signal[i] > signal[i+1]) {
peaks[num_peaks] = signal[i];
num_peaks++;
}
}

// 输出所有峰值点的幅值和频率
for (int i = 0; i < num_peaks; i++) {
printf("Peak %d: amplitude=%lf, frequency=%d\n", i+1, peaks[i], i+1);
}

return 0;
}

这段代码求噪声功率不太对,应该对对整个信号或信号中某些不包含所关心信号成分的时间段进行平方和求和来估计噪声功率。

这个chatgpt给的算法,应该是判断时域波形有没有信号。

频域特征指标

matlab中fft运算后需要对幅值乘2除N

有量纲特征值8个——最大值、最小值、峰峰值、均值、方差、标准差、均方值、均方根值(RMS)
无量纲特征值6个——峭度、偏度、波形因子、峰值因子、脉冲因子、裕度因子
频域特征值5个——重心频率、均方频率、均方根频率、频率方差、频率标准差
谱峭度特征4个——谱峭度的均值、谱峭度的标准差、谱峭度的偏度、谱峭度的峭度

目录——信号处理有关的那些东东

希尔伯特谱、边际谱、包络谱、瞬时频率/幅值/相位——Hilbert分析衍生方法及MATLAB实现

希尔伯特谱、边际谱、包络谱、瞬时频率/幅值/相位——Hilbert分析衍生方法及MATLAB实现

类EMD的“信号分解方法”及MATLAB实现(第一篇)——EEMD

类EMD的“信号分解方法”及MATLAB实现(第二篇)——CEEMD

FFT

窗函数

基于Nuttall窗三谱线插值FFT谐波测量

https://max.book118.com/html/2017/0108/81419544.shtm 四项五阶窗校正

STFT使用overlap-add重建信号

FFT移植

  1. bits reversal 算法

    https://gist.github.com/rosek86/d0d709852fddf36193071d7f61987bae

    Generation of bit reversal tables for CMSIS-DSP

    1
    python3 genBitsReversal.py --size 8192 --radix 8 out.c

DSP

stm32cubeide 添加Source/**/arm_**

PID

  1. STM32利用arm-dsp库进行PID调节控制

外设

ADC

笔记

https://blog.csdn.net/devicenet/article/details/108031976

一、 ADCs_Common_Settings

Mode: 设置ADC 工作模式(独立模式或多重模式)
独立模式
<1> Independent mode ADC1 和ADC2 工作在独立模式
双重模式
<2> Dual regular simultaneous + injected simultaneous mode ADC1 和ADC2 工作在同步规则模式和同步注入模式
<3> regular regular simultaneous + alternate trigger mode ADC1 和ADC2 工作在同步规则模式和交替触发模式
<4> Dual injected simultaneous mode only ADC1 和ADC2 工作在同步注入模式
<5> Dual regular simultaneous mode only ADC1 和ADC2 工作在同步规则模式
<6> Dual interleaved mode only ADC1 和ADC2 工作在交叉模式
<7> Dual alternate trigger mode only ADC1 和ADC2 工作在交替触发模式

DMA Access Mode :(DMA)直接存储器存取访问模式(在多重模式下才有此项)

Delay between 2 sampling phases: 2个抽样阶段的延迟(在多重模式下才有此项)

二、 ADCs _Settings
<1> Clock Prescaler ADC的时钟分频数
<2> Resolution 分辨率(意思是AD位数)
<4> Scan Conversion Mode ADC工作在扫描模式(多通道)还是单次(单通道)模式。可以设置这个参数为ENABLE 或者DISABLE。
<5> Continuous Conversion Mode ADC模数转换工作在连续模式。可以设置这个参数为 ENABLE或者DISABLE 。
<6> Discontinuous Conversion Mode ADC模数转换工作在不连续模式(单次模式)。可以设置这个参数为 ENABLE或者DISABLE 。
<7> End of Conversion Selection 转换选择结束
<8> Overrun behaviour 如果数据没有读取,新的ADC转换结果是保持上次一结果,还是新的转换结果覆盖原来的结果
<9>ConversionDataManagement 此参数成员用于ADC采集数据的管理,可以存到ADC的DR寄存器,传输给DFSDM,又或者通过DMA的单次或者循环模式传输数据到指定地址。
<10>Low Power Auto Wait 用于使能或者禁止低功耗自动延迟等待模式

三、 ADCs_Regular_ConversionMode (规则通道转换模式)

<1>LeftBitShift 用于设置ADC转换结果的左移位数,使用或者没有使用过采样的情况下,都可以使用此参数。
<2> Enable Regular Conversions(规则通道控制)ENABLE(使能)、DISABLE(禁止),需要使能规则通道控制才可以进一步对规则通道的使用进行配置
<3> Number of Conversion ADC转换的通道数量
<4> External Trigger Conversion Source ADC外部触发转换源
<5> External Trigger Conversion Edge ADC外部触发转换边沿(意思是上升沿/下降沿触发)
四、 Rank
<1> Channel ADC转换通道
<2> Sampling Time ADC转换时间
五、 ADC_Injected_ConversionMode(注入通道转换模式)
<1> Number of Conversion ADC转换的注入通道数
注入通道数不为0时,才有下面的配置项
<2> External Trigger Source ADC外部触发转换源
<3> External Trigger Edge ADC外部触发转换边沿(意思是上升沿/下降沿触发)
<4> Injected Conversion Mode ADC注入转换通道模式
六、 Rank(ADC_Injected_ConversionMode的(Number of Conversion )ADC转换的注入通道数不为0时,才能配置注入通道的其他参数)
<1> Channel ADC转换通道
<2> Sampling Time ADC转换时间
<3> Injected Offset ADC注入通道的偏值

问题

UART

  1. STM32-CubeMx-HAL库-串口空闲中断+DMA——利用HAL_UARTEx_ReceiveToIdle_DMA实现不定长数据接收
  2. HK32F103C8T6串口DMA接收不定长数据HAL库
  3. STM32 UART DMA RX and TX
  4. LwRB 使用说明

SPI

  1. STM32定时器触发SPI逐字收发之应用示例

  2. 驱动ADS8688

HMI串口屏

  1. 使用Nextion库

    按键解锁 ok页面添加

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if(loadpageid.val==0&&loadcmpid.val==page0.x0.id)
    {
    printh 65 00 02 00 FF FF FF
    }else if(loadpageid.val==0&&loadcmpid.val==page0.x1.id)
    {
    printh 65 00 06 00 FF FF FF
    }else if(loadpageid.val==0&&loadcmpid.val==page0.x2.id)
    {
    printh 65 00 08 00 FF FF FF
    }

项目

  1. GitHub - jasongzy/impedometer: 基于 STM32 的阻抗测量仪 ad9910 ad8301阻抗测量 hmi屏
  2. Nextion-Hmi-Library-for-STM32-Platform
  3. Nextion_STM32_Library

STM32CubeIDE

  1. STM32CubeIDE - SEGGER Wiki

  2. Configuring DSP libraries on STM32CubeIDE

    1
    2
    3
    4
    5
    ARM_MATH_CM7
    __FPU_PRESENT //Drivers文件夹属性那边添加 非工程属性
    __FPU_USED //Drivers文件夹属性那边添加 非工程属性
    ARM_MATH_LOOPUNROLL
    -Ofast

    添加全局宏:USE_HAL_DRIVER,STM32H743xx,__CC_ARM,__TARGET_FPU_VFP,__FPU_PRESENT,ARM_MATH_CM7

    注释或者删除STM32H743xx中关于的__FPU_PRESENT定义

    添加头文件路径

    添加工程需要的math源文件,ARM已经帮我们按文件夹分好类了

    在工程中引入头文件#include “arm_math.h”

    开始使用库中的函数

  3. https://blog.csdn.net/mutulu7la/article/details/121056881

  4. STM32CubeIDE踩坑记录

  5. 【经验分享】STM32CubeIDE使用说明 —— Keil项目迁移到STM32CubeIDE

  6. 自动弹出补全

    Stm32CubeAuto

  7. STM32学习笔记 —— STM32CubeIDE中文大小不一乱码情况

  8. 报错 “Error Downloading the following files: crdb_full.zip (Cannot unzipped)”

    使用管理员权限打开CubeIDE

  9. 虚拟串口 ITM

    STM32CubeIDE(一):配置工程并开启SWV调试

    Jlink使用技巧之虚拟串口功能

  10. Cube IDE 实现自动代码补全功能

  11. 主题插件 https://marketplace.eclipse.org/content/darkest-dark-theme

  12. STM32CubeIDE链接脚本讲解

  13. 如果发现某些快捷键失效,检查是不是被搜狗输入法占用了

  14. 在keilhttps://so.csdn.net/so/search?q=keil&spm=1001.2101.3001.7020中不复位调试MCU

    调试正在运行的程序(STM32CubeIDE)

  15. STM32应用笔记: 使用STM32CubeMonitor实时监测变量

  16. STM32 调试中 STLINK STM-STUDIO 图形化显示变量波形 代替串口

  17. STM32CubeMonitor使用教程(持续更新)

  18. eclipse设置快捷键提示出错Invalid thread access

    只需要在Eclipse第一次启动的时候加上一个 -clean 参数即可,下次再启动就不用加这个参数了。
    再简单解释一下这个参数的作用,Eclipse为了加快启动速度会将插件进行缓存,但是恰巧就是这些缓存有的时候会出问题,所以用 -clean 参数让 Eclipse 清除掉这些缓存就行了,不过加上这个参数之后 Eclipse 的启动速度会变慢,好在只需使用一次。

    关于eclipse启动报错,an error has occurred.see the log file

    个人解决方法 删掉工作空间.metadata/.plugins文件夹

    删掉<工作目录>\.metadata\.plugins中xxx.ui文件夹

    猜测是以下文件夹之一

    1. org.eclipse.e4.ui.workbench.swt
    2. org.eclipse.ui.editors
    3. org.eclipse.ui.workbench
    4. org.eclipse.ui.workbench.texteditor
  19. STM32CubeIDE汉化后主页出现报错解决方法

  20. 语言包 https://download.eclipse.org/technology/babel/update-site/latest/

    只需要安装Babel Language Pack for eclipse in Chinese (Simplified)

  21. Eclipse错误提示: Symbol ‘xxxx’ could not be resolved

  22. 调试正在运行的程序(STM32CubeIDE)

  23. STM32CubeMX关于添加DSP库的使用

  24. multiple definition of `xxx’: CMSIS库多重定义问题

    现象
    使用arm-none-eabi-gcc编译CMSIS库时,包含了DSP模块。编译成功的.a静态库在链接到APP程序时,出现报错“ multiple definition of `xxx’ ”。

    原因
    目前的CMSIS代码版本DSP库中,Source下每一个子目录都包含了一个特殊的c文件,该文件"#include"了当前目录下其他所有的c文件。
    因此,这些c文件实际上被编译并链接了两次。

    解决方案1
    删除DSP库Source下所有子目录对应的c文件,如“BasicMathFunctions”目录下的“BasicMathFunctions.c”。

    解决方案2
    编译的SRC变量中只包含这些特殊的文件。最终生成的静态库只编译一次这些文件。

  25. Attaching to a Running Target with STM32CubeIDE Debugger

  26. Window—>Preferences—>C/C++—>Task Tags 添加HACK

    TODO:英语翻译为待办事项,备忘录。如果代码中有该标识,说明在标识处有功能代码待编写,待实现的功能在说明中会简略说明。

    FIXME:可以拆成短语,fix me ,意为修理我。如果代码中有该标识,说明标识处代码需要修正,甚至代码是错误的,不能工作,需要修复,如何修正会在说明中简略说明。

    XXX:如果代码中有该标识,说明标识处代码虽然实现了功能,但是实现的方法有待商榷,希望将来能改进,要改进的地方会在说明中简略说明。

    HACK:英语翻译为砍。如果代码中有该标识,说明标识处代码我们需要根据自己的需求去调整程序代码。

其他

  1. 于STM32仿真ITM调试那些事(STM32+JLINK+KEIL)

  2. AC6下载

    手把手教你升级Keil MDK的ARM编译器

    安装在D:\Keil_v5\ARM

    https://developer.arm.com/documentation/101407/0538/Creating-Applications/Tips-and-Tricks/Manage-Arm-Compiler-Versions

    https://developer.arm.com/documentation/ka003208/latest

  3. 关于STM32等ARM程序Fault中断错误分析与解决办法

  4. Jlink使用技巧系列教程索引

    http://www.wangchaochao.top/

  5. 十分钟让你的JLINK成为调试利器

  6. 【嵌入式小技巧】STM32 实现 SEGGER RTT 打印(超详细

  7. 工欲善其事,必先利其器:通过Telnet访问SEGGER RTT

  8. CMSIS DSP静态库链接后可执行文件太大

    1
    2
    CFLAGS+= -ffunction-sections -fdata-sections
    LFLAGS+=-Wl,--gc-sections
  9. Ozone使用介绍-Trace功能

  10. D:\ST\STM32CubeIDE_1.12.0\STM32CubeIDE\plugins\com.st.stm32cube.ide.mcu.productdb.debug_2.0.500.202302211408\resources\cmsis\STMicroelectronics_CMSIS_SVD

ADI模拟对话

  1. ATE引脚电子器件的电平设置DAC校准
  2. 解密RF信号链:特性和性能指标
  3. AN-581: 单电源应用中的偏置和去耦运算放大器 (Rev. 0)
  4. 阻容感测量 Estimating the Impedance and Admittance of Capacitive and Inductive Devices
  5. 保护ADC输入

赛前预警

  1. inuclde path 和 source path都要配置,在main文件添加include和bsp_handler

    Source/**/arm_**

  2. hmi 工程默认baud 9600 ,删除上电输出;要被修改的键盘,文本设置为全局,显示中文要用utf-8

  3. cubemx生成dma handle变量要extern extern DMA_HandleTypeDef hdma_tim2_ch2;

  4. 发现编译错误时,检查是否是Toolchain的问题

  5. 开关类切信号 加延时

  6. AD9959 50欧输出,经过隔直, 接高阻输入OPA1612 10Gain 会有直流产生,添加50,100k到底解决。怀疑是运放输入失调电流给电容充电,导致产生电压

STM32 VS Code Extension

  1. cmake\gcc-arm-none-eabi.cmake默认搜索路径为c盘,修改

    1
    2
    3
    4
    5
    6
    # Try to find an STM32CubeIDE installation to use for the toolchain.
    file(GLOB TOOLCHAIN_DIRECTORIES
    #安装在D盘
    "D:/ST/STM32CubeIDE_*/STM32CubeIDE/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.*/tools/bin/"

    )

GDB GNUPLOT

1
2
3
4
5
6
7
8
source plot.gdb
set print elements 0
set print repeats 0
set pagination off
set max-value-size unlimited
plot1d bsp_ad9220_dmaData


GDB: Printing Variables to File

1
2
3
4
5
6
set max-value-size unlimited
set print elements 0
set print repeats 0
set pagination off
set logging file file_to_save_data
set logging on
  • set max-value-size unlimited: max-value-size controls how much memory the debugger is willing to allocate for each variable it prints, as to print it, GDB needs to copy the variable from the debugged program to it’s own memory. Default value is 64 KiB, so for larger arrays, the latter parts may be truncated if this is not set.
  • set print elements 0: Remove the limit of elements for GDB to print. See print setting for more detail.
  • set print repeats 0: By default, when the number of consecutive identical elements of an array exceeds a threshold, GDB prints the string “”. This command turns off this feature. Also see print setting for more detail.
  • set pagination off: When outputting a lot of information, GDB automatically pauses to avoid overwhelming the user. pagination turns this off.
  • set logging file file_to_save_data: Self explanatory.
  • set logging on: Start saving the output to the local file. Note that for a change to logging to become effective, you need to set logging off and then set logging on.

https://github.com/X-Neon/gdbplotlib/tree/master

1
2
3
python
import gdbplotlib
end

Windows10下使用Msys2编译gdb源码

STM32CubeIDE 使用GDB打印波形

  1. Visualizing Data with Eclipse, gdb and gnuplot

  2. 安装https://github.com/X-Neon/gdbplotlib/tree/master

  3. 下载工具链https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases/tag/v11.3.1-1.1/

  4. 关键程序arm-none-eabi-gdb-py3.exe,替换arm-none-eabi-gdb.exe

  5. IDE里Perferrence-STM32Cube-Toolchain Manager添加工具链

  6. 查看gdb编译参数:(gdb)show configuration

  7. To check both versions of Python, you can run the following:

    1
    2
    3
    4
    5
    6
    7
    $ gdb
    (gdb) pi
    >>> import sys; sys.version
    '3.6.9 (default, Nov 7 2019, 10:44:02) \n[GCC 8.3.0]'

    $ python --version
    Python 3.6.9
    1
    2
    $env:PYTHONHOME = "D:\ProgramData\Anaconda3\envs\gdb\bin"
    $env:PYTHONLIB = "D:\ProgramData\Anaconda3\envs\gdb\Lib"
  8. UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.

    D:\ProgramData\Anaconda3\envs\gdb\Lib\site-packages\gdbplotlib\plot.py 修改

    1
    2
    3
    4
    import gdb # pylint: disable=E0401
    import matplotlib
    matplotlib.use('TkAgg') # 大小写无所谓 tkaGg ,TkAgg 都行
    import matplotlib.pyplot as plt
  9. Exception <class ‘ImportError’>: DLL load failed while importing _tkinter:

    手动安装同版本python,复制Dlls/tcl86t.dlltk86t.dll

  10. Python Exception <class ‘_tkinter.TclError’>: Can’t find a usable init.tcl in the following directories:

    手动安装同版本python,复制tcl目录内文件和文件夹到环境目录lib

  11. ImportError: cannot import name ‘_c_internal_utils’ from partially initialized module ‘matplotlib’

NanoVNA

  1. updateFFT

综合测评

STM32学习笔记(二)

https://www.shjdgwj.cn/f1efcaad48a7/

作者

GWJ

发布于

2023-03-17

更新于

2023-09-10

许可协议

评论