我们简单的分析一份本次的教学内容,并根据这次的教学内容实现台灯的综合应用,本次的教学中我们移动学习了PWM的控制输出、ADC的采集以及蓝牙无线通信,其中个人认为蓝牙无线通信是这次实现功能的最基础也是最主要的内通话,如果根据难易程度肯定是根据教学大纲一步一步来,不过这次我准备从蓝牙先入手,这个基础调通了,后边加功能比较方便了。
这次蓝牙调试不建议根据我们一般开发流程那样通过STM32CubeMX一步一步创建,本次就是使用的官方的demo进行的修改,这种方法对于协议功能比较复杂的工程非常实用,对于蓝牙或者USB这种具有一定协议栈的功能建议采用这种方式进行快速验证,本次选用的是STM32Cube_FW_WBA固件包中的“BLE_p2pServer”工程,这里还是一个小建议,直接在这里面复制一个进行编辑,因为固件中的demo有很多依存关系(包括路径管理),在这里直接修改会避免很多的错误,一定要复制一个修改,保证原来的不动。
接下来我们简单看一下这个工程:
有关蓝牙方面的应用就在"p2p_server_app.c"和"app_ble.c"中;
我们打开STM32CubeMX工程文件可以看到:
扩展板的对应的引脚(按键和LED)已经锁定,我们先不用更改任何内容,直接通过demo例程看一下是什么效果的,效果测试demo效果可以查看效果视频,这里就简单描述一下,上电后发现LD2闪烁,我们在demo程序中找到了这个LD2的功能定义,指示的蓝牙连接状态,我们可以通过ST的官方测试APP进行连接测试,发现连接后LD2的上述频率有些许变化。之后就可以通过app中的服务控制LD1的亮灭操作。
我们定义看一下程序中对应的相关内容:
LD3蓝牙控制蓝灯亮灭在"p2p_server_app.c"中的P2P_SERVER_Notification子程序中:
case P2P_SERVER_LED_C_WRITE_NO_RESP_EVT: /* USER CODE BEGIN Service1Char1_WRITE_NO_RESP_EVT */ if(p_Notification->DataTransfered.p_Payload[1] == 0x01) { BSP_LED_On(LED_BLUE); LOG_INFO_APP("-- P2P APPLICATION SERVER : LED1 ON\n"); P2P_SERVER_APP_Context.LedControl.Led1 = 0x01; /* LED1 ON */ } if(p_Notification->DataTransfered.p_Payload[1] == 0x00) { BSP_LED_Off(LED_BLUE); LOG_INFO_APP("-- P2P APPLICATION SERVER : LED1 OFF\n"); P2P_SERVER_APP_Context.LedControl.Led1 = 0x00; /* LED1 OFF */ } /* USER CODE END Service1Char1_WRITE_NO_RESP_EVT */ break;
LD2的TASK开启是在"app_ble.c"中的SVCCTL_App_Notification子程序中,通过定时的方式,定时时间是LED_ON_TIMEOUT_MS这个宏定义:
case ACI_HAL_END_OF_RADIO_ACTIVITY_VSEVT_CODE: { /* USER CODE BEGIN RADIO_ACTIVITY_EVENT */ BSP_LED_On(LED_GREEN); UTIL_TIMER_StartWithPeriod(&bleAppContext.SwitchOffGPIO_timer_Id, LED_ON_TIMEOUT_MS); /* USER CODE END RADIO_ACTIVITY_EVENT */ break; /* ACI_HAL_END_OF_RADIO_ACTIVITY_VSEVT_CODE */ }
LD2状态的闪烁是通过开启定时后关闭再开启的方式,定时到了后执行的是以下内容:
/* Create timer to handle the Led Switch OFF */ UTIL_TIMER_Create(&(bleAppContext.SwitchOffGPIO_timer_Id), 0, UTIL_TIMER_ONESHOT, &Switch_OFF_GPIO, 0);
这里看到Switch_OFF_GPIO函数里面就是关闭LD2:
static void Switch_OFF_GPIO(void *arg) { BSP_LED_Off(LED_GREEN); return; }
如果我们需要修改这个状态灯,需要把这些关联的内容统统修改掉;
demo中还有一个服务就是板卡向app透传,这一部分在void P2P_SERVER_Switch_c_SendNotification(void)中,这个是通过按下B1透传状态数据,这个也将是我们主要参考的内容,实现数据的上传,按键处理的程序在:
void APPE_Button1Action(void) { if (bleAppContext.Device_Connection_Status == APP_BLE_IDLE) { /* Relaunch advertising */ APP_BLE_Procedure_Gap_Peripheral(PROC_GAP_PERIPH_ADVERTISE_START_FAST); UTIL_TIMER_StartWithPeriod(&bleAppContext.Advertising_mgr_timer_Id, ADV_TIMEOUT_MS); } else { UTIL_SEQ_SetTask( 1<<CFG_TASK_SEND_NOTIF_ID, CFG_SEQ_PRIO_0); } return; }我们只要启动发送任务就可以实现一次数据的上传对应的是CFG_TASK_SEND_NOTIF_ID任务,可以直接在P2P_SERVER_Switch_c_SendNotification(void)中刚修改,然后通过UTIL_SEQ_SetTask( 1<<cfg_task_send_notif_id, cfg_seq_prio_0);启动发送一次。