4412|2

32

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

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

  本帖最后由 elike 于 2018-1-24 19:18 编辑

基本功能描述,程序写好后,可以在手机的客户端lightblue中,与搭好的BLE serve进行连接,连接成功后LED1会点亮。之后用手机向BlueNRG发送'x'时,LED3蓝色灯会点亮,再发送一次'x'时,LED3蓝色灯会熄灭。发送'y'时LED2会点亮,再次发送时,LED2就熄灭了。这样你就可以使用手机通过蓝牙发送不同的字母来控制LED2和LED3的亮灭。(附件server.hex可以直接烧录)


1.搭建工作环境

TrueSTUDIO+secureCRT,烧写工具自带的BlueRNG-1Flasher_GUI.
由于该程序是有例子程序中的Blue_chat修改得到。首先分析一下源码结构。





我们所需要编写的代码都在蓝线框中已经标出。
其他的文件是不同的平台的project文件,有EWARM,MDK-ARM和TrueSTUDIO三个平台,下面我要展示的就只是TrueSTUDIO平台,所以我们可以直接把以下三个目录的文件复制出来就行了,./inc/*,./src/*, ./TrueSTUDIO/BlueNRG-1/*。但是,源码还有很多依赖库,这些库文件都放在了BlueNRG-1_2 DK 2.6.0/Library文件夹下,我们只需拷贝并配置到相应的项目文件下即可,我这里为了修改方便,自己新建了Projec文件夹,Library和Project在同一级目录下,其中project文件结构如下。

其中黄色框内的文件是编译之后生成的,不用管。
最后,文件配置的部分都在项目的配置中都可以修改,如图。

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.烧录
至于烧录过程如图配置即可。


所有代码详见
链接已隐藏,如需查看请登录或者注册





Server.hex

229.77 KB, 下载次数: 3

最新回复

看不懂呀,高深  详情 回复 发表于 2018-2-19 10:16
点赞 关注
 
 

回复
举报

294

帖子

1

TA的资源

纯净的硅(高级)

沙发
 
厉害,学习了
 
 
 

回复

11

帖子

3

TA的资源

一粒金砂(初级)

板凳
 
看不懂呀,高深
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表