完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
前言: 哈哈哈哈哈哈哈哈哈。。。。。。太久没发文了,允许我先长啸三声,终于要弄一弄这个传说中的蓝牙,正在我要开始踏上这个不平凡的旅途之际,不小心看到一个帖子,帖子的名字居然能引起我注意!!!帖子的名字叫:ti CC2640迄今为止业界功能最强,功耗最低BLE解决方案。那不就正式我要调的这款吗?想想还有点小激动!但是看了下时间是2015.1.18,不过那个时候没发布。。。不知道现在是不是还是世界上最强的~看了一下demo的代码我是崩溃的,因为里面内嵌了一个RTOS的实时系统,那么据我来看,先读懂这个实时系统的代码的走向是理解这款蓝牙十分关键的一环。。。不知不觉说了一堆心里活动。。。是时候上菜辣!!! 1.Begin: Where to start...of course main(),在C和C++里,程序都是从main开始的, int main() { PIN_init(BoardGpioInitTable); #ifndef POWER_SAVING /* Set constraints for Standby, powerdown and idle mode */ Power_setConstraint(Power_SB_DISALLOW); Power_setConstraint(Power_IDLE_PD_DISALLOW); #endif // POWER_SAVING /* Initialize ICall module */ ICall_init(); /* Start tasks of external images - Priority 5 */ ICall_createRemoteTasks(); /* Kick off profile - Priority 3 */ GAPRole_createTask(); SimpleBLEPeripheral_createTask(); #ifdef FEATURE_OAD { uint8_t counter; uint32_t *vectorTable = (uint32_t*) 0x20000000; #if defined(__IAR_SYSTEMS_ICC__) uint32_t *flashVectors = &__vector_table; #elif defined(__TI_COMPILER_VERSION__) uint32_t *flashVectors = &ti_sy***ios_family_ARM_m3_Hwi_resetVectors; #endif //Compiler. // Write image specific interrupt vectors into RAM vector table. for(counter = 0; counter < 15; ++counter) { *vectorTable++ = *flashVectors++; } } #endif //FEATURE_OAD /* enable interrupts and start SYS/BIOS */ BIOS_start(); return 0; } 直接看几个关键的函数即可,经过 PIN_init(BoardGpioInitTable)、ICall_init()两个模块初始化后,就开始执行SimpleBLEPeripheral_createTask() ,这里是创建一个任务,后面BIOS_start();就是系统开始奔跑辣,会执行你创建的任务!!!然后具体看看----》SimpleBLEPeripheral_createTask() 在IAR的工具里重新编译,右键点击go to它的定义,即可找到本尊。。。 2.void SimpleBLEPeripheral_createTask(void) { Task_Params taskParams; // Configure task Task_Params_init(&taskParams); taskParams.stack = ***pTaskStack; taskParams.stackSize = SBP_TASK_STACK_SIZE; taskParams.priority = SBP_TASK_PRIORITY; Task_construct(&***pTask, SimpleBLEPeripheral_taskFxn, &taskParams, NULL); } 前面是配置任务,后面才是创建该任务, Task_construct第二个参数是传入SimpleBLEPeripheral_taskFxn函数的地址,继续寻寻腻腻。。。 3./********************************************************************* * @fn SimpleBLEPeripheral_taskFxn * * @brief Application task entry point for the Simple BLE Peripheral. * * @param a0, a1 - not used. * * @Return None. */ static void SimpleBLEPeripheral_taskFxn(UArg a0, UArg a1) 函数有点长,不过这里面应该就是真正要执行的东西啊啊啊!!! // Initialize application SimpleBLEPeripheral_init(); 从设备初始化, // Application main loop for (;;) { } 一个死循环啊啊啊。。。 4.// Process message. SimpleBLEPeripheral_processAppMsg(pMsg);传递消息进去 /********************************************************************* * @fn SimpleBLEPeripheral_processAppMsg * * @brief Process an incoming callback from a profile. * * @param pMsg - message to process * * @return None. */ static void SimpleBLEPeripheral_processAppMsg(***pEvt_t *pMsg) 将队列中的消息传进来解析,执行代码 到这里基本就走了一遍。。。是不是很简单啊啊啊。。。但是还有一处,就是它的队列里的消息是在哪里初始化的。。。Go on 5.static void SimpleBLEPeripheral_init(void) { ICall_registerApp(&selfEntity, &sem); // Create an RTOS queue for message from profile to be sent to app. appMsgQueue = Util_constructQueue(&appMsg); } 当然还有其他的初始化 // Create one-shot clocks for internal periodic events. Util_constructClock(&periodicClock, SimpleBLEPeripheral_clockHandler, SBP_PERIODIC_EVT_PERIOD, 0, false, SBP_PERIODIC_EVT); Board_initKeys(SimpleBLEPeripheral_keyChangeHandler); HalLedInit(); Uart_Init(UartCallBack);// 串口驱动添加 [size=10.5000pt]6.那么接下来呢。。。就是Setup the GAP BLE的配置才刚刚开始, uint16_t desiredMinInterval = DEFAULT_DESIRED_MIN_CONN_INTERVAL; uint16_t desiredMaxInterval = DEFAULT_DESIRED_MAX_CONN_INTERVAL; 这两个参数比较关键,连接间隔时间设置, // Set advertising interval { uint16_t advInt = DEFAULT_ADVERTISING_INTERVAL; GAP_SetParamValue(TGAP_LIM_DISC_ADV_INT_MIN, advInt); GAP_SetParamValue(TGAP_LIM_DISC_ADV_INT_MAX, advInt); GAP_SetParamValue(TGAP_GEN_DISC_ADV_INT_MIN, advInt); GAP_SetParamValue(TGAP_GEN_DISC_ADV_INT_MAX, advInt); } 设置广播间隔,间隔越大,功耗越低,这个对需要实时在线的设备是很少减低功耗的方式。 7.// Setup the GAP Bond Manager { uint32_t passkey = 0; // passkey "000000" uint8_t pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ; uint8_t mitm = TRUE; uint8_t ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY; uint8_t bonding = TRUE; GAPBondMgr_SetParameter(GAPBOND_DEFAULT_PASSCODE, sizeof(uint32_t), &passkey); GAPBondMgr_SetParameter(GAPBOND_PAIRING_MODE, sizeof(uint8_t), &pairMode); GAPBondMgr_SetParameter(GAPBOND_MITM_PROTECTION, sizeof(uint8_t), &mitm); GAPBondMgr_SetParameter(GAPBOND_IO_CAPABILITIES, sizeof(uint8_t), &ioCap); GAPBondMgr_SetParameter(GAPBOND_BONDING_ENABLED, sizeof(uint8_t), &bonding); } 这里可以设置绑定配对的的功能,以上是无需配对,直接连接 8. // Initialize GATT attributes GGS_AddService(GATT_ALL_SERVICES); // GAP GATTServApp_AddService(GATT_ALL_SERVICES); // GATT attributes DevInfo_AddService(); // Device Information Service 初始化一些GATT的服务 至此,主要流程已走通。。。当然要利用起这个系统还要添加一些事件和驱动,比如KEY,LED,LCD,UART and so on 未完待续。。。。。。。。。。 评分
|
||
相关推荐
|
||
6666,点个赞!
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
物联网工程师必备:怎么选择不同的无线连接技术,本指南帮你忙!
3237 浏览 1 评论
【DFRobot TinkerNode NB-IoT 物联网开发板试用连载】WIFI功能测试
3887 浏览 0 评论
【DFRobot TinkerNode NB-IoT 物联网开发板试用连载】Arduino的替代SublimeText3+STino
3397 浏览 0 评论
使用端口扩展器轻松高效地向IIoT端点添加具有成本效益的子节点
3938 浏览 1 评论
20550 浏览 11 评论
模组有时候复位重启后输出日志为“REBOOT_CAUSE_SECURITY_PMU_POWER_ON_RESET”的原因?
687浏览 2评论
848浏览 2评论
911浏览 1评论
1033浏览 1评论
340浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-1 17:04 , Processed in 0.647179 second(s), Total 53, Slave 45 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号