shuichan_old/STM32F103_App1/HardWare/USER_CMD/ble_at.c

207 lines
6.6 KiB
C
Raw Permalink Normal View History

/* 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
/* BT_RST(PA7)<29><><EFBFBD>ߵ<EFBFBD>ƽ<EFBFBD><C6BD>λģ<CEBB>飬Ĭ<E9A3AC>ϵ͵<CFB5>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>system.c <20>ѳ<EFBFBD>ʼ<EFBFBD><CABC>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD> */
#define BLE_RST_PORT GPIOA
#define BLE_RST_PIN GPIO_PIN_7
#define BLE_RST_HIGH() HAL_GPIO_WritePin(BLE_RST_PORT, BLE_RST_PIN, GPIO_PIN_SET)
#define BLE_RST_LOW() HAL_GPIO_WritePin(BLE_RST_PORT, BLE_RST_PIN, GPIO_PIN_RESET)
#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_POWER_ADDR 158 /* EEPROM<4F><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õķ<C3B5><C4B7><EFBFBD>ʣ<EFBFBD>132~157 <20><><EFBFBD>ƻ<EFBFBD><C6BB><EFBFBD>, 160 <20><>־<EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD> */
#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><D0A3><EFBFBD><EFBFBD><EFBFBD>+<2B><><EFBFBD>ʶ<EFBFBD><CAB6>ԣ<EFBFBD><D4A3><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;
uint8_t pwr_cache = 0xFF;
eepromReadData(BLE_POWER_ADDR, &pwr_cache, 1);
if (strcmp(cache, BLE_NAME) == 0 && pwr_cache == BLE_TX_POWER) {
log_info("> BLE: <20><><EFBFBD><EFBFBD><EFBFBD>ѻ<EFBFBD><D1BB><EFBFBD>(%s/<2F><><EFBFBD><EFBFBD>%d)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", BLE_NAME, BLE_TX_POWER);
return;
}
/* <20><>Ӳ<EFBFBD><D3B2>λһ<CEBB><D2BB>ģ<EFBFBD>飨PA7 <20><><EFBFBD><EFBFBD> 100ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹģ<D6B9><C4A3>״̬<D7B4>쳣ʱ PC5 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AT ģʽ<C4A3><CABD>
* ֻ<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> */
BLE_RST_HIGH();
ble_delay(100);
BLE_RST_LOW();
ble_delay(1500); /* <20><>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/* AT <20><><EFBFBD><EFBFBD><EFBFBD>ھ<EFBFBD><DABE><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE>UART1 <20><>ģ<EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD>־<EFBFBD>ֽڻ<D6BD><DABB><EFBFBD>Ⱦģ<C8BE><C4A3><EFBFBD><EFBFBD> AT <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
log_mute(1);
/* <20><> AT ģʽ<C4A3><CABD><EFBFBD><EFBFBD>ѯ<EFBFBD><D1AF>ǰ<EFBFBD><C7B0><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> PC5 <20><><EFBFBD>ԣ<EFBFBD><D4A3><EFBFBD><EFBFBD><EFBFBD> 3 <20><> */
const char *cur = NULL;
for (int round = 0; round < 3 && !cur; round++) {
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);
int t = 30;
while (t-- > 0 && !cur) {
ble_delay(50);
cur = USART1_GetCommand();
}
}
if (!cur) {
log_mute(0);
log_warn("> BLE: 3 <20><> AT <20><><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>δ<EFBFBD><CEB4>/<2F><><EFBFBD>ֻ<EFBFBD>ռ<EFBFBD><D5BC>/PC5 δ<><CEB4><EFBFBD>ͣ<EFBFBD>");
return;
}
if (strstr(cur, BLE_NAME) && pwr_cache == BLE_TX_POWER) {
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD>ȷ<EFBFBD><C8B7>ֱ<EFBFBD>ӻ<EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD> */
ble_at_cmd("AT+TS=1", "OK", 1500);
log_mute(0);
log_info("> BLE: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %s<><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", BLE_NAME);
return;
}
if (strstr(cur, BLE_NAME)) {
/* <20><><EFBFBD>ƶԵ<C6B6><D4B5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ˣ<EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><E4B9A6> */
snprintf(cmd, sizeof(cmd), "AT+RFPOWER=%d", BLE_TX_POWER);
ble_at_cmd(cmd, "OK", 1500);
ble_at_cmd("AT+REBOOT=1", "OK", 1500);
uint8_t p = BLE_TX_POWER;
eepromWriteData(BLE_POWER_ADDR, &p, 1);
log_mute(0);
log_info("> BLE: <20><><EFBFBD><EFBFBD><E4B9A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ %d", BLE_TX_POWER);
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);
#endif
/* ˳<><CBB3><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><C3B7><EFBFBD><E4B9A6> */
snprintf(cmd, sizeof(cmd), "AT+RFPOWER=%d", BLE_TX_POWER);
ble_at_cmd(cmd, "OK", 1500);
/* <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);
{
uint8_t p = BLE_TX_POWER;
eepromWriteData(BLE_POWER_ADDR, &p, 1);
}
log_mute(0);
log_info("> BLE: <20><><EFBFBD><EFBFBD>/UUID/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
} else {
ble_at_cmd("AT+TS=1", "OK", 1500); /* ȷ<><C8B7><EFBFBD>ص<EFBFBD>͸<EFBFBD><CDB8> */
log_mute(0);
log_warn("> BLE: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>ģ<EFBFBD><C4A3>δ<EFBFBD>ӻ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><ECB3A3>");
}
}
/* ǿ<><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();
}