社区导航

 

搜索
查看: 1335|回复: 2

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

[复制链接]

11

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-1-24 18:44 | 显示全部楼层 |阅读模式
本帖最后由 elike 于 2018-1-24 19:18 编辑

基本功能描述,程序写好后,可以在手机的客户端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.   
  4.   /* Configure the LEDs */
  5.   GPIO_InitType GPIO_InitStructure;
  6.   GPIO_InitStructure.GPIO_Pin = Get_LedGpioPin(LED1) | Get_LedGpioPin(LED2) | Get_LedGpioPin(LED3);
  7.   GPIO_InitStructure.GPIO_Mode = GPIO_Output;
  8.   GPIO_InitStructure.GPIO_Pull = ENABLE;
  9.   GPIO_InitStructure.GPIO_HighPwr = ENABLE;
  10.   GPIO_Init(&GPIO_InitStructure);

  11.   /* Put the LEDs off */
  12.   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.   
  13.   APP_FLAG_SET(CONNECTED);
  14.   GPIO_ToggleBits(Get_LedGpioPin(LED1));
  15.   printf("connection complete\r\n");
  16. #if REQUEST_CONN_PARAM_UPDATE
  17.   APP_FLAG_CLEAR(L2CAP_PARAM_UPD_SENT);
  18.   Timer_Set(&l2cap_req_timer, CLOCK_SECOND*2);
  19. #endif
  20. }/* 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.   
  20. }/* 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




Server.hex

229.77 KB, 下载次数: 3



回复

使用道具 举报

9

TA的帖子

3

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-2-19 10:16 | 显示全部楼层
看不懂呀,高深


回复

使用道具 举报

298

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2018-1-27 23:56 | 显示全部楼层
厉害,学习了


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /1 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-7-19 11:49 , Processed in 0.148509 second(s), 19 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表