从附带的A4说明上面的连接下载手册、例程等。
几个PDF手册有重合部分,建议整合成一个版本。对于我这样的菜鸟来说,还是喜欢原子哥编写的那种详细的手册教程。可能对高手来说这不是个问题。
大多数爱好者手里都有ST-LINK 但是这款板子不支持ST-LINK。只支持串口和J-LINK V9。有些遗憾。
我从KEIL官网下载了最新版的5。29版本。选择器件里面选择ARM CORTEX-M3。下载算法需要手动添加,在下载的SDK--tools--FR8010H.FLM 下载算法。经过这两步就可以编译通过了。
供电部分一定要像红圈里面这样连接
使用串口下载程序需要连接PA2和TXD,PA3和RXD。
连接PC6和SCL,PC7和SDA在演示例程中才可以显示温湿度传感器和气压传感器的数据。
接上一个小喇叭,用SDK里面的 Fr8010loadsbc_v16.apk 安装到手机,发送wav或者SBC文件就可以播放声音了。再连上MIC,音频输入也有了。这么一刻小芯片可以支持低成本的麦克风音频输入和模拟音频输出确实很方便再开发。再本地语音识别和语音提示方面太实用了。内置PMU:可以对外部锂电池提供200mA的充电电流,同时内部的LDO可以对外提供60mA左右的电流。方便用于便携和穿戴产品。
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);//´´½¨ÒôƵÈÎÎñ }
复制代码通过这个开发板我主要做智能家居方面的设计。比如语音控制家里的电器开关、语音播报温度,自动管理灯光和音响。由于水平还处于初级阶段,还有很长的路要走。我要把这款开发板带到身旁,尽早熟练掌握,早日开发出实用产品。