【STM32H7的DSP教程】第32章 STM32H7的实数FFT的逆变换(支持单精度和双精度)
完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547
第32章 STM32H7的实数FFT的逆变换(支持单精度和双精度)
本章主要讲解实数FFT的逆变换实现。通过FFT变换将波形从时域转换到频域,通过IFFT逆变换实现从频域到时域变换。
通过本章为大家展示一个波形FFT变换,然后IFFT还原波形。
目录
32.1 初学者重要提示
32.2 利用FFT库实现IFFT的思路
32.3 Matlab实现FFT正变换和逆变换
32.4 单精度函数arm_rfft_fast_f32实现FFT正变换和逆变换
32.4.1 函数说明
32.4.2 使用举例
32.5 双精度函数arm_rfft_fast_f64实现FFT正变换和逆变换
32.5.1 函数说明
32.5.2 使用举例
32.6 实验例程说明(MDK)
32.7 实验例程说明(IAR)
32.8 总结
32.1 初学者重要提示
- STM32H7支持硬件单精度浮点和硬件双精度浮点,计算FFT正变换和逆变换速度都会非常快。而STM32F4仅支持硬件单精度浮点。
32.2 利用FFT库实现IFFT的思路
如果希望直接调用FFT程序计算IFFT,可以用下面的方法:
对上式两边同时去共轭,得:
简单的说就是先对原始信号做FFT变换,然后对转换结果取共轭,再次带到FFT中计算,并将结果再次取共轭就可以实现IFFT。
32.3 Matlab实现FFT正变换和逆变换
根据上面小节的实现思路,我们在Matlab上面做一个验证,验证代码如下:
Fs = 1024; % 采样率
N = 1024; % 采样点数
n = 0:N-1; % 采样序列
t = 0:1/Fs:1-1/Fs; % 时间序列
f = n * Fs / N; %真实的频率x = 1.5*sin(2*pi*20*t+pi/3) ; %原始信号
y = fft(x, N); %对原始信号做FFT变换
z = conj(y); %对转换结果取共轭subplot(2,1,2);
z = fft(z, N); %再次做FFT
k = conj(z); %对转换结果去共轭
plot(f, real(k)); %绘制转换后的波形
title('IFFT转换后的波形');subplot(2,1,1);
plot(f, x); %绘制原始波形
title('原始波形');
Matab的运行结果如下:
从上面的转换结果看,两个波形信号基本是一致的。
32.4 单精度函数arm_rfft_fast_f32实现FFT正变换和逆变换
32.4.1 函数说明
函数原型:
void arm_rfft_fast_f32(
const arm_rfft_fast_instance_f32 * S,
float32_t * p,
float32_t * pOut,
uint8_t ifftFlag)
函数描述:
这个函数用于单精度浮点实数FFT。
函数参数:
- 第1个参数是封装好的浮点FFT例化,需要用户先调用函数arm_rfft_fast_init_f32初始化,然后供此函数arm_rfft_fast_f32调用。支持32, 64, 128, 256, 512, 1024, 2048, 4096点FFT。
比如做1024点FFT,代码如下:
arm_rfft_fast_instance_f32 S;
arm_rfft_fast_init_f32(&S, 1024);
arm_rfft_fast_f32(&S, testInput_f32, testOutput_f32, ifftFlag);
- 第2个参数是实数地址,比如我们要做1024点实数FFT,要保证有1024个缓冲。
- 第3个参数是FFT转换结果,转换结果不是实数了,而是复数,按照实部,虚拟,实部,虚部,依次排列。比如做1024点FFT,这里的输出也会有1024个数据,即512个复位。
- 第4个参数用于设置正变换和逆变换,ifftFlag=0表示正变换,ifftFlag=1表示逆变换。
32.4.2 使用举例
下面通过函数arm_rfft_fast_f32将正弦波做FFT变换,并再次通过函数arm_rfft_fast_f32做FFT逆变换来比较原始波形和转换后波形效果。
/*
*********************************************************************************************************
* 函 数 名: arm_rfft_f32_app
* 功能说明: 调用函数arm_rfft_fast_f32计算幅频和相频
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
static void arm_rfft_f32_app(void)
{uint16_t i;arm_rfft_fast_instance_f32 S;/* 正变换 */ifftFlag = 0; /* 初始化结构体S中的参数 */arm_rfft_fast_init_f32(&S, TEST_LENGTH_SAMPLES);for(i=0; i<1024; i++){/* 波形是由直流分量,50Hz正弦波组成,波形采样率1024,初始相位60° */testInput_f32[i] = 1 + cos(2*3.1415926f*50*i/1024 + 3.1415926f/3);}/* 1024点实序列快速FFT */ arm_rfft_fast_f32(&S, testInput_f32, testOutput_f32, ifftFlag);/* 为了方便跟函数arm_cfft_f32计算的结果做对比,这里求解了1024组模值,实际函数arm_rfft_fast_f32只求解出了512组 */ arm_cmplx_mag_f32(testOutput_f32, testOutputMag_f32, TEST_LENGTH_SAMPLES);printf("=========================================\r\n"); /* 求相频 */PowerPhaseRadians_f32(testOutput_f32, Phase_f32, TEST_LENGTH_SAMPLES, 0.5f);/* 串口打印求解的幅频和相频 */for(i=0; i<TEST_LENGTH_SAMPLES; i++){printf("%f, %f\r\n", testOutputMag_f32[i], Phase_f32[i]);}
}
运行函数arm_rfft_f32_app可以通过串口打印原始波形和还原后波形效果:
从上面的对比结果中可以看出原始波形和还原后的波形是一致的。
32.5 双精度函数arm_rfft_fast_f64实现FFT正变换和逆变换
32.5.1 函数说明
函数原型:
void arm_rfft_fast_f64(
arm_rfft_fast_instance_f64 * S,
float64_t * p,
float64_t * pOut,
uint8_t ifftFlag)
函数描述:
这个函数用于双精度浮点实数FFT。
函数参数:
- 第1个参数是封装好的浮点FFT例化,需要用户先调用函数arm_rfft_fast_init_f64初始化,然后供此函数arm_rfft_fast_f64调用。支持32, 64, 128, 256, 512, 1024, 2048, 4096点FFT。
比如做1024点FFT,代码如下:
arm_rfft_fast_instance_f64 S;
arm_rfft_fast_init_f64(&S, 1024);
arm_rfft_fast_f64(&S, testInput_f64, testOutput_f64, ifftFlag);
- 第2个参数是实数地址,比如我们要做1024点实数FFT,要保证有1024个缓冲。
- 第3个参数是FFT转换结果,转换结果不是实数了,而是复数,按照实部,虚拟,实部,虚部,依次排列。比如做1024点FFT,这里的输出也会有1024个数据,即512个复位。
- 第4个参数用于设置正变换和逆变换,ifftFlag=0表示正变换,ifftFlag=1表示逆变换。
32.5.2 使用举例
下面通过函数arm_rfft_fast_f64将正弦波做FFT变换,并再次通过函数arm_rfft_fast_f64做FFT逆变换来比较原始波形和转换后波形效果:
/*
*********************************************************************************************************
* 函 数 名: arm_rfft_f64_app
* 功能说明: 调用函数arm_rfft_fast_f64计算FFT逆变换和正变换
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
static void arm_rfft_f64_app(void)
{uint16_t i;arm_rfft_fast_instance_f64 S;/* 正变换 */ifftFlag = 0; /* 初始化结构体S中的参数 */arm_rfft_fast_init_f64(&S, TEST_LENGTH_SAMPLES);for(i=0; i<1024; i++){/* 波形是由直流分量,50Hz正弦波组成,波形采样率1024,初始相位60° */testInput_f64[i] = 1 + cos(2*3.1415926*50*i/1024 + 3.1415926/3);testOutputIn_f64[i] = testInput_f64[i];}/* 1024点实序列快速FFT, testInput_f64是输入数据,testOutput_f64是输出 */ arm_rfft_fast_f64(&S, testInput_f64, testOutput_f64, ifftFlag);/* 逆变换 */ifftFlag = 1; /* 1024点实序列快速FFT逆变换,testOutput_f64是输入数据,testInput_f64是输出数据 */ arm_rfft_fast_f64(&S, testOutput_f64, testInput_f64, ifftFlag);printf("=========================================\r\n"); /* 串口打印,testOutputIn_f32原始信号,testInput_f32逆变换后的信号 */for(i=0; i<TEST_LENGTH_SAMPLES; i++){printf("%.11f, %.11f\r\n", testOutputIn_f64[i], testInput_f64[i]);} }
运行函数arm_rfft_f64_app可以通过串口打印原始波形和还原后波形效果:
从上面的对比结果中可以看出原始波形和还原后的波形是一致的。
32.6 实验例程说明(MDK)
配套例子:
V7-222_实数浮点FFT逆变换(支持单精度和双精度)
实验目的:
- 学习实数浮点FFT逆变换,支持单精度浮点和双精度浮点
实验内容:
- 启动一个自动重装软件定时器,每100ms翻转一次LED2。
- 按下按键K1,串口打印1024点实数单精度FFT逆变换。
- 按下按键K2,串口打印1024点实数双精度FFT逆变换。
使用AC6注意事项
特别注意附件章节C的问题
上电后串口打印的信息:
波特率 115200,数据位 8,奇偶校验位无,停止位 1。
RTT方式打印信息:
程序设计:
系统栈大小分配:
RAM空间用的DTCM:
硬件外设初始化
硬件外设的初始化是在 bsp.c 文件实现:
/*
*********************************************************************************************************
* 函 数 名: bsp_Init
* 功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_Init(void)
{/* 配置MPU */MPU_Config();/* 使能L1 Cache */CPU_CACHE_Enable();/* STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:- 调用函数HAL_InitTick,初始化滴答时钟中断1ms。- 设置NVIC优先级分组为4。*/HAL_Init();/* 配置系统时钟到400MHz- 切换使用HSE。- 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。*/SystemClock_Config();/* Event Recorder:- 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。- 默认不开启,如果要使能此选项,务必看V7开发板用户手册第8章*/
#if Enable_EventRecorder == 1 /* 初始化EventRecorder并开启 */EventRecorderInitialize(EventRecordAll, 1U);EventRecorderStart();
#endifbsp_InitKey(); /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */bsp_InitTimer(); /* 初始化滴答定时器 */bsp_InitUart(); /* 初始化串口 */bsp_InitExtIO(); /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */ bsp_InitLed(); /* 初始化LED */
}
MPU配置和Cache配置:
数据Cache和指令Cache都开启。配置了AXI SRAM区(本例子未用到AXI SRAM),FMC的扩展IO区。
/*
*********************************************************************************************************
* 函 数 名: MPU_Config
* 功能说明: 配置MPU
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void MPU_Config( void )
{MPU_Region_InitTypeDef MPU_InitStruct;/* 禁止 MPU */HAL_MPU_Disable();/* 配置AXI SRAM的MPU属性为Write back, Read allocate,Write allocate */MPU_InitStruct.Enable = MPU_REGION_ENABLE;MPU_InitStruct.BaseAddress = 0x24000000;MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;MPU_InitStruct.Number = MPU_REGION_NUMBER0;MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;MPU_InitStruct.SubRegionDisable = 0x00;MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;HAL_MPU_ConfigRegion(&MPU_InitStruct);/* 配置FMC扩展IO的MPU属性为Device或者Strongly Ordered */MPU_InitStruct.Enable = MPU_REGION_ENABLE;MPU_InitStruct.BaseAddress = 0x60000000;MPU_InitStruct.Size = ARM_MPU_REGION_SIZE_64KB; MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE; MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;MPU_InitStruct.Number = MPU_REGION_NUMBER1;MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;MPU_InitStruct.SubRegionDisable = 0x00;MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;HAL_MPU_ConfigRegion(&MPU_InitStruct);/*使能 MPU */HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}/*
*********************************************************************************************************
* 函 数 名: CPU_CACHE_Enable
* 功能说明: 使能L1 Cache
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void CPU_CACHE_Enable(void)
{/* 使能 I-Cache */SCB_EnableICache();/* 使能 D-Cache */SCB_EnableDCache();
}
主功能:
主程序实现如下操作:
- 启动一个自动重装软件定时器,每100ms翻转一次LED2。
- 按下按键K1,串口打印1024点实数单精度FFT逆变换。
- 按下按键K2,串口打印1024点实数双精度FFT逆变换。
/*
*********************************************************************************************************
* 函 数 名: main
* 功能说明: c程序入口
* 形 参: 无
* 返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
int main(void)
{uint8_t ucKeyCode; /* 按键代码 */bsp_Init(); /* 硬件初始化 */PrintfLogo(); /* 打印例程信息到串口1 */PrintfHelp(); /* 打印操作提示信息 */bsp_StartAutoTimer(0, 100); /* 启动1个100ms的自动重装的定时器 *//* 进入主程序循环体 */while (1){bsp_Idle(); /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */if (bsp_CheckTimer(0)) /* 判断定时器超时时间 */{/* 每隔100ms 进来一次 */bsp_LedToggle(4); /* 翻转LED2的状态 */ }ucKeyCode = bsp_GetKey(); /* 读取键值, 无键按下时返回 KEY_NONE = 0 */if (ucKeyCode != KEY_NONE){switch (ucKeyCode){case KEY_DOWN_K1: /* K1键按下 */arm_rfft_f32_app();break;case KEY_DOWN_K2: /* K2键按下 */arm_rfft_f64_app();break;default:/* 其它的键值不处理 */break;}}}
}
32.7 实验例程说明(IAR)
配套例子:
V7-222_实数浮点FFT逆变换(支持单精度和双精度)
实验目的:
- 学习实数浮点FFT逆变换,支持单精度浮点和双精度浮点
实验内容:
- 启动一个自动重装软件定时器,每100ms翻转一次LED2。
- 按下按键K1,串口打印1024点实数单精度FFT逆变换。
- 按下按键K2,串口打印1024点实数双精度FFT逆变换。
上电后串口打印的信息:
波特率 115200,数据位 8,奇偶校验位无,停止位 1。
RTT方式打印信息:
程序设计:
系统栈大小分配:
RAM空间用的DTCM:
硬件外设初始化
硬件外设的初始化是在 bsp.c 文件实现:
/*
*********************************************************************************************************
* 函 数 名: bsp_Init
* 功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_Init(void)
{/* 配置MPU */MPU_Config();/* 使能L1 Cache */CPU_CACHE_Enable();/* STM32H7xx HAL 库初始化,此时系统用的还是H7自带的64MHz,HSI时钟:- 调用函数HAL_InitTick,初始化滴答时钟中断1ms。- 设置NVIC优先级分组为4。*/HAL_Init();/* 配置系统时钟到400MHz- 切换使用HSE。- 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。*/SystemClock_Config();/* Event Recorder:- 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。- 默认不开启,如果要使能此选项,务必看V7开发板用户手册第8章*/
#if Enable_EventRecorder == 1 /* 初始化EventRecorder并开启 */EventRecorderInitialize(EventRecordAll, 1U);EventRecorderStart();
#endifbsp_InitKey(); /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */bsp_InitTimer(); /* 初始化滴答定时器 */bsp_InitUart(); /* 初始化串口 */bsp_InitExtIO(); /* 初始化FMC总线74HC574扩展IO. 必须在 bsp_InitLed()前执行 */ bsp_InitLed(); /* 初始化LED */
}
MPU配置和Cache配置:
数据Cache和指令Cache都开启。配置了AXI SRAM区(本例子未用到AXI SRAM),FMC的扩展IO区。
/*
*********************************************************************************************************
* 函 数 名: MPU_Config
* 功能说明: 配置MPU
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void MPU_Config( void )
{MPU_Region_InitTypeDef MPU_InitStruct;/* 禁止 MPU */HAL_MPU_Disable();/* 配置AXI SRAM的MPU属性为Write back, Read allocate,Write allocate */MPU_InitStruct.Enable = MPU_REGION_ENABLE;MPU_InitStruct.BaseAddress = 0x24000000;MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;MPU_InitStruct.Number = MPU_REGION_NUMBER0;MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;MPU_InitStruct.SubRegionDisable = 0x00;MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;HAL_MPU_ConfigRegion(&MPU_InitStruct);/* 配置FMC扩展IO的MPU属性为Device或者Strongly Ordered */MPU_InitStruct.Enable = MPU_REGION_ENABLE;MPU_InitStruct.BaseAddress = 0x60000000;MPU_InitStruct.Size = ARM_MPU_REGION_SIZE_64KB; MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE; MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;MPU_InitStruct.Number = MPU_REGION_NUMBER1;MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;MPU_InitStruct.SubRegionDisable = 0x00;MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;HAL_MPU_ConfigRegion(&MPU_InitStruct);/*使能 MPU */HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}/*
*********************************************************************************************************
* 函 数 名: CPU_CACHE_Enable
* 功能说明: 使能L1 Cache
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void CPU_CACHE_Enable(void)
{/* 使能 I-Cache */SCB_EnableICache();/* 使能 D-Cache */SCB_EnableDCache();
}
主功能:
主程序实现如下操作:
- 启动一个自动重装软件定时器,每100ms翻转一次LED2。
- 按下按键K1,串口打印1024点实数单精度FFT逆变换。
- 按下按键K2,串口打印1024点实数双精度FFT逆变换。
/*
*********************************************************************************************************
* 函 数 名: main
* 功能说明: c程序入口
* 形 参: 无
* 返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
int main(void)
{uint8_t ucKeyCode; /* 按键代码 */bsp_Init(); /* 硬件初始化 */PrintfLogo(); /* 打印例程信息到串口1 */PrintfHelp(); /* 打印操作提示信息 */bsp_StartAutoTimer(0, 100); /* 启动1个100ms的自动重装的定时器 *//* 进入主程序循环体 */while (1){bsp_Idle(); /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */if (bsp_CheckTimer(0)) /* 判断定时器超时时间 */{/* 每隔100ms 进来一次 */bsp_LedToggle(4); /* 翻转LED2的状态 */ }ucKeyCode = bsp_GetKey(); /* 读取键值, 无键按下时返回 KEY_NONE = 0 */if (ucKeyCode != KEY_NONE){switch (ucKeyCode){case KEY_DOWN_K1: /* K1键按下 */arm_rfft_f32_app();break;case KEY_DOWN_K2: /* K2键按下 */arm_rfft_f64_app();break;default:/* 其它的键值不处理 */break;}}}
}
32.8 总结
本章节主要验证了函数arm_rfft_fast_f32正变换和逆变换,有兴趣的可以验证Q31和Q15两种数据类型的正变换和逆变换。
【STM32H7的DSP教程】第32章 STM32H7的实数FFT的逆变换(支持单精度和双精度)相关推荐
- 【STM32F407的DSP教程】第31章 STM32F407实数浮点FFT(支持单精度和双精度)
完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第31章 STM32F407实数浮点FFT(支持 ...
- 【STM32F429的DSP教程】第31章 STM32F429实数浮点FFT(支持单精度和双精度)
完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 完整版教程下载地址:http://www.armbbs.cn ...
- 【第3版emWin教程】第32章 emWin6.x的矢量字体(支持汉字全字库,Unicode编码,QSPI Flash方案)
教程不断更新中:http://www.armbbs.cn/forum.php?mod=viewthread&tid=98429 第32章 emWin6.x的矢量字体(支持汉字全字库 ...
- 【STM32H7的DSP教程】第50章 STM32H7的样条插补实现,波形拟合丝滑顺畅
完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第50章 STM32H7的样条插补实现,波形拟合 ...
- 【STM32H7的DSP教程】第38章 STM32H7的FIR高通滤波器实现(支持逐个数据的实时滤波)
完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第38章 STM32H7的FIR高通滤波器实现( ...
- 【STM32H7的DSP教程】第11章 DSP基础函数-绝对值,求和,乘法和点乘
完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第11章 DSP基础函数-绝对值,求和,乘法和点 ...
- stm32h7高速通信_【STM32H7教程】第48章 STM32H7的FMC总线应用之是32路高速IO扩展
第48章 STM32H7的FMC总线应用之是32路高速IO扩展 本章教程为大家讲解利用STM32H7的FMC总线扩展出32路高速IO,且使用简单,实际项目中也比较有实用价值. 48.1 初 ...
- 【STM32H7教程】第76章 STM32H7的FMC总线应用之驱动AD7606(8通道同步采样, 16bit, 正负10V)
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第76章 STM32H7的FMC总线应用之驱动AD ...
- stm32h7高速通信_【STM32H7教程】第75章 STM32H7的SPI总线应用之驱动DAC8501(双路输出,16bit分辨率,0-5V)...
第75章 STM32H7的SPI总线应用之驱动DAC8501(双路输出,16bit分辨率,0-5V) 本章节为大家讲解标准SPI接线方式驱动模数转换器DAC8501,制作了中断和DMA两种 ...
最新文章
- Linux进程描述符task_struct结构体简析
- 怎么用python打印照片_[宜配屋]听图阁
- RadioButton 自定义控件
- Your shell has not been properly configured to use 'conda activate'
- 性能提升一个数量级,大杀器来了!| 文内福利
- 扬长避短使用Windbg和Visual Studio高效调试调试你的代码
- Flutter中ListView动画OpenContainer动画Flutter径向过渡OpenContainer
- 论述计算机硬件结构的理解论文,论述对汇编语言教学内容和方法及特点的认识与思考...
- TensorFlow AlexNet
- 假如买彩票中了100万怎样安全地把钱领回来?
- 计算机技术在音乐专业中的应用与探索,计算机技术在音乐教学中的应用与研究...
- 2022 年面试工具篇 Jmeter 接口面试题及答案
- 计算机情绪识别属于什么方向,情绪检测器
- Matlab论文插图绘制模板第46期—帕累托图(Pareto)
- 冒死推荐一些值得推荐的 Java 练手项目
- java word文本框_Java 读取Word文本框中的文本、图片、表格
- android设备内部添加apn信息
- 大数据Hadoop、Hive、Kafka、Hbase、Spark等框架面经
- 软件测试职业发展三步曲之一
- 搜索引擎常用site语法baidu/google
热门文章
- Amazon报告-管理库存报告(FBA Manage Inventory)
- 蓝牙+语音系列产品分类
- 解决H5播放视频黑屏只有声音没有图像的问题,Java调用ffmpeg转码成h264的mp4格式
- 利用ADS、HFSS设计微带带通滤波器的设计日志
- GEE学习笔记-基本数据类型
- 基于JavaEE的“三味”书屋网上售书系统
- 小学计算机社团活动简报,多彩社团活动,幸福校园生活——单集镇新河小学开展社团活动简讯...
- Capacitor Plugin 实现
- Java中是值传递和引用传递
- 多功能起名查重工具微信小程序源码