| **银杏科技有限公司旗下技术文档发布平台** ||||
|技术支持电话|**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.烧写程序进行验证