[BLE(低功耗蓝牙)] 手机蓝牙控制BlueRNG开发板上的灯(源码+.hex文件)

elike   2018-1-24 18:44 楼主
基本功能描述,程序写好后,可以在手机的客户端lightblue中,与搭好的BLE serve进行连接,连接成功后LED1会点亮。之后用手机向BlueNRG发送'x'时,LED3蓝色灯会点亮,再发送一次'x'时,LED3蓝色灯会熄灭。发送'y'时LED2会点亮,再次发送时,LED2就熄灭了。这样你就可以使用手机通过蓝牙发送不同的字母来控制LED2和LED3的亮灭。(附件server.hex可以直接烧录) 图片1.jpg 图片2.jpg 图片3.jpg 1.搭建工作环境 TrueSTUDIO+secureCRT,烧写工具自带的BlueRNG-1Flasher_GUI. 由于该程序是有例子程序中的Blue_chat修改得到。首先分析一下源码结构。 file_list1.jpg file_list2.jpg 我们所需要编写的代码都在蓝线框中已经标出。 其他的文件是不同的平台的project文件,有EWARM,MDK-ARM和TrueSTUDIO三个平台,下面我要展示的就只是TrueSTUDIO平台,所以我们可以直接把以下三个目录的文件复制出来就行了,./inc/*,./src/*, ./TrueSTUDIO/BlueNRG-1/*。但是,源码还有很多依赖库,这些库文件都放在了BlueNRG-1_2 DK 2.6.0/Library文件夹下,我们只需拷贝并配置到相应的项目文件下即可,我这里为了修改方便,自己新建了Projec文件夹,Library和Project在同一级目录下,其中project文件结构如下。 fire_structure.jpg 其中黄色框内的文件是编译之后生成的,不用管。 最后,文件配置的部分都在项目的配置中都可以修改,如图。 config.jpg build通过之后,就要开始修改代码了 2.添加控制灯的代码 在BLE_char_main.c文件中 定义时钟全局变量
  1. volatile uint32_t lSystickCounter=0;
  1. /* Identify BlueNRG1 platform */
  2. SdkEvalIdentification();
在这个之后添加端口的初始化
  1. /* Enable the GPIO Clock */
  2. SysCtrl_PeripheralClockCmd(CLOCK_PERIPH_GPIO, ENABLE);
  3. /* Configure the LEDs */
  4. GPIO_InitType GPIO_InitStructure;
  5. GPIO_InitStructure.GPIO_Pin = Get_LedGpioPin(LED1) | Get_LedGpioPin(LED2) | Get_LedGpioPin(LED3);
  6. GPIO_InitStructure.GPIO_Mode = GPIO_Output;
  7. GPIO_InitStructure.GPIO_Pull = ENABLE;
  8. GPIO_InitStructure.GPIO_HighPwr = ENABLE;
  9. GPIO_Init(&GPIO_InitStructure);
  10. /* Put the LEDs off */
  11. GPIO_WriteBit(Get_LedGpioPin(LED1) | Get_LedGpioPin(LED2) | Get_LedGpioPin(LED3), LED_OFF);
时钟的初始化
  1. /* Configure SysTick to generate interrupt */
  2. SysTick_Config(SYST_CLOCK/1000 - 1);
在chart.c文件中 把以下函数改为
  1. void hci_le_connection_complete_event(uint8_t Status,
  2. uint16_t Connection_Handle,
  3. uint8_t Role,
  4. uint8_t Peer_Address_Type,
  5. uint8_t Peer_Address[6],
  6. uint16_t Conn_Interval,
  7. uint16_t Conn_Latency,
  8. uint16_t Supervision_Timeout,
  9. uint8_t Master_Clock_Accuracy)
  10. {
  11. connection_handle = Connection_Handle;
  12. APP_FLAG_SET(CONNECTED);
  13. GPIO_ToggleBits(Get_LedGpioPin(LED1));
  14. printf("connection complete\r\n");
  15. #if REQUEST_CONN_PARAM_UPDATE
  16. APP_FLAG_CLEAR(L2CAP_PARAM_UPD_SENT);
  17. Timer_Set(&l2cap_req_timer, CLOCK_SECOND*2);
  18. #endif
  19. }/* end hci_le_connection_complete_event() */
以上是表示已经连接上就打开LED1 和
  1. void hci_disconnection_complete_event(uint8_t Status,
  2. uint16_t Connection_Handle,
  3. uint8_t Reason)
  4. {
  5. APP_FLAG_CLEAR(CONNECTED);
  6. /* Make the device connectable again. */
  7. APP_FLAG_SET(SET_CONNECTABLE);
  8. APP_FLAG_CLEAR(NOTIFICATIONS_ENABLED);
  9. APP_FLAG_CLEAR(TX_BUFFER_FULL);
  10. APP_FLAG_CLEAR(START_READ_TX_CHAR_HANDLE);
  11. APP_FLAG_CLEAR(END_READ_TX_CHAR_HANDLE);
  12. APP_FLAG_CLEAR(START_READ_RX_CHAR_HANDLE);
  13. APP_FLAG_CLEAR(END_READ_RX_CHAR_HANDLE);
  14. GPIO_ToggleBits(Get_LedGpioPin(LED1));
  15. printf("disconnection complete\r\n");
  16. #if ST_OTA_FIRMWARE_UPGRADE_SUPPORT
  17. OTA_terminate_connection();
  18. #endif
  19. }/* end hci_disconnection_complete_event() */
以上表示,断开就熄灭LED1. 还有gatt_db.c文件中 void Attribute_Modified_CB函数改为
  1. void Attribute_Modified_CB(uint16_t handle, uint16_t data_length, uint8_t *att_data)
  2. {
  3. if(handle == RXCharHandle + 1)
  4. {
  5. for(int i = 0; i < data_length; i++){
  6. if(att_data == 'x')
  7. GPIO_ToggleBits(Get_LedGpioPin(LED3));
  8. if(att_data == 'y')
  9. GPIO_ToggleBits(Get_LedGpioPin(LED2));
  10. printf("%c", att_data);
  11. }
  12. }
  13. else if(handle == TXCharHandle + 2)
  14. {
  15. if(att_data[0] == 0x01)
  16. APP_FLAG_SET(NOTIFICATIONS_ENABLED);
  17. }
  18. //printf("attribute_modefied\r\n");
  19. }
接着build成功就行了,把生成的.hex问价烧录到单片机中就可以实现。 3.烧录 至于烧录过程如图配置即可。 图片4.jpg 所有代码详见https://github.com/elike-ypq/BlueNRG.git 本帖最后由 elike 于 2018-1-24 19:18 编辑

    Server.hex (2018-1-24 19:15 上传)

    229.77 KB, 下载次数: 3

回复评论 (2)

厉害,学习了
点赞  2018-1-27 23:56
看不懂呀,高深
点赞  2018-2-19 10:16
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复