161 lines
4.7 KiB
C
161 lines
4.7 KiB
C
|
|
/* ble_at.c - HLK-B40 <20><><EFBFBD><EFBFBD><EFBFBD><CDB8>ģ<EFBFBD><C4A3> AT <20><><EFBFBD><EFBFBD>
|
|||
|
|
*
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD>ģ<EFBFBD><EFBFBD> PC5(<EFBFBD><EFBFBD><EFBFBD>ܰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <EFBFBD>ӵ<EFBFBD>Ƭ<EFBFBD><EFBFBD> PB0<EFBFBD><EFBFBD>
|
|||
|
|
* <EFBFBD><EFBFBD> AT ģʽ<EFBFBD><EFBFBD>PB0 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1s <EFBFBD><EFBFBD><EFBFBD>ͷţ<EFBFBD><EFBFBD>ֲ<EFBFBD>Ҫ<EFBFBD><EFBFBD> 0.5~3s<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD>AT ģʽ<EFBFBD>·<EFBFBD><EFBFBD><EFBFBD> AT+TS=1<EFBFBD><EFBFBD>
|
|||
|
|
* <EFBFBD>ϵ<EFBFBD>Ĭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
#include "ble_at.h"
|
|||
|
|
#include "uart.h"
|
|||
|
|
#include "log.h"
|
|||
|
|
#include "main.h"
|
|||
|
|
#include "system.h"
|
|||
|
|
#include "24c02.h"
|
|||
|
|
#include "stdio.h"
|
|||
|
|
#include "string.h"
|
|||
|
|
|
|||
|
|
#define BLE_PC5_PORT GPIOB
|
|||
|
|
#define BLE_PC5_PIN GPIO_PIN_0
|
|||
|
|
#define BLE_PC5_LOW() HAL_GPIO_WritePin(BLE_PC5_PORT, BLE_PC5_PIN, GPIO_PIN_RESET)
|
|||
|
|
#define BLE_PC5_HIGH() HAL_GPIO_WritePin(BLE_PC5_PORT, BLE_PC5_PIN, GPIO_PIN_SET)
|
|||
|
|
|
|||
|
|
/* EEPROM <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>úõ<C3BA><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>132~157<35><37>26B<36><42><EFBFBD>ܿ<EFBFBD><DCBF><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>ã<EFBFBD> */
|
|||
|
|
#define BLE_CACHE_ADDR 132
|
|||
|
|
#define BLE_CACHE_LEN 26
|
|||
|
|
|
|||
|
|
/* PB0 <20><>©<EFBFBD><C2A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>ʱ<EFBFBD><CAB1>ģ<EFBFBD><C4A3> PC5 <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָߵ<D6B8>ƽ */
|
|||
|
|
void ble_at_init(void)
|
|||
|
|
{
|
|||
|
|
GPIO_InitTypeDef g = {0};
|
|||
|
|
__HAL_RCC_GPIOB_CLK_ENABLE();
|
|||
|
|
BLE_PC5_HIGH();
|
|||
|
|
g.Pin = BLE_PC5_PIN;
|
|||
|
|
g.Mode = GPIO_MODE_OUTPUT_OD;
|
|||
|
|
g.Pull = GPIO_NOPULL;
|
|||
|
|
g.Speed = GPIO_SPEED_FREQ_LOW;
|
|||
|
|
HAL_GPIO_Init(BLE_PC5_PORT, &g);
|
|||
|
|
BLE_PC5_HIGH();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void ble_delay(uint32_t ms)
|
|||
|
|
{
|
|||
|
|
while (ms >= 100) {
|
|||
|
|
HAL_Delay(100);
|
|||
|
|
IWDG_Feed();
|
|||
|
|
ms -= 100;
|
|||
|
|
}
|
|||
|
|
if (ms) HAL_Delay(ms);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* <20><><EFBFBD><EFBFBD> USART1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
|
static void ble_flush_rx(void)
|
|||
|
|
{
|
|||
|
|
while (USART1_GetCommand() != NULL) { }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* <20><><EFBFBD><EFBFBD> AT <20><><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>𣨰<EFBFBD><F0A3A8B0><EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD>0=<3D>ɹ<EFBFBD> */
|
|||
|
|
static int ble_at_cmd(const char *cmd, const char *expect, int timeout_ms)
|
|||
|
|
{
|
|||
|
|
char line[64];
|
|||
|
|
int n = snprintf(line, sizeof(line), "%s\r\n", cmd);
|
|||
|
|
ble_flush_rx();
|
|||
|
|
HAL_UART_Transmit(&huart1, (uint8_t *)line, n, 500);
|
|||
|
|
|
|||
|
|
int t = timeout_ms / 50;
|
|||
|
|
while (t-- > 0) {
|
|||
|
|
ble_delay(50);
|
|||
|
|
const char *resp = USART1_GetCommand();
|
|||
|
|
if (resp) {
|
|||
|
|
if (strstr(resp, expect)) {
|
|||
|
|
log_info("> BLE AT: %s", resp);
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
if (strstr(resp, "ERROR")) {
|
|||
|
|
log_warn("> BLE AT Ӧ<><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: %s", resp);
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
log_warn("> BLE AT <20><>ʱ: %s", cmd);
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* <20>ϵ<EFBFBD>ִ<EFBFBD><D6B4>һ<EFBFBD>Σ<EFBFBD><CEA3><EFBFBD> AT ģʽ <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʋ<EFBFBD>ѯ/<2F><><EFBFBD><EFBFBD>Ϊ BLE_NAME <20><> <20><>Ҫʱ<D2AA><CAB1><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
|||
|
|
* <EFBFBD>Ȳ<EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AT <EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> APP <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD><EFBFBD> AT <EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
|
void ble_setup_name(void)
|
|||
|
|
{
|
|||
|
|
char cmd[48];
|
|||
|
|
|
|||
|
|
/* EEPROM <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AT <20><><EFBFBD>̣<EFBFBD><CCA3>㴰<EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD> APP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
|
char cache[BLE_CACHE_LEN] = {0};
|
|||
|
|
eepromReadData(BLE_CACHE_ADDR, cache, BLE_CACHE_LEN);
|
|||
|
|
cache[BLE_CACHE_LEN - 1] = 0;
|
|||
|
|
if (strcmp(cache, BLE_NAME) == 0) {
|
|||
|
|
log_info("> BLE: <20><><EFBFBD><EFBFBD><EFBFBD>ѻ<EFBFBD><D1BB><EFBFBD>(%s)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", BLE_NAME);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* <20><>ѯ<EFBFBD><D1AF>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD> */
|
|||
|
|
BLE_PC5_LOW();
|
|||
|
|
ble_delay(1100); /* <20><><EFBFBD><EFBFBD> 1s <20><> AT ģʽ */
|
|||
|
|
BLE_PC5_HIGH();
|
|||
|
|
ble_delay(600); /* <20><>ģ<EFBFBD><C4A3><EFBFBD>л<EFBFBD><D0BB><EFBFBD> AT ģʽ */
|
|||
|
|
|
|||
|
|
ble_flush_rx();
|
|||
|
|
HAL_UART_Transmit(&huart1, (uint8_t *)"AT+NAME=?\r\n", 12, 500);
|
|||
|
|
const char *cur = NULL;
|
|||
|
|
int t = 30;
|
|||
|
|
while (t-- > 0 && !cur) {
|
|||
|
|
ble_delay(50);
|
|||
|
|
cur = USART1_GetCommand();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (cur && strstr(cur, BLE_NAME)) {
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>ֱ<EFBFBD>ӻ<EFBFBD><EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
|
log_info("> BLE: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %s<><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", BLE_NAME);
|
|||
|
|
ble_at_cmd("AT+TS=1", "OK", 1500);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* <20><>Ҫ<EFBFBD><D2AA><EFBFBD>ã<EFBFBD><C3A3><EFBFBD> AT+NAME<4D><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 3 <20>Σ<EFBFBD><CEA3><EFBFBD>
|
|||
|
|
* ע<EFBFBD>⣺<EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD>鵽<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>顪<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´ο<EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD> */
|
|||
|
|
int ok = -1;
|
|||
|
|
for (int i = 0; i < 3 && ok != 0; i++) {
|
|||
|
|
snprintf(cmd, sizeof(cmd), "AT+NAME=%s", BLE_NAME);
|
|||
|
|
ok = ble_at_cmd(cmd, "OK", 1500);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (ok == 0) {
|
|||
|
|
#if BLE_UUID_CUSTOM
|
|||
|
|
/* ˳<><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><CDB8> GATT UUID<49><44>FFE0/FFE1<45><31><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8> BLE <20><><EFBFBD><EFBFBD> APP <20><><EFBFBD><EFBFBD> */
|
|||
|
|
snprintf(cmd, sizeof(cmd), "AT+UUIDS=%s", BLE_UUID_SERVICE);
|
|||
|
|
ble_at_cmd(cmd, "OK", 1500);
|
|||
|
|
snprintf(cmd, sizeof(cmd), "AT+UUIDR=%s", BLE_UUID_TX);
|
|||
|
|
ble_at_cmd(cmd, "OK", 1500);
|
|||
|
|
snprintf(cmd, sizeof(cmd), "AT+UUIDW=%s", BLE_UUID_RX);
|
|||
|
|
ble_at_cmd(cmd, "OK", 1500);
|
|||
|
|
log_info("> BLE: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UUID <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
|||
|
|
#else
|
|||
|
|
log_info("> BLE: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ %s", BLE_NAME);
|
|||
|
|
#endif
|
|||
|
|
/* <20>ֲ<EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
|||
|
|
* ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>Ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٷ<EFBFBD> AT+TS=1 */
|
|||
|
|
for (int i = 0; i < 2; i++) {
|
|||
|
|
if (ble_at_cmd("AT+REBOOT=1", "OK", 1500) == 0) break;
|
|||
|
|
}
|
|||
|
|
eepromWriteData(BLE_CACHE_ADDR, (void *)BLE_NAME, strlen(BLE_NAME) + 1);
|
|||
|
|
} else {
|
|||
|
|
log_warn("> BLE: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>ģ<EFBFBD><C4A3>δ<EFBFBD>ӻ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>쳣<EFBFBD><ECB3A3>");
|
|||
|
|
ble_at_cmd("AT+TS=1", "OK", 1500); /* ȷ<><C8B7><EFBFBD>ص<EFBFBD><EFBFBD><CDB8> */
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* ǿ<><C7BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD> BLESET <20><><EFBFBD><EFBFBD><EEB4A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>建<EFBFBD><E5BBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
|
void ble_force_setup(void)
|
|||
|
|
{
|
|||
|
|
eepromWriteData(BLE_CACHE_ADDR, "", 1);
|
|||
|
|
ble_setup_name();
|
|||
|
|
}
|