fr8016 sdk源码结构和开发方式

一、源码结构和开发方式

1.1 源码结构

顶层目录中包含四个文件夹:components、docs、examples、tools

  • components:组件,sdk遵循模块化的编程原则,组件提供了ble开发所需的编程模块,如ble协议栈、driver驱动和其他模块(如freertos、ringbufffer、audio、button)
  • docs:文档,提供了指导开发者开发的api文档、数据手册,方便在编程中查阅。
  • exapmles:示例,sdk提供了常见ble应用的示例,方便开发者迅速开发自己的产品。
  • tools:工具,提供了烧录工具、ota工具、keil下载需要的flm下载算法。

1.2 开发方式

sdk分为源码和库,ble协议栈以库的形式提供给开发者,这部分协议栈为开发者提供了回调接口,用于协议栈与用户的通信,当协议栈处理某个流程或接收到数据时,通过回调通知用户进行相应的处理。

1.2.1 用户入口

用户入口在proj_main.c中,不像常规的开发那样有main函数,sdk为用户提供了相应的入口,我理解是被weak修饰的虚函数,协议栈在运行过程中,执行到相应的流程就会调用这些入口函数。下面按照协议栈处理流程给出接口的说明

  • 协议栈初始化前:user_entry_before_ble_init,这个函数在协议栈初始化前
  • 协议栈初始化后:user_entry_after_ble_init,这个是用户编程的入口,即协议栈初始化后,用户可以执行自己的逻辑。
  • 进入睡眠模式前:user_entry_before_sleep_imp
  • 退出睡眠模式后:user_entry_after_sleep_imp

1.2.2 协议栈开发

gatt_add_service根据填充好的gatt_service_t结构体初始化一个服务,向协议栈注册服务的属性和属性的操作方法。

	simple_profile_svc.p_att_tb = simple_profile_att_table;
	simple_profile_svc.att_nb = SP_IDX_NB;
	simple_profile_svc.gatt_msg_handler = sp_gatt_msg_handler;
	
	sp_svc_id = gatt_add_service(&simple_profile_svc);

上面的代码创建了一个simple_profile_svc服务,服务的属性在simple_profile_att_table表中定义,当与另一个设备通信时,属性的操作在sp_gatt_msg_handler中处理。

1.2.3 事件和任务

sdk开发中,任务采用事件驱动,不同任务间通过消息os_event_t *进行通信,当任务A产生的事件可以驱动任务B时,任务A通过os_msg_post向任务B发送消息,任务B接收消息,并从消息中获取事件id和数据,根据事件id做相应的处理。
下面的代码中,user_task_func是一个任务,需要被其他任务通过事件驱动,当其他任务调用os_msg_post向user_task_func发送os_event_t时,user_task_func得到执行。os_event_t的param是按键消息,通过按键消息可以获取到某个按键执行了某个操作。

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("K1 long Pressed\r\n");
						//tft_write_pic_data_to_flash();
					}
				}
            }
            break;
    }

    return EVT_CONSUMED;
}

二、参考

https://gitee.com/freqchip
https://www.freqchip.com/

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FR8016HA开发板是一款针对物联网应用开发的多功能开发板。它采用了高性能的Cortex-M4内核处理器和丰富的外设接口,为开发人员提供了强大的功能和灵活的扩展性。FR8016HA开发板的源码是为开发者提供的用于学习和开发各种物联网应用的程序代码。 FR8016HA开发板的源码包括了各种传感器和通信模块的驱动程序、通信协议的实现、数据处理算法以及应用程序的示例等内容。通过阅读源码开发人员可以了解到各种传感器的使用方法和工作原理,学习到不同通信模块的使用方式,以及掌握物联网应用开发的一些常用技术和方法。 FR8016HA开发板的源码还提供了丰富的例程,包括了各种物联网应用的示例代码,如温湿度监测、光照控制、智能家居等。开发人员可以通过参考这些示例代码,快速上手开发自己的物联网应用,节省了繁琐的编程过程。 FR8016HA开发板的源码是开放的,意味着开发人员可以根据自己的需求对代码进行修改和优化,以实现更加灵活和智能的物联网应用。此外,源码社区也会提供技术支持和分享最新的开发成果,方便开发者们共同进步和学习。 总而言之,FR8016HA开发板的源码是一份强大而且灵活的资源,它为开发者们提供了丰富的学习和开发物联网应用的内容,可以帮助开发者们更好地应对物联网行业的发展和挑战。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值