你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【F769IDISCOVERY评测】评测七 频谱仪

[复制链接]
wenyangzeng 提问时间:2016-12-4 21:44 /
       F769I DISCOVERYSTM32官网 配置了一片800×472 WVGA TFT DSI LCD,非常适合用来进行图形显示的编程练习。在本贴中以DMA方式读取ADC通道12的正弦波,运行1024个点的浮点运算FFT后,将结果以图形方式在LCD上显示。


无标题.jpg
                       信号连接原理图

      ST官方发布的STM32Cube_FW_F7_V1.50固件库中对WVGA TFT DSI LCD的底层操作都编写得很完整,用户只要简单调用几条命令就可以完成包括层参数设定等初始化操作。因此在本评测中将FFT转换结果用图形方式显示变得很简单。

贴出有关WVGA TFT DSI LCD操作的关键代码。有关FFT代码及编译环境设置请参考https://www.stmcu.org.cn/module/forum/thread-609489-1-1.html

  1. <div>#include "main.h"
  2. ADC_HandleTypeDef    AdcHandle;
  3. __IO int16_t ConvertedValue[1024];

  4. extern float outputbuf[];
  5. void SystemClock_Config(void);
  6. static void LCD_Config(void);
  7. static void ADC_Config(void);
  8. static void Error_Handler(void);
  9. static void MPU_Config(void);
  10. static void CPU_CACHE_Enable(void);

  11. int main(void)
  12. {uint16_t i,j,temp;

  13.   MPU_Config();
  14.   CPU_CACHE_Enable();
  15.   HAL_Init();
  16.   SystemClock_Config();
  17.   BSP_LED_Init(LED1);
  18.   BSP_LED_Init(LED2);
  19.   LCD_Config();
  20.   ADC_Config();
  21.   HAL_ADC_Start_DMA(&AdcHandle, (uint32_t*)&ConvertedValue, 1024);
  22.   while (1)
  23.   {
  24.                         FFT_read();
  25.                                 for(i=0,j=150;i<512;i++,j++)
  26.                                         {
  27.                                         temp=outputbuf[i]/200;
  28.                                                                         if(temp>350)temp=350;
  29.                                         BSP_LCD_SetTextColor(LCD_COLOR_DARKBLUE);        
  30.                                         BSP_LCD_DrawVLine(j,29, 350);        
  31.                                                 
  32.                                         BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
  33.                                         BSP_LCD_DrawVLine(j,380-temp, temp+1);
  34.                                         }
  35.          BSP_LED_Toggle(LED2);
  36.   }
  37. }
  38. void SystemClock_Config(void)
  39. {
  40.   RCC_ClkInitTypeDef RCC_ClkInitStruct;
  41.   RCC_OscInitTypeDef RCC_OscInitStruct;
  42.   HAL_StatusTypeDef ret = HAL_OK;

  43.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  44.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  45.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  46.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  47.   RCC_OscInitStruct.PLL.PLLM = 25;
  48.   RCC_OscInitStruct.PLL.PLLN = 400;
  49.   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  50.   RCC_OscInitStruct.PLL.PLLQ = 9;
  51.   RCC_OscInitStruct.PLL.PLLR = 7;
  52.   
  53.   ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
  54.   if(ret != HAL_OK)
  55.   {
  56.     while(1) { ; }
  57.   }

  58.   ret = HAL_PWREx_EnableOverDrive();
  59.   if(ret != HAL_OK)
  60.   {
  61.     while(1) { ; }
  62.   }
  63.   RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  64.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  65.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  66.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;  
  67.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  68.   
  69.   ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7);
  70.   if(ret != HAL_OK)
  71.   {
  72.     while(1) { ; }
  73.   }  
  74. }

  75. static void LCD_Config(void)
  76. {
  77.   uint32_t  lcd_status = LCD_OK;
  78.   lcd_status = BSP_LCD_Init();
  79.   while(lcd_status != LCD_OK);
  80.   
  81.   BSP_LCD_LayerDefaultInit(0, LCD_FB_START_ADDRESS);
  82.   BSP_LCD_Clear(LCD_COLOR_DARKBLUE);

  83.   BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
  84.   BSP_LCD_FillRect(0, 420, BSP_LCD_GetXSize(), 59);
  85.         
  86.   BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
  87.   BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
  88.   BSP_LCD_SetFont(&Font24);
  89.         
  90.   BSP_LCD_DisplayStringAt(0, 430, (uint8_t *)"STM32F769NIH Discovery FFT Demo", CENTER_MODE);
  91.   BSP_LCD_SetFont(&Font12);
  92.   BSP_LCD_DisplayStringAt(0, 460, (uint8_t *)"Copyright (c) STMicroelectronics 2016", CENTER_MODE);
  93.   BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
  94.   BSP_LCD_SetBackColor(LCD_COLOR_DARKBLUE);
  95.   BSP_LCD_SetFont(&Font24);
  96. }

  97. static void ADC_Config(void)
  98. {
  99.   ADC_ChannelConfTypeDef sConfig;
  100. __HAL_RCC_GPIOC_CLK_ENABLE();
  101.         
  102.   GPIO_InitTypeDef GPIO_InitStruct;
  103.   GPIO_InitStruct.Pin = GPIO_PIN_2;
  104.   GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  105.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  106.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  107.   AdcHandle.Instance          = ADC1;
  108.   AdcHandle.Init.ClockPrescaler        = ADC_CLOCKPRESCALER_PCLK_DIV4;
  109.   AdcHandle.Init.Resolution            = ADC_RESOLUTION_12B;
  110.   AdcHandle.Init.ScanConvMode          = DISABLE;                     
  111.   AdcHandle.Init.ContinuousConvMode    = ENABLE;     
  112.   AdcHandle.Init.DiscontinuousConvMode = DISABLE;   
  113.   AdcHandle.Init.NbrOfDiscConversion   = 1;
  114.   AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE;
  115.   AdcHandle.Init.ExternalTrigConv      = ADC_EXTERNALTRIGCONV_T1_CC1;
  116.   AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;
  117.   AdcHandle.Init.NbrOfConversion       = 1;
  118.   AdcHandle.Init.DMAContinuousRequests = ENABLE;
  119.   AdcHandle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;//DISABLE;

  120.   if (HAL_ADC_Init(&AdcHandle) != HAL_OK)
  121.   {
  122.     Error_Handler();
  123.   }

  124.   sConfig.Channel =ADC_CHANNEL_12;// ADC_CHANNEL_TEMPSENSOR;
  125.   sConfig.Rank = 1;
  126.   sConfig.SamplingTime = ADC_SAMPLETIME_56CYCLES;
  127.   sConfig.Offset = 0;

  128.   if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
  129.   {
  130.     Error_Handler();
  131.   }
  132. }


  133. static void Error_Handler(void)
  134. {
  135.   while (1)
  136.   {
  137.     BSP_LED_Toggle(LED1);
  138.     HAL_Delay(20);
  139.   }
  140. }

  141. #ifdef  USE_FULL_ASSERT

  142. void assert_failed(uint8_t *file, uint32_t line)
  143. {

  144.   while (1)
  145.   {
  146.   }
  147. }

  148. #endif

  149. static void MPU_Config(void)
  150. {
  151.   MPU_Region_InitTypeDef MPU_InitStruct;

  152.   HAL_MPU_Disable();

  153.   MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  154.   MPU_InitStruct.BaseAddress = 0x20010000;
  155.   MPU_InitStruct.Size = MPU_REGION_SIZE_256KB;
  156.   MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  157.   MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
  158.   MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
  159.   MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  160.   MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  161.   MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  162.   MPU_InitStruct.SubRegionDisable = 0x00;
  163.   MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;

  164.   HAL_MPU_ConfigRegion(&MPU_InitStruct);


  165.   HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
  166. }


  167. static void CPU_CACHE_Enable(void)
  168. {
  169.   SCB_EnableICache();
  170.   SCB_EnableDCache();
  171. }</div><div>
  172. </div>
复制代码

HEX文件: STM32F769I_DISCOVERY_HEX.rar (51.51 KB, 下载次数: 15)

评分

参与人数 1 ST金币 +10 收起 理由
zero99 + 10

查看全部评分

收藏 3 评论9 发布时间:2016-12-4 21:44

举报

9个回答
jackten 回答时间:2016-12-5 00:24:50
好强大啊                       
五哥1 回答时间:2016-12-5 18:29:03
要用到傅立叶吗?
wenyangzeng 回答时间:2016-12-5 19:27:06
五哥1 发表于 2016-12-5 18:29
要用到傅立叶吗?

是用到傅里叶函数
小小超 回答时间:2016-12-6 08:43:32
谢谢分享!
xiaoye82 回答时间:2016-12-7 12:19:07
点赞
谢谢分享  
lzts 回答时间:2016-12-8 08:47:22
谢谢分享     
okwh 回答时间:2016-12-26 20:55:29
damiaa 回答时间:2016-12-29 15:17:00
谢谢谢谢!
wenyangzeng 回答时间:2016-12-29 15:39:10

。。。。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版