买过51、stm32、pic 等好几款开发板,这还是头一次免费申请的一款开发板。相比之前买过的几个,这款开发板的颜值卓越出众。苗条的身材却蕴含着一颗强大的心脏FR8016HA。哪怕是stm32开发板的芯片也比他大好多。一睹为快。
微信图片_20200419124558.jpg

从附带的A4说明上面的连接下载手册、例程等。
微信图片_20200419125343.png 微信图片_20200419125333.png 微信图片_20200419125348.png
几个PDF手册有重合部分,建议整合成一个版本。对于我这样的菜鸟来说,还是喜欢原子哥编写的那种详细的手册教程。可能对高手来说这不是个问题。

微信图片_20200419125353.png
大多数爱好者手里都有ST-LINK 但是这款板子不支持ST-LINK。只支持串口和J-LINK V9。有些遗憾。
我从KEIL官网下载了最新版的5。29版本。选择器件里面选择ARM CORTEX-M3。下载算法需要手动添加,在下载的SDK--tools--FR8010H.FLM 下载算法。经过这两步就可以编译通过了。

微信图片_20200419125401.png 微信图片_20200419125503.png

供电部分一定要像红圈里面这样连接
微信图片_20200419124536.jpg

使用串口下载程序需要连接PA2和TXD,PA3和RXD。

微信图片_20200419124531.jpg

连接PC6和SCL,PC7和SDA在演示例程中才可以显示温湿度传感器和气压传感器的数据。
微信图片_20200419124527.jpg

接上一个小喇叭,用SDK里面的 Fr8010loadsbc_v16.apk  安装到手机,发送wav或者SBC文件就可以播放声音了。再连上MIC,音频输入也有了。这么一刻小芯片可以支持低成本的麦克风音频输入和模拟音频输出确实很方便再开发。再本地语音识别和语音提示方面太实用了。内置PMU:可以对外部锂电池提供200mA的充电电流,同时内部的LDO可以对外提供60mA左右的电流。方便用于便携和穿戴产品。

微信图片_20200419124514.jpg


微信图片_20200419133018.jpg

static int user_task_func(os_event_t *param)
  • {
  •     switch(param->event_id)
  •     {
  •         case USER_EVT_BUTTON:
  •             {
  •                 struct button_msg_t *button_msg;
  •                 const char *button_type_str[] = {
  •                                                     "BUTTON_PRESSED",
  •                                                     "BUTTON_RELEASED",
  •                                                     "BUTTON_SHORT_PRESSED",
  •                                                     "BUTTON_MULTI_PRESSED",
  •                                                     "BUTTON_LONG_PRESSED",
  •                                                     "BUTTON_LONG_PRESSING",
  •                                                     "BUTTON_LONG_RELEASED",
  •                                                     "BUTTON_LONG_LONG_PRESSED",
  •                                                     "BUTTON_LONG_LONG_RELEASED",
  •                                                     "BUTTON_COMB_PRESSED",
  •                                                     "BUTTON_COMB_RELEASED",
  •                                                     "BUTTON_COMB_SHORT_PRESSED",
  •                                                     "BUTTON_COMB_LONG_PRESSED",
  •                                                     "BUTTON_COMB_LONG_PRESSING",
  •                                                     "BUTTON_COMB_LONG_RELEASED",
  •                                                     "BUTTON_COMB_LONG_LONG_PRESSED",
  •                                                     "BUTTON_COMB_LONG_LONG_RELEASED",
  •                                                 };
  •                 button_msg = (struct button_msg_t *)param->param;
  •                 co_printf("KEY 0x%08x, TYPE %s.\r\n", button_msg->button_index, button_type_str[button_msg->button_type]);
  •                                 if(button_msg->button_type == BUTTON_SHORT_PRESSED){//¶Ì°´
  •                                                 if(button_msg->button_index == GPIO_PD6 ){//Key2
  •                                                         switch (App_Mode)
  •                                                         {
  •                                                         case SPEAKER_FROM_FLASH:
  •                                                                 test_speaker_from_flash();//¿ªÊ¼²¥·ÅÒôƵ
  •                                                                 break;
  •                                                         case PICTURE_UPDATE://ˢͼƬ
  •                                                                 co_printf("picture_idx = %d",picture_idx);
  •                                                                 LCD_DisPIC(picture_idx ++);
  •                                                                 if(picture_idx >= 5)
  •                                                                         picture_idx = 0;
  •                                                                 break;
  •                             case CODEC_TEST:
  •                                                                 Test_Codec_demo();
  •                                                                 break;
  •                                                         }
  •                                                 }else if(button_msg->button_index == GPIO_PC5){//KEY1  ¹¤×÷ģʽÇл»
  •                                                         if((App_Mode == SPEAKER_FROM_FLASH)){
  •                                                                 test_end_speaker();//Í£Ö¹²¥·ÅÒôƵ
  •                                                         }else if(App_Mode == CODEC_TEST){
  •                                                                 Test_codec_demo_stop();
  •                                                         }
  •                                                         App_Mode++;
  •                                                         if(App_Mode >= MODE_MAX){
  •                                                                 App_Mode = PICTURE_UPDATE;
  •                                                                 picture_idx = 0;
  •                                                         }
  •                                                         lcd_show_logo(lcd_show_workmode[App_Mode]);//Ë¢ÐÂ,ÏÔʾµ±Ç°Ä£Ê½µÄÃû³Æ
  •                                                 }                                       
  •                                 }else if(button_msg->button_type == BUTTON_LONG_PRESSED){//°´¼ü³¤°´
  •                                         if(button_msg->button_index == GPIO_PC5 ){
  •                                                 co_printf("GUO \r\n");
  •                                                 //tft_write_pic_data_to_flash();
  •                                         }
  •                                 }
  •             }
  •             break;
  •     }
  •     return EVT_CONSUMED;
  • }
  • /*********************************************************************
  • * @fn      audio_task_func
  • *
  • * @brief   Audio task function, handles audio events.
  • *
  • * @param   param   - OS events of audio.
  • *      
  • *
  • * @return  int     - EVT_CONSUMED.
  • */
  • static int audio_task_func(os_event_t *param)
  • {
  •         struct decoder_prepare_t *decoder_param = NULL;
  •         ADPCMContext *context = NULL;
  •         switch (param->event_id)
  •         {
  •                 //ÒôƵ½âÂë×¼±¸
  •                 case DECODER_EVENT_PREPARE:                       
  •                        
  •                         decoder_param = (struct decoder_prepare_t *)(param->param);
  •                         decoder_env.decoder_context = os_zalloc(sizeof(ADPCMContext));
  •             context = (ADPCMContext *)decoder_env.decoder_context;
  •             context->channel = 1;
  •             context->block_align = decoder_param->frame_len;
  •             decoder_env.data_start = decoder_param->data_start;
  •             decoder_env.data_end = decoder_param->data_end;
  •             decoder_env.current_pos = decoder_param->data_start + decoder_param->start_offset;
  •             decoder_env.tot_data_len = decoder_param->tot_data_len;
  •             decoder_env.store_type = decoder_param->store_type;
  •             decoder_env.data_processed_len = 0;
  •             decoder_env.frame_len = decoder_param->frame_len;
  •             stop_flag = 0;
  •             co_printf("preparing,fram_len:%d\r\n",decoder_env.frame_len);
  •             co_list_init(&decoder_env.pcm_buffer_list);
  •             decoder_env.pcm_buffer_counter = 0;
  •             decoder_play_next_frame();
  •                         decodeTASKState = DECODER_STATE_BUFFERING;
  •                        
  •                         break;
  •                 //ÒôƵ½âÂëÏÂÒ»Ö¡Êý¾Ý´¦Àí
  •                  case DECODER_EVENT_NEXT_FRAME:                       
  •                         decoder_play_next_frame_handler(&decodeTASKState);
  •                          break;
  •                  
  •                  //ÒôƵ½âÂëÍ£Ö¹
  •                 case DECODER_EVENT_STOP:                               
  •                     NVIC_DisableIRQ(I2S_IRQn);
  •                     while(1)
  •                     {
  •                         struct co_list_hdr *element = co_list_pop_front(&decoder_env.pcm_buffer_list);
  •                         if(element == NULL)
  •                             break;
  •                         os_free((void *)element);
  •                     }
  •                     if(decoder_env.decoder_context != NULL)
  •                     {
  •                         os_free((void *)decoder_env.decoder_context);
  •                         decoder_env.decoder_context = NULL;
  •                     }
  •                         decodeTASKState = DECODER_STATE_IDLE;
  •                     speaker_stop_hw();
  •                     decoder_end_func();
  •                     decoder_hold_flag = false;
  •                         break;
  •         }
  •     return EVT_CONSUMED;
  • }
  • /*********************************************************************
  • * @fn      user_task_init
  • *
  • * @brief   Application task initialization, create all application tasks here.
  • *
  • * @param   None.
  • *      
  • *
  • * @return  None.
  • */
  • void user_task_init(void)
  • {
  •     user_task_id = os_task_create(user_task_func);
  •         audio_task_id = os_task_create(audio_task_func);//´´½¨ÒôƵÈÎÎñ
  • }
  • 复制代码
    user_task里面的部分做了一点修改。其他部分还看不懂。需要加油!
    通过这个开发板我主要做智能家居方面的设计。比如语音控制家里的电器开关、语音播报温度,自动管理灯光和音响。由于水平还处于初级阶段,还有很长的路要走。我要把这款开发板带到身旁,尽早熟练掌握,早日开发出实用产品。