基本功能描述,程序写好后,可以在手机的客户端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文件中
定义时钟全局变量
- volatile uint32_t lSystickCounter=0;
- /* Identify BlueNRG1 platform */
- SdkEvalIdentification();
在这个之后添加端口的初始化
- /* Enable the GPIO Clock */
- SysCtrl_PeripheralClockCmd(CLOCK_PERIPH_GPIO, ENABLE);
-
- /* Configure the LEDs */
- GPIO_InitType GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin = Get_LedGpioPin(LED1) | Get_LedGpioPin(LED2) | Get_LedGpioPin(LED3);
- GPIO_InitStructure.GPIO_Mode = GPIO_Output;
- GPIO_InitStructure.GPIO_Pull = ENABLE;
- GPIO_InitStructure.GPIO_HighPwr = ENABLE;
- GPIO_Init(&GPIO_InitStructure);
-
- /* Put the LEDs off */
- GPIO_WriteBit(Get_LedGpioPin(LED1) | Get_LedGpioPin(LED2) | Get_LedGpioPin(LED3), LED_OFF);
时钟的初始化
- /* Configure SysTick to generate interrupt */
- SysTick_Config(SYST_CLOCK/1000 - 1);
在chart.c文件中
把以下函数改为
- void hci_le_connection_complete_event(uint8_t Status,
- uint16_t Connection_Handle,
- uint8_t Role,
- uint8_t Peer_Address_Type,
- uint8_t Peer_Address[6],
- uint16_t Conn_Interval,
- uint16_t Conn_Latency,
- uint16_t Supervision_Timeout,
- uint8_t Master_Clock_Accuracy)
-
- {
- connection_handle = Connection_Handle;
-
- APP_FLAG_SET(CONNECTED);
- GPIO_ToggleBits(Get_LedGpioPin(LED1));
- printf("connection complete\r\n");
- #if REQUEST_CONN_PARAM_UPDATE
- APP_FLAG_CLEAR(L2CAP_PARAM_UPD_SENT);
- Timer_Set(&l2cap_req_timer, CLOCK_SECOND*2);
- #endif
- }/* end hci_le_connection_complete_event() */
以上是表示已经连接上就打开LED1
和
- void hci_disconnection_complete_event(uint8_t Status,
- uint16_t Connection_Handle,
- uint8_t Reason)
- {
- APP_FLAG_CLEAR(CONNECTED);
- /* Make the device connectable again. */
- APP_FLAG_SET(SET_CONNECTABLE);
- APP_FLAG_CLEAR(NOTIFICATIONS_ENABLED);
- APP_FLAG_CLEAR(TX_BUFFER_FULL);
-
- APP_FLAG_CLEAR(START_READ_TX_CHAR_HANDLE);
- APP_FLAG_CLEAR(END_READ_TX_CHAR_HANDLE);
- APP_FLAG_CLEAR(START_READ_RX_CHAR_HANDLE);
- APP_FLAG_CLEAR(END_READ_RX_CHAR_HANDLE);
- GPIO_ToggleBits(Get_LedGpioPin(LED1));
- printf("disconnection complete\r\n");
- #if ST_OTA_FIRMWARE_UPGRADE_SUPPORT
- OTA_terminate_connection();
- #endif
-
- }/* end hci_disconnection_complete_event() */
以上表示,断开就熄灭LED1.
还有gatt_db.c文件中
void Attribute_Modified_CB函数改为
- void Attribute_Modified_CB(uint16_t handle, uint16_t data_length, uint8_t *att_data)
- {
- if(handle == RXCharHandle + 1)
- {
- for(int i = 0; i < data_length; i++){
- if(att_data == 'x')
- GPIO_ToggleBits(Get_LedGpioPin(LED3));
- if(att_data == 'y')
- GPIO_ToggleBits(Get_LedGpioPin(LED2));
- printf("%c", att_data);
- }
- }
- else if(handle == TXCharHandle + 2)
- {
- if(att_data[0] == 0x01)
- APP_FLAG_SET(NOTIFICATIONS_ENABLED);
- }
- //printf("attribute_modefied\r\n");
- }
接着build成功就行了,把生成的.hex问价烧录到单片机中就可以实现。
3.烧录
至于烧录过程如图配置即可。
所有代码详见
https://github.com/elike-ypq/BlueNRG.git
本帖最后由 elike 于 2018-1-24 19:18 编辑