[国产单片机] 【东软载波ESF0654 PDS开发板活动】OLED12864音乐频谱

[复制链接]
 楼主| 将爱 发表于 2019-12-20 10:17 | 显示全部楼层 |阅读模式
本帖最后由 将爱 于 2019-12-20 10:33 编辑

板子到手已经有几天了,看已经有好多坛友发表了评测,我也抓紧时间做了个音乐频谱,相比起单调的评测这样会更好玩点。
首先爆照环节还是要有的


附带个优酷视频:视频链接   https://v.youku.com/v_show/id_XNDQ3NTc5MTQ0MA==.html?spm=a2h3j.8428770.3416059.1
频谱可通过板载按键循环切换,根据采样点是256,主频只有48M ,因此跑起来有点迟迟,而且上传视频的时候程序还有点小问题,
不过重在熟悉内部资源,视频看个乐呵就好。
定时器基本参数的初始化,AD16C4T0属于高级定时器,功能比较多,我还没搞懂
  1. void Timer_Init()
  2. {
  3.         /* Initialize AD16C4T0 */
  4.         h_tim.perh = AD16C4T0;
  5.         h_tim.init.prescaler    = 0;                                                                                                                                                                                //48M
  6.         h_tim.init.mode         = TIMER_CNT_MODE_UP;
  7.         h_tim.init.period       = 4800;                                         //48M/4800=10KÖÐ¶ÏÆµÂÊ
  8.         h_tim.init.clk_div      = TIMER_CLOCK_DIV1;
  9.         h_tim.init.re_cnt       = 0;
  10.   h_tim.period_elapse_cbk = ald_timer_period_elapsed_callback;
  11.         ald_timer_base_init(&h_tim);

  12.                 /* Initialize clock source */
  13.         tim_clock.source = TIMER_SRC_INTER;
  14.         ald_timer_config_clock_source(&h_tim, &tim_clock);
  15.        
  16.         /* Enable tim0 interrupt */
  17.         ald_mcu_irq_config(AD16C4T0_BRK_UP_TRIG_COM_IRQn, 1, ENABLE);       
  18.    
  19.         /* Enable UPDATE interrupt */
  20.         ald_timer_interrupt_config(&h_tim, TIMER_IT_UPDATE, ENABLE);
  21.        
  22.         /* Start input pwm from tim0 channel 1 */
  23.         ald_timer_base_start(&h_tim);

  24. }


  25. void ald_timer_period_elapsed_callback(struct timer_handle_s *arg)
  26. {
  27.    ADC_STAR_FLAG = 1;
  28.    ald_gpio_toggle_pin(GPIOC,GPIO_PIN_9);                       
  29.        
  30. }


ADC的初始化,本来想用DMA传输的,但是接口函数调用不对就暂时回归本质死等吧
  1. void ADC_Init(void)
  2. {
  3.         gpio_init_t x;

  4.         /* clear adc_handle_t structure */
  5.         memset(&h_adc, 0x0, sizeof(adc_handle_t));
  6.         /* clear adc_nch_conf_t structure */
  7.         memset(&nm_config, 0x0, sizeof(adc_nch_conf_t));       
  8.        
  9.         /* Initialize ADC pin */
  10.     x.mode = GPIO_MODE_INPUT;
  11.     x.odos = GPIO_PUSH_PULL;
  12.     x.pupd = GPIO_PUSH_UP;
  13.     x.odrv = GPIO_OUT_DRIVE_NORMAL;
  14.     x.flt  = GPIO_FILTER_DISABLE;
  15.     x.type = GPIO_TYPE_TTL;
  16.     x.func = GPIO_FUNC_0;
  17.     ald_gpio_init(GPIOC, GPIO_PIN_2, &x);

  18.         /* Initialize adc */
  19.         h_adc.perh = ADC0;
  20.         h_adc.init.data_align              = ADC_DATAALIGN_RIGHT;                                                                        //ADCÓÒ¶ÔÆë
  21.         h_adc.init.scan_mode               = DISABLE;                             //ɨÃèģʽ²»ÆôÓÃ
  22.         h_adc.init.cont_mode                                        = DISABLE;                             //Á¬ÐøÄ£Ê½²»ÆôÓÃ
  23.         h_adc.init.nch_len                 = ADC_NCH_LEN_1;                       //ADC³¤¶ÈÕý³£×ª»»
  24.         h_adc.init.disc_mode                                                     = ADC_ALL_DISABLE;                     //ADCÖжÏģʽȫ²¿½ûÓÃ
  25.         h_adc.init.disc_nbr                = ADC_DISC_NBR_1;                      //²»Á¬Ðø×ª»»Í¨µÀÊýÁ¿
  26.         h_adc.init.conv_res                                                            = ADC_CONV_RES_10;                     //»»Ë㾫¶È
  27.         h_adc.init.clk_div                 = ADC_CKDIV_128;                       //128·ÖƵ
  28.         h_adc.init.neg_ref                                     = ADC_NEG_REF_VSS;                     //ADC¸º²Î¿¼µçѹ  vss
  29.         h_adc.init.pos_ref                                     = ADC_POS_REF_VDD;                     //   Õý²Î¿¼µçѹ  vdd
  30.         ald_adc_init(&h_adc);
  31.        
  32.         /* Initialize normal convert channel */                                   //³õʼ»¯ÆÕͨת»»Í¨µÀ
  33.         nm_config.channel       = ADC_CHANNEL_2;
  34.         nm_config.rank          = ADC_NCH_RANK_1;                                 //Õý³£Í¨µÀµÈ¼¶1
  35.         nm_config.samp_time     = ADC_SAMPLETIME_4;                               //²ÉÑùʱ¼äλ4¸öʱÖÓÖÜÆÚ
  36.         ald_adc_normal_channel_config(&h_adc, &nm_config);       
  37.        
  38. }

  39. void Get_ADC()
  40. {
  41. //        while( ald_adc_start_by_dma(&h_adc, ADC_Value, 1, ADC_CHANNEL_14) != OK );
  42. //                ald_adc_start_by_dma(&h_adc, &ADC_Value, 1, ADC_CHANNEL_14);
  43.        
  44.     ald_adc_normal_start(&h_adc);
  45.                 if (ald_adc_normal_poll_for_conversion(&h_adc, 5000) == OK)
  46.                                 ADC_Value = ald_adc_normal_get_value(&h_adc);       
  47. }



按键和LED初始化比较简单,这里按键用的是外部中断
  1. void KEY_Init()
  2. {
  3.   gpio_init_t x;
  4.         exti_init_t exti;
  5.        
  6.         /* Initialize GPIO_PIN_0 as input */
  7.         x.mode = GPIO_MODE_INPUT;                               //Ë«Ïò
  8.         x.odos = GPIO_PUSH_PULL;                                //ÍÆÍì
  9.         x.pupd = GPIO_PUSH_UP;                                  //ÉÏÀ­
  10.         x.odrv = GPIO_OUT_DRIVE_NORMAL;                         //----
  11.         x.flt  = GPIO_FILTER_DISABLE;                           //----
  12.         x.type = GPIO_TYPE_CMOS;                                //----
  13.         x.func = GPIO_FUNC_1;                                   //----
  14.         ald_gpio_init(GPIOF, GPIO_PIN_0|GPIO_PIN_1, &x);
  15.        
  16.         /* Initialize external interrupt */
  17.         exti.filter      = ENABLE;
  18.         exti.cks         = EXTI_FILTER_CLOCK_10K;
  19.         exti.filter_time = 10;
  20.         ald_gpio_exti_init(GPIOF, GPIO_PIN_0, &exti);
  21.         ald_gpio_exti_init(GPIOF, GPIO_PIN_1, &exti);
  22.         /* Clear interrupt flag */
  23.         ald_gpio_exti_clear_flag_status(GPIO_PIN_0);
  24.   ald_gpio_exti_clear_flag_status(GPIO_PIN_1);
  25.         /* Configure interrupt */
  26.         ald_gpio_exti_interrupt_config(GPIO_PIN_0, EXTI_TRIGGER_TRAILING_EDGE, ENABLE);
  27.   ald_gpio_exti_interrupt_config(GPIO_PIN_1, EXTI_TRIGGER_TRAILING_EDGE, ENABLE);
  28.         /* Enable external interrupt */
  29.         ald_mcu_irq_config(EXTI0_3_IRQn, 3, ENABLE);
  30. }


  31. void gpio_irq_handler(void)
  32. {
  33.         /* Check and clear interrupt flag */
  34.         if (ald_gpio_exti_get_flag_status(GPIO_PIN_0)) {
  35.                 ald_gpio_exti_clear_flag_status(GPIO_PIN_0);
  36.                 clear_ram();
  37.                 menu++;
  38.                 if(menu>=3)
  39.                         menu = 3;
  40. //                ald_gpio_toggle_pin(GPIOC,GPIO_PIN_8);
  41.         }

  42.         if (ald_gpio_exti_get_flag_status(GPIO_PIN_1)) {
  43.                 ald_gpio_exti_clear_flag_status(GPIO_PIN_1);
  44.                 clear_ram();
  45.                 menu--;
  46.                 if(menu<=1)
  47.                         menu = 1;       
  48. //                        ald_gpio_toggle_pin(GPIOC,GPIO_PIN_8);
  49.         }


OLED植入也比较简单,配置好IO口即可
关于FFT,网上资料也很多,这里不再重复述,后续等我优化一下代码可以上传附件供各位参考。

选择:通过本次评估,基本熟悉了ES32F0654内部各种外部设的使用,上手还是比较快的,
另外手头还有一些朋友给的东软的8位机,借着这次送的仿真器也可以用用了






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

62

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部