这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » STM32F7 Discovery试用 [续8]:图形显示FFT运算结果(终结篇

共19条 2/2 1 2 跳转至
院士
2015-08-24 23:01:04     打赏
11楼
呀!上传了好多的图片啊!

工程师
2015-08-25 22:14:15     打赏
12楼

5:运行第一个程序

拿到板子,最主要的是应用到实际中去。我用的是MDK5,首先要对MDK5升级:

                                            图中MDK升级了STM32F7系列

                               选择器件型号STM32F476NGHx

                                       Debug

                                      Utility

加载STM32Cube_FW_F7_V1.1.0\Projects\STM32746G-Discovery\Applications\STemWin

把里头的显示数据稍微修改一下,编译,下载,执行:


                                   Hello EEPW !

终于可以开始运行自己的代码了。



院士
2015-08-26 10:53:18     打赏
13楼
真棒 真棒

工程师
2015-08-27 20:18:12     打赏
14楼

STM32F7 Discovery[续6]:QSPI  FLASH的烧写


STM32F7 Discovery出厂预装的演示软件长度有18M之多,是下载在外部QSPI FALSH内的。需要下载STM32 ST-LINK Utility V3.70版工具软件。

PC机的USB 线连接到STM32F7 Discovery开发板的CN14上。


打开STM32 ST-LINK Utility V3.70.exe



点击”Connect"进行连接。



点击“External Loader”,在选项框内将“N25Q128A_STM32F746G-DISCO"打勾。



加载STM32F7-DISCO.HEX



点击“Target"->"Porgram &Verify",代码下载开始。


院士
2015-08-28 15:48:12     打赏
15楼

天啊~~

烧写用了2分37秒+啊!


工程师
2015-08-28 16:52:43     打赏
16楼
18MB,那么长的代码,应该的。

工程师
2015-09-05 21:46:57     打赏
17楼

STM32F7 Discovery[续7] Templates入手LTDC

在STM32Cube_FW_F7_V1.10软件包中为用户准备了一个样板工程:Templates,在这个工程中,为用户提供了STM32F7 Discovery调用的底层函数。用户只要直接调用即可。

首先第一步当然是把LTDC显示函数用起来,为方便今后的软件仿真建立一个信息显示界面。

在主函数mian()中加入LTDC初始化函数的调用:

lcd_status = BSP_LCD_Init();
ASSERT(lcd_status != LCD_OK);
BSP_LCD_LayerDefaultInit(LTDC_ACTIVE_LAYER, LCD_FRAME_BUFFER);

接着是设定层缺省值参数:

BSP_LCD_SelectLayer(LTDC_ACTIVE_LAYER);
BSP_LCD_SetFont(&LCD_DEFAULT_FONT);

设定背景颜色并清屏:
BSP_LCD_SetBackColor(LCD_COLOR_WHITE);
BSP_LCD_Clear(LCD_COLOR_WHITE);

设定文本颜色:
BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE);

接下来就可以显示信息了:
BSP_LCD_DisplayStringAt(0, 10, (uint8_t *)"STM32F746G DISCOVERY", CENTER_MODE);
BSP_LCD_DisplayStringAt(0, 35, (uint8_t *)"LTDC display examples", CENTER_MODE);

显示ST  LOGO:

BSP_LCD_DrawBitmap((BSP_LCD_GetXSize() - 80) / 2, 65, (uint8_t *)stlogo);

把字号改小一点,显示版权:

BSP_LCD_SetFont(&Font12);
BSP_LCD_DisplayStringAt(0, BSP_LCD_GetYSize() - 20, (uint8_t *)"Copyright (c) STMicroelectronics 2015", CENTER_MODE);

画出一块红色区域:

BSP_LCD_SetTextColor(LCD_COLOR_RED);
BSP_LCD_FillRect(0, BSP_LCD_GetYSize() / 2 + 15, BSP_LCD_GetXSize(), 60);

绘制矩形:

BSP_LCD_DrawRect(8,160,20,30);

绘制横线:

BSP_LCD_DrawHLine(50,190,100);

绘制竖线:

BSP_LCD_DrawVLine(170,120,80);

绘制斜线:

BSP_LCD_DrawLine(220,200,280,160);

绘制椭圆:

BSP_LCD_DrawEllipse(400,180,35,20);

怎么样?很简单吧!






工程师
2015-10-11 21:50:44     打赏
18楼

8.傅立叶运算(终结篇)

本次申请STM32F746 DISCOVERY的最终目的是运行STM32-DSP库的傅立叶浮点运算,以评估STM32F746的性能。

经过一段时间的摸索试用,终于能够在STM32F746 DISCOVERY开发板上顺利运行1024点基4 FFT的浮点运算,并将运算结果以图形方式实时在LTDC屏幕上显示。运行结果令人满意,STM32F476用来执行DSP浮点运算确实是一款性能极佳的处理器。

首先在项目工程中要添加ST的DSP库文件和FFT-C文件arm_cfft_radix4_f32.c:


图1  添加DSP库

接着要在Options->C/C++选项中添加STM32F746xx,__FPU_PRESENT=1,ARM_MATH_CM7,启用FPU.

在main.c中添加头文件#include "arm_math.h"

ADC的配置:启用ADC3的通道0(GPIOA.0)

void MX_ADC3_Init(void)
{
ADC_ChannelConfTypeDef sConfig;
hadc3.Instance = ADC3;
hadc3.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV2;
hadc3.Init.Resolution = ADC_RESOLUTION12b;
hadc3.Init.ScanConvMode = DISABLE;
hadc3.Init.ContinuousConvMode = ENABLE;
hadc3.Init.DiscontinuousConvMode = DISABLE;
hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc3.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc3.Init.NbrOfConversion = 1;
hadc3.Init.DMAContinuousRequests = ENABLE;
hadc3.Init.EOCSelection = EOC_SINGLE_CONV;
HAL_ADC_Init(&hadc3);
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
HAL_ADC_ConfigChannel(&hadc3, &sConfig);
}


void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{

GPIO_InitTypeDef GPIO_InitStruct;
if(hadc->Instance==ADC3)
{
__ADC3_CLK_ENABLE();

GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

hdma_adc3.Instance = DMA2_Stream0;
hdma_adc3.Init.Channel = DMA_CHANNEL_2;
hdma_adc3.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_adc3.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_adc3.Init.MemInc = DMA_MINC_ENABLE;
hdma_adc3.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_adc3.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_adc3.Init.Mode = DMA_CIRCULAR;
hdma_adc3.Init.Priority = DMA_PRIORITY_LOW;
hdma_adc3.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
hdma_adc3.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
hdma_adc3.Init.MemBurst = DMA_MBURST_SINGLE;
hdma_adc3.Init.PeriphBurst = DMA_PBURST_SINGLE;
HAL_DMA_Init(&hdma_adc3);

HAL_NVIC_SetPriority(ADC_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(ADC_IRQn);

}
}
void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
{

if(hadc->Instance==ADC3)
{
__ADC3_CLK_DISABLE();
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0);
HAL_DMA_DeInit(hadc->DMA_Handle);
HAL_NVIC_DisableIRQ(ADC_IRQn);
}
}
ADC-DMA传输

void MX_DMA_Init(void)
{
__HAL_RCC_DMA2_CLK_ENABLE();
HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);

}
设定ADC采样1024个数据后停止ADC,进行FFT运算后重新启动ADC。

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
{
dmaflage=1;
HAL_ADC_Stop_DMA(&hadc3);
}
基4浮点FFT

static void FFT_read(void)
{    uint16_t i;
arm_cfft_radix4_instance_f32 scfft;
arm_cfft_radix4_init_f32(&scfft,FFT_LENGTH,0,1);

for(i=0;i {
inputbuf[2*i]=(float)Samples_In[i];   //导入ADC数据
inputbuf[2*i+1]=0;
}

arm_cfft_radix4_f32(&scfft,inputbuf);
arm_cmplx_mag_f32(inputbuf,outputbuf,FFT_LENGTH);
}
在屏幕上显示

if(dmaflage==1)    //1024个ADC采样结束
{
dmaflage=0;
FFT_read();
for(i=0;i<479;i++)        //屏幕水平最大宽度坐标
{
BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
BSP_LCD_DrawVLine(i,0,269);
BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
BSP_LCD_DrawLine(i,269,i,269-(outputbuf[i]/80));
}

HAL_ADC_Start_DMA(&hadc3,(uint32_t*)&Samples_In[0],FFT_LENGTH );

}



视频地址:http://player.youku.com/player.php/sid/XMTM1NzUwNDc1Ng==/v.swf

实测STM32F746进行1次基4的1024点FFT浮点运算耗时仅500uS,确实是一款性能极佳的处理器。


院士
2015-10-12 19:52:24     打赏
19楼
真棒~~

共19条 2/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]