完整版教程下载地址: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 初学者重要提示

  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逆变换(支持单精度和双精度)

实验目的:

  1. 学习实数浮点FFT逆变换,支持单精度浮点和双精度浮点

实验内容:

  1. 启动一个自动重装软件定时器,每100ms翻转一次LED2。
  2. 按下按键K1,串口打印1024点实数单精度FFT逆变换。
  3. 按下按键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逆变换(支持单精度和双精度)

实验目的:

  1. 学习实数浮点FFT逆变换,支持单精度浮点和双精度浮点

实验内容:

  1. 启动一个自动重装软件定时器,每100ms翻转一次LED2。
  2. 按下按键K1,串口打印1024点实数单精度FFT逆变换。
  3. 按下按键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的逆变换(支持单精度和双精度)相关推荐

  1. 【STM32F407的DSP教程】第31章 STM32F407实数浮点FFT(支持单精度和双精度)

    完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第31章       STM32F407实数浮点FFT(支持 ...

  2. 【STM32F429的DSP教程】第31章 STM32F429实数浮点FFT(支持单精度和双精度)

    完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 完整版教程下载地址:http://www.armbbs.cn ...

  3. 【第3版emWin教程】第32章 emWin6.x的矢量字体(支持汉字全字库,Unicode编码,QSPI Flash方案)

    教程不断更新中:http://www.armbbs.cn/forum.php?mod=viewthread&tid=98429 第32章       emWin6.x的矢量字体(支持汉字全字库 ...

  4. 【STM32H7的DSP教程】第50章 STM32H7的样条插补实现,波形拟合丝滑顺畅

    完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第50章       STM32H7的样条插补实现,波形拟合 ...

  5. 【STM32H7的DSP教程】第38章 STM32H7的FIR高通滤波器实现(支持逐个数据的实时滤波)

    完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第38章       STM32H7的FIR高通滤波器实现( ...

  6. 【STM32H7的DSP教程】第11章 DSP基础函数-绝对值,求和,乘法和点乘

    完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第11章       DSP基础函数-绝对值,求和,乘法和点 ...

  7. stm32h7高速通信_【STM32H7教程】第48章 STM32H7的FMC总线应用之是32路高速IO扩展

    第48章       STM32H7的FMC总线应用之是32路高速IO扩展 本章教程为大家讲解利用STM32H7的FMC总线扩展出32路高速IO,且使用简单,实际项目中也比较有实用价值. 48.1 初 ...

  8. 【STM32H7教程】第76章 STM32H7的FMC总线应用之驱动AD7606(8通道同步采样, 16bit, 正负10V)

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第76章       STM32H7的FMC总线应用之驱动AD ...

  9. stm32h7高速通信_【STM32H7教程】第75章 STM32H7的SPI总线应用之驱动DAC8501(双路输出,16bit分辨率,0-5V)...

    第75章       STM32H7的SPI总线应用之驱动DAC8501(双路输出,16bit分辨率,0-5V) 本章节为大家讲解标准SPI接线方式驱动模数转换器DAC8501,制作了中断和DMA两种 ...

最新文章

  1. Linux进程描述符task_struct结构体简析
  2. 怎么用python打印照片_[宜配屋]听图阁
  3. RadioButton 自定义控件
  4. Your shell has not been properly configured to use 'conda activate'
  5. 性能提升一个数量级,大杀器来了!| 文内福利
  6. 扬长避短使用Windbg和Visual Studio高效调试调试你的代码
  7. Flutter中ListView动画OpenContainer动画Flutter径向过渡OpenContainer
  8. 论述计算机硬件结构的理解论文,论述对汇编语言教学内容和方法及特点的认识与思考...
  9. TensorFlow AlexNet
  10. 假如买彩票中了100万怎样安全地把钱领回来?
  11. 计算机技术在音乐专业中的应用与探索,计算机技术在音乐教学中的应用与研究...
  12. 2022 年面试工具篇 Jmeter 接口面试题及答案
  13. 计算机情绪识别属于什么方向,情绪检测器
  14. Matlab论文插图绘制模板第46期—帕累托图(Pareto)
  15. 冒死推荐一些值得推荐的 Java 练手项目
  16. java word文本框_Java 读取Word文本框中的文本、图片、表格
  17. android设备内部添加apn信息
  18. 大数据Hadoop、Hive、Kafka、Hbase、Spark等框架面经
  19. 软件测试职业发展三步曲之一
  20. 搜索引擎常用site语法baidu/google

热门文章

  1. Amazon报告-管理库存报告(FBA Manage Inventory)
  2. 蓝牙+语音系列产品分类
  3. 解决H5播放视频黑屏只有声音没有图像的问题,Java调用ffmpeg转码成h264的mp4格式
  4. 利用ADS、HFSS设计微带带通滤波器的设计日志
  5. GEE学习笔记-基本数据类型
  6. 基于JavaEE的“三味”书屋网上售书系统
  7. 小学计算机社团活动简报,多彩社团活动,幸福校园生活——单集镇新河小学开展社团活动简讯...
  8. Capacitor Plugin 实现
  9. Java中是值传递和引用传递
  10. 多功能起名查重工具微信小程序源码