STM32学习笔记(二)
常见问题
-
MX_DMA_Init()
应放在MX_ADCx_Init()
前面 -
AD9910 康威的模块,二极管压降0.8v,DC5V供电,ams1117-3.3输入只有4.2v,输出3v不够。同时需要注意ad9910需要电流较大 5V 0.3A+。
-
串口重定向
Keil工程迁移至STM32CubeIDE,Keil转cubeide,超详细图文教程
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 */ -
SDK配置
Lib/include
要同时添加到C和汇编的引用配置中或者使用Export Settings把原来的工程设置导入
常用代码
DMA-TIM-GPIO 读取AD9220
1 |
|
定时器触发ADC
FFT
Define USE_HAL_DRIVER,STM32H743xx,ARM_MATH_LOOPUNROLL,
1 |
|
基于信噪比的自适应阈值峰值检测算法代码
1 |
|
这段代码求噪声功率不太对,应该对对整个信号或信号中某些不包含所关心信号成分的时间段进行平方和求和来估计噪声功率。
这个chatgpt给的算法,应该是判断时域波形有没有信号。
频域特征指标
有量纲特征值8个——最大值、最小值、峰峰值、均值、方差、标准差、均方值、均方根值(RMS)
无量纲特征值6个——峭度、偏度、波形因子、峰值因子、脉冲因子、裕度因子
频域特征值5个——重心频率、均方频率、均方根频率、频率方差、频率标准差
谱峭度特征4个——谱峭度的均值、谱峭度的标准差、谱峭度的偏度、谱峭度的峭度
希尔伯特谱、边际谱、包络谱、瞬时频率/幅值/相位——Hilbert分析衍生方法及MATLAB实现
希尔伯特谱、边际谱、包络谱、瞬时频率/幅值/相位——Hilbert分析衍生方法及MATLAB实现
类EMD的“信号分解方法”及MATLAB实现(第一篇)——EEMD
类EMD的“信号分解方法”及MATLAB实现(第二篇)——CEEMD
FFT
https://max.book118.com/html/2017/0108/81419544.shtm 四项五阶窗校正
FFT移植
-
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
外设
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
- STM32-CubeMx-HAL库-串口空闲中断+DMA——利用HAL_UARTEx_ReceiveToIdle_DMA实现不定长数据接收
- HK32F103C8T6串口DMA接收不定长数据HAL库
- STM32 UART DMA RX and TX
- LwRB 使用说明
SPI
-
驱动ADS8688
HMI串口屏
-
使用Nextion库
按键解锁 ok页面添加
1
2
3
4
5
6
7
8
9
10if(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
}
项目
- GitHub - jasongzy/impedometer: 基于 STM32 的阻抗测量仪 ad9910 ad8301阻抗测量 hmi屏
- Nextion-Hmi-Library-for-STM32-Platform
- Nextion_STM32_Library
STM32CubeIDE
-
Configuring DSP libraries on STM32CubeIDE
1
2
3
4
5ARM_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”
开始使用库中的函数
-
报错 “Error Downloading the following files: crdb_full.zip (Cannot unzipped)”
使用管理员权限打开CubeIDE
-
虚拟串口 ITM
-
主题插件 https://marketplace.eclipse.org/content/darkest-dark-theme
-
如果发现某些快捷键失效,检查是不是被搜狗输入法占用了
-
在keilhttps://so.csdn.net/so/search?q=keil&spm=1001.2101.3001.7020中不复位调试MCU
-
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文件夹猜测是以下文件夹之一
- org.eclipse.e4.ui.workbench.swt
- org.eclipse.ui.editors
- org.eclipse.ui.workbench
- org.eclipse.ui.workbench.texteditor
-
语言包 https://download.eclipse.org/technology/babel/update-site/latest/
只需要安装Babel Language Pack for eclipse in Chinese (Simplified)
-
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变量中只包含这些特殊的文件。最终生成的静态库只编译一次这些文件。 -
Window—>Preferences—>C/C++—>Task Tags 添加HACK
TODO:英语翻译为待办事项,备忘录。如果代码中有该标识,说明在标识处有功能代码待编写,待实现的功能在说明中会简略说明。
FIXME:可以拆成短语,fix me ,意为修理我。如果代码中有该标识,说明标识处代码需要修正,甚至代码是错误的,不能工作,需要修复,如何修正会在说明中简略说明。
XXX:如果代码中有该标识,说明标识处代码虽然实现了功能,但是实现的方法有待商榷,希望将来能改进,要改进的地方会在说明中简略说明。
HACK:英语翻译为砍。如果代码中有该标识,说明标识处代码我们需要根据自己的需求去调整程序代码。
其他
-
安装在
D:\Keil_v5\ARM
下 -
1
2CFLAGS+= -ffunction-sections -fdata-sections
LFLAGS+=-Wl,--gc-sections -
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模拟对话
- ATE引脚电子器件的电平设置DAC校准
- 解密RF信号链:特性和性能指标
- AN-581: 单电源应用中的偏置和去耦运算放大器 (Rev. 0)
- 阻容感测量 Estimating the Impedance and Admittance of Capacitive and Inductive Devices
- 保护ADC输入
赛前预警
-
inuclde path 和 source path都要配置,在main文件添加include和bsp_handler
Source/**/arm_**
-
hmi 工程默认baud 9600 ,删除上电输出;要被修改的键盘,文本设置为全局,显示中文要用utf-8
-
cubemx生成dma handle变量要extern
extern DMA_HandleTypeDef hdma_tim2_ch2;
-
发现编译错误时,检查是否是Toolchain的问题
-
开关类切信号 加延时
-
AD9959 50欧输出,经过隔直, 接高阻输入OPA1612 10Gain 会有直流产生,添加50,100k到底解决。怀疑是运放输入失调电流给电容充电,导致产生电压
STM32 VS Code Extension
-
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 |
|
GDB: Printing Variables to File
1 |
|
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 tologging
to become effective, you need toset logging off
and thenset logging on
.
https://github.com/X-Neon/gdbplotlib/tree/master
1 |
|
STM32CubeIDE 使用GDB打印波形
-
下载工具链https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases/tag/v11.3.1-1.1/
-
关键程序
arm-none-eabi-gdb-py3.exe
,替换arm-none-eabi-gdb.exe
-
IDE里Perferrence-STM32Cube-Toolchain Manager添加工具链
-
查看gdb编译参数:
(gdb)show configuration
-
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.91
2$env:PYTHONHOME = "D:\ProgramData\Anaconda3\envs\gdb\bin"
$env:PYTHONLIB = "D:\ProgramData\Anaconda3\envs\gdb\Lib" -
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
4import gdb # pylint: disable=E0401
import matplotlib
matplotlib.use('TkAgg') # 大小写无所谓 tkaGg ,TkAgg 都行
import matplotlib.pyplot as plt -
Exception <class ‘ImportError’>: DLL load failed while importing _tkinter:
手动安装同版本python,复制
Dlls/tcl86t.dll
和tk86t.dll
-
Python Exception <class ‘_tkinter.TclError’>: Can’t find a usable init.tcl in the following directories:
手动安装同版本python,复制
tcl
目录内文件和文件夹到环境目录lib
下 -
ImportError: cannot import name ‘_c_internal_utils’ from partially initialized module ‘matplotlib’
NanoVNA
- updateFFT
综合测评
STM32学习笔记(二)