5:运行第一个程序
拿到板子,最主要的是应用到实际中去。我用的是MDK5,首先要对MDK5升级:
图中MDK升级了STM32F7系列
选择器件型号STM32F476NGHx
Debug
Utility
加载STM32Cube_FW_F7_V1.1.0\Projects\STM32746G-Discovery\Applications\STemWin
把里头的显示数据稍微修改一下,编译,下载,执行:
Hello EEPW !
终于可以开始运行自己的代码了。
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",代码下载开始。
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);
怎么样?很简单吧!
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,确实是一款性能极佳的处理器。
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |