| **银杏科技有限公司旗下技术文档发布平台** |||| |技术支持电话|**0379-69926675-801**||| |技术支持邮件|Gingko@vip.163.com||| ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | V1.0 | 2020-12-03 | gingko | 初次建立 | \\ \\ ===== STM32CubeMX教程四十五——DSP_MATH实验 ===== 1.在主界面选择File-->New Project或者直接点击ACCEE TO MCU SELECTOR {{ :icore3l:icore3l_cube_49_1.png?direct |}} 2.出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置在搜索栏的下面,提供的各种查找方式,可以选择芯片内核,型号等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32F429IGHx。 {{ :icore3l:icore3l_cube_49_2.png?direct |}} 3.配置RCC,使用外部时钟源 {{ :icore3l:icore3l_cube_49_3.png?direct |}} 4.调试选择Serial Wire,时基源选择SysTick {{ :icore3l:icore3l_cube_49_4.png?direct |}} {{ :icore3l:icore3l_cube_49_5.png?direct |}} 5.将PI3,PI4,PH14设置为GPIO_Output {{ :icore3l:icore3l_cube_49_6.png?direct |}} 引脚模式配置 {{ :icore3l:icore3l_cube_49_7.png?direct |}} 6.设置串口 {{ :icore3l:icore3l_cube_49_8.png?direct |}} 7.时钟源设置,选择外部高速时钟源,配置为最大主频 {{ :icore3l:icore3l_cube_49_9.png?direct |}} 8.工程文件的设置, 这里就是工程的各种配置我们只用到有限几个,其他的默认即可IDE我们使用的是MDK V5.27 {{ :icore3l:icore3l_cube_49_10.png?direct |}} 9.点击Code Generator,进行进一步配置 {{ :icore3l:icore3l_cube_49_11.png?direct |}} * **Copy all used libraries into the project folder** * 将HAL库的所有.C和.H都复制到所建工程中 * 优点:这样如果后续需要新增其他外设又可能不再用STM32CubeMX的时候便会很方便 * 缺点:体积大,编译时间很长 * **Copy only the necessary library files** * 只复制所需要的.C和.H(推荐) * 优点:体积相对小,编译时间短,并且工程可复制拷贝 * 缺点:新增外设时需要重新用STM32CubeMX导入 * **Add necessary library files as reference in the toolchain project configuration file** * 不复制文件,直接从软件包存放位置导入.C和.H * 优点:体积小,比较节约硬盘空间 * 缺点:复制到其他电脑上或者软件包位置改变,就需要修改相对应的路径 * 自行选择方式即可 10.然后点击GENERATE CODE创建工程 {{ :icore3l:icore3l_cube_49_12.png?direct |}} 创建成功,打开工程。 \\ \\ \\ \\ ===== 实验四十五:DSP——MATH实验 ===== ==== 一、实验目的与意义 ==== - 了解STM32 DSP结构 - 了解STM32 DSP特征 - 掌握DSP原理 - 掌握STM32 HAL库中DSP属性的配置方法 - 掌握KEIL MDK集成开发环境使用方法 ==== 二、实验设备及平台 ==== - iCore3L 双核心板 - JLINK(或相同功能)仿真器 - Micro USB线缆 - Keil MDK 开发平台 - STM32CubeMX开发平台 - 装有WIN XP(及更高版本)系统的计算机 ==== 三、实验原理 ==== === 1.FPU简介 === * STM32F4xx属于Cortex M4架构,带有32位的单精度硬件FPU(Float Point Unit),支持浮点指令集,相对比M0和M3架构,浮点运算性能高出数十倍甚至上百倍。CortexM4 FPU是ARM FPv4-SP单精度FPU一种实现形式。 === 2.DSP库的使用 === * STM32F4的Cortex-M4内核不仅内置硬件FPU单元,还支持DSP多种指令集,比如支持单周期乘加指令(MAC)、优化的单指令多数据指令(SIMD)等。因此Cortex-M4执行所有的DSP指令集都可以在单周期内完成,而Cortex-M3和M0需要多个指令和多个周期才能完成同样的功能。比如开方运算,M3和M0只能通过迭代法(标准数学函数库)计算,而M4直接调用VSQRT指令完成 (1)获取DSP库 * ST官方提供了一整套的DSP库方便我们开发使用。在ST提供的标准库:stm32f4_dsp_stdperiph_lib.zip里面就有(该文件可以从ST官网上下载:http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1743/PF257901下载,文件名:STSW-STM32065)。下载解压缩之后,在目录STM32F4xx_DSP_StdPeriph_Lib_V1.8.0→Libraries→CMSIS→DSP_Lib下可以找到DSP库文件和测试实例。Sourse中是所有DSP库文件源代码,Examples文件夹下是一些测试实例。 (2)DSP库简介 * ST提供了.lib格式的文件,方便使用这些库。这些.lib文件就是由Source文件夹下的源码编译生成的,如果想看某个函数的源码,可以在Source文件夹下面查找。.lib格式文件路径:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0→Libraries→CMSIS→Lib→ARM,总共有8个.lib文件,和M4F相关的有两个: * arm_cortexM4bf_math.lib(浮点Cortex-M4大端模式) * arm_cortexM4lf_math.lib(浮点Cortex-M4小端模式) * STM32F4的内核CortexM4F采用小端模式,所以选择:arm_cortexM4lf_math.lib(浮点Cortex-M4小端模式)。 === 3.DSP库编程环境搭建 === * 首先添加库文件。在工程目录下新建DSP_LIB文件夹用于存放库文件。然后把arm_cortexM4lf_math.lib和相关头文件(路径STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\ Libraries\CMSIS\Include 里的文件)拷贝到DSP_LIB文件夹中。 * 附:ST官方提供了一整套的DSP库方便我们开发使用。在ST提供的标准库:stm32f4_dsp_stdperiph_lib.zip里面就有,该文件可以从ST官网上下载:http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1743/PF257901下载,文件名:STSW-STM32065。下载解压缩之后,在目录STM32F4xx_DSP_StdPeriph_Lib_V1.8.0→Libraries→CMSIS→DSP_Lib下可以找到DSP库文件和测试实例。Sourse中是所有DSP库文件源代码,Examples文件夹下是一些测试实例里的文件)。 * 然后打开工程,新建DSP_LIB分组,并将arm_cortexM4lf_math.lib添加到工程里面。 * 添加好文件之后,需要添加头文件包含路径,将第一步拷贝的Include文件夹和DSP_LIB文件夹,加入头文件包含路径。打开工程属性设置面板,然后点击”C/C++“选项卡,点击对号处,弹出include path设置面板。添加”..\DSP_LIB“和“..\DSP_LIB\Include“两个路径。 {{ :icore3l:icore3l_arm_hal_49_1.png?direct |}} 最后,为了能够使用DSP库的所有功能,还需要添加以下几个全局宏定义 * 1、ARM_MATH_CM4 * 2、_CC_ARM * 3、ARM_MATH_MATRIX_CHECK * 4、ARM_MATH_ROUNDING {{ :icore3l:icore3l_arm_hal_49_2.png?direct |}} * 添加方法是打开工程属性设置面板,然后点击”C/C++“选项卡,在“Preprocessor Symbols“下的”Define:”文本框中进行添加。两个宏之间用“,”隔开。 ==== 四、实验程序 ==== 1.主函数 int main(void) { int i,j; int res; int time[2]; static int error_flag = 0; HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); usart1.initialize(115200); usart1.printf("\x0c"); //清屏 usart1.printf("\033[1;32;40m"); //设置终端字体为绿色 usart1.printf("Hello, I am iCore3L!\r\n\r\n"); usart1.printf("DSP BasicMath TEST......\r\n"); while (1) { uwTick = 0; for(j = 0;j < 10000;j++) { for(i = 0;i < MAX_BLOCKSIZE;i ++) { res = SinCos_Test(testInput_f32[i],0); if(res != 0)error_flag ++; } } time[0] = HAL_GetTick(); uwTick = 0; for(j = 0;j < 10000;j++) { for(i = 0;i < MAX_BLOCKSIZE;i ++) { res = SinCos_Test(testInput_f32[i],1); if(res != 0)error_flag ++; } } time[1] = HAL_GetTick(); if(error_flag == 0) { usart1.printf("*NO DSP MATHLIB runtime:%dms *USE DSP MATHLIB runtime:%dms\r",time[0], time[1]); LED_GREEN_ON; } else { usart1.printf("Error\r"); LED_RED_ON; } } } 2.SinCos_Test函数 int SinCos_Test(float testInput,unsigned char mode) { float Sinx,Cosx; float Result; switch (mode) { case 0://不使用DSP MATH库 Sinx = sinf(testInput); Cosx = cosf(testInput); Result = Sinx*Sinx + Cosx*Cosx; Result = fabsf(Result-1.0f); if(Result > DELTA)return -1; break; case 1://使用DSP MATH库 Sinx = arm_sin_f32(testInput); Cosx = arm_cos_f32(testInput); Result = Sinx*Sinx + Cosx*Cosx; Result = fabsf(Result-1.0f); if(Result > DELTA)return -1; break; default: break; } return 0; } ==== 五、实验步骤 ==== - 把仿真器与iCore3L的SWD调试口相连(直接相连或者通过转接器相连); - 将iCore3L通过Micro USB线与计算机相连,为iCore3L供电; - 打开Keil MDK开发环境,并打开本实验工程; - 烧写程序到iCore3L上; - 也可以进入Debug 模式,单步运行或设置断点验证程序逻辑。 ==== 六、实验现象 ==== 本实验进行进行DSP浮点运算测试,分别测试出不使用DSP MATH和使用DSP MATH的运算时间,进行对比。测试成功绿色LED点亮,并在终端上显示不使用DSP MATH和使用DSP MATH的运算时间;测试失败红色LED点亮,并在终端上显示“Error”。(PuTTY串口软件使用方法详情见附录) {{ :icore3l:icore3l_arm_hal_49_3.png?direct |}} ===== 附录 ===== 1.安装CH340驱动(双击安装,如果已安装忽略此步)\\ 2.iCore3L供电后,打开计算机——属性——设备管理器——端口 {{ :icore3l:icore3l_arm_hal_49_4.png?direct |}} 3.打开puTTY {{ :icore3l:icore3l_arm_hal_49_5.png?direct |}} 4.烧写程序进行验证