在厂家提供的例程中,有进行蓝牙通讯的程序框架,其工程名称为“BLE_SerialPort_Server”。 该程序的用途是在蓝牙接收到指定长度的字节数据后,通过串口来输出接收的数据,其输出接收数据的函数为: void Data_Received(uint16_t length, uint8_t *data)
{
for(uint16_t i = 0U; i < length; i++)
{
printf("%c", data[i]);
}
}
为了以蓝牙通讯的方式来控制外观的LED模块和风扇模块,是将LED模块连接到PB1,将风扇模块连接到PB2。 图1 引脚接口
图2 引脚变化关系 对所用引脚的初始化函数为: void LED_FAN_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_Init);
GPIO_InitStruct.Pin = GPIO_PIN_1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_2;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
}
相应的接收数据控制函数为: void Data_Received(uint16_t length, uint8_t *data)
{
if(data[0] == '1')
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
}
if(data[0] == '2')
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_2);
}
if(data[0] == '3')
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);
}
}
相应的主程序为: int main(void)
{
HAL_Init();
SystemClock_Config();
PeriphCommonClock_Config();
MX_GPIO_Init();
MX_RADIO_Init();
MX_RADIO_TIMER_Init();
MX_PKA_Init();
LED_FAN_Init();
while (1)
{
MX_APPE_Process();
}
}
经程序的编译与下载,由手机上的LightBlue小程序可通过发送字节指令来控制外挂模块。 图3 发送控制字 在发送字节指令0X31时,LED模块会进行状态转换,见图4和图5所示。 图4 熄灭状态
图5 点亮状态 在发送字节指令0X32时,风扇模块会进行状态转换,见图6和图7所示。 图7 转动状态 在发送字节指令0X33时,则LED和风扇模块均会停止。
|