225 lines
5.7 KiB
C
225 lines
5.7 KiB
C
/**
|
||
* @file app_hart.c
|
||
* @author xxx
|
||
* @date 2023-07-06 13:08:52
|
||
* @brief 此文件主要实现板卡的HART功能
|
||
* @copyright Copyright (c) 2023 by xxx, All Rights Reserved.
|
||
*/
|
||
|
||
#include "app.h"
|
||
//#include "hart_frame.h"
|
||
#include "uarts.h"
|
||
//#include "test_bsp.h"
|
||
#include "at_hc24.h"
|
||
|
||
#define HART_UART1 USART1
|
||
#define HART_UART2 UART5
|
||
|
||
#define UART_RXSIZE (240u) // 接收240个字节
|
||
#define UART_TXSIZE (240u) // 发送240个字节
|
||
uart_t *uarts[APP_UART_MAX];
|
||
|
||
app_dynamics_t app_dynamics;
|
||
static volatile BOOL hart_idle = TRUE;
|
||
|
||
/**
|
||
* @brief 蓝牙输出
|
||
* @param {uint8_t} *data
|
||
* @param {uint16_t} len
|
||
* @return {*}
|
||
* @note
|
||
*/
|
||
static void h24_bluetooth_output(uint8_t *data, uint16_t len)
|
||
{
|
||
if (uarts[APP_UART_2] != NULL)
|
||
{
|
||
uart_send_data(uarts[APP_UART_2], data, len);
|
||
}
|
||
}
|
||
|
||
void h24_bluetooth_output_dbg(uint8_t *data, uint16_t len)
|
||
{
|
||
#if H24_BLE_OUTPUT_DBG == TRUE
|
||
h24_bluetooth_output(data, len);
|
||
#endif
|
||
}
|
||
|
||
/**
|
||
* @brief 蓝牙H24模块配置工作
|
||
* @return {*}
|
||
* @note
|
||
*/
|
||
void h24_bluetooth_work(uint8_t index)
|
||
{
|
||
uint8_t len = 0;
|
||
char data[128];
|
||
osel_memset((uint8_t *)data, 0, 128);
|
||
#ifdef V4
|
||
char device_id[] = "LP4-???";
|
||
#elif V5
|
||
char device_id[] = "LP5-???";
|
||
#else
|
||
char device_id[] = "LP3-???";
|
||
#endif
|
||
char *test_cmd[AT_END] = {
|
||
"AT",
|
||
"AT+NAME",
|
||
"AT+NAME=%s",
|
||
};
|
||
switch (index)
|
||
{
|
||
case 1:
|
||
{
|
||
hc_24_state = 0;
|
||
sprintf(data, test_cmd[AT_CMD_TEST]);
|
||
len = osel_mstrlen((unsigned char *)data);
|
||
h24_bluetooth_output((uint8_t *)data, len);
|
||
break;
|
||
}
|
||
|
||
case 2:
|
||
{
|
||
at_set_memcmp_cache((unsigned char *)device_id, osel_mstrlen((unsigned char *)device_id));
|
||
sprintf(data, test_cmd[AT_CMD_NAME_REQ]);
|
||
len = osel_mstrlen((unsigned char *)data);
|
||
h24_bluetooth_output((uint8_t *)data, len);
|
||
break;
|
||
}
|
||
|
||
case 3:
|
||
{
|
||
at_set_memcmp_cache((unsigned char *)device_id, osel_mstrlen((unsigned char *)device_id));
|
||
sprintf(data, test_cmd[AT_CMD_NAME], device_id);
|
||
len = osel_mstrlen((unsigned char *)data);
|
||
h24_bluetooth_output((uint8_t *)data, len);
|
||
break;
|
||
}
|
||
|
||
case 4:
|
||
{
|
||
sprintf(data, "%f,%f,%f\r\n", 1.1, 2.2, 3.3);
|
||
len = osel_mstrlen((unsigned char *)data);
|
||
h24_bluetooth_output((uint8_t *)data, len);
|
||
break;
|
||
}
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
// 串口1、5接收中断回调函数
|
||
static void hart_rx_cb(uint8_t uart_index, uint8_t *data, uint16_t len)
|
||
{
|
||
DBG_ASSERT(uart_index < APP_UART_MAX __DBG_LINE);
|
||
hart_idle = FALSE;
|
||
if (len >= 2)
|
||
{
|
||
if (data[0] == 'O' && data[1] == 'K') // 蓝牙协议
|
||
{
|
||
data[0] = 'A';
|
||
data[1] = 'T';
|
||
at_cmd_parse(data, len);
|
||
}
|
||
else
|
||
{
|
||
|
||
}
|
||
}
|
||
hart_idle = TRUE;
|
||
}
|
||
|
||
static void hart_tx_complete_cb(void)
|
||
{
|
||
// 串口1发送完成回调函数
|
||
HART_RTS_ON();
|
||
}
|
||
|
||
// HART协议的使用的串口 --- 串口1
|
||
void hart_uart_init(void)
|
||
{
|
||
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1);
|
||
GPIO_SET_OUTPUT(HART_PWR_GPIO_Port, HART_PWR_Pin);
|
||
GPIO_SET_OUTPUT(HART_RST_GPIO_Port, HART_RST_Pin);
|
||
GPIO_SET_OUTPUT(HART_RTS_GPIO_Port, HART_RTS_Pin);
|
||
GPIO_SET_ALTERNATE(HART_TX_GPIO_Port, HART_TX_Pin);
|
||
GPIO_SET_ALTERNATE(HART_RX_GPIO_Port, HART_RX_Pin);
|
||
LL_mDelay(10);
|
||
// 串口1初始化开始
|
||
HART_RTS_ON();
|
||
HART_RST_OFF();
|
||
LL_mDelay(20);
|
||
HART_RST_ON();
|
||
HART_EN_DISABLE();
|
||
HART_EN_ENABLE();
|
||
HART_RTS_ON();
|
||
if (uarts[APP_UART_1] == NULL)
|
||
{
|
||
LL_mDelay(100);
|
||
uarts[APP_UART_1] = uart_create(HART_UART1, TRUE, UART_RXSIZE, hart_rx_cb, TRUE, UART_TXSIZE, hart_tx_complete_cb);
|
||
uarts[APP_UART_1]->uart_index = APP_UART_1;
|
||
uarts[APP_UART_1]->dma = DMA2;
|
||
uarts[APP_UART_1]->dma_rx_channel = LL_DMA_CHANNEL_7;
|
||
uarts[APP_UART_1]->dma_tx_channel = LL_DMA_CHANNEL_6;
|
||
uart_recv_en(uarts[APP_UART_1]);
|
||
}
|
||
// 串口1初始化结束
|
||
}
|
||
|
||
// HART协议使用的串口,为模拟IO口
|
||
void hart_uart_dinit(void)
|
||
{
|
||
HART_EN_DISABLE();
|
||
LL_APB2_GRP1_DisableClock(LL_APB2_GRP1_PERIPH_USART1);
|
||
LL_USART_Disable(USART1);
|
||
GPIO_SET_ANALOG(HART_PWR_GPIO_Port, HART_PWR_Pin);
|
||
GPIO_SET_ANALOG(HART_RST_GPIO_Port, HART_RST_Pin);
|
||
GPIO_SET_ANALOG(HART_CD_GPIO_Port, HART_CD_Pin);
|
||
GPIO_SET_ANALOG(HART_TX_GPIO_Port, HART_TX_Pin);
|
||
GPIO_SET_ANALOG(HART_RX_GPIO_Port, HART_RX_Pin);
|
||
}
|
||
|
||
// 蓝牙模块串口初始化
|
||
void hart_ble_init(void)
|
||
{
|
||
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_UART5);
|
||
GPIO_SET_OUTPUT(BLE_PWR_GPIO_Port, BLE_PWR_Pin);
|
||
GPIO_SET_INPUT(BLE_RST_GPIO_Port, BLE_RST_Pin);
|
||
GPIO_SET_ALTERNATE(BLE_TX_GPIO_Port, BLE_TX_Pin);
|
||
GPIO_SET_ALTERNATE(BLE_RX_GPIO_Port, BLE_RX_Pin);
|
||
BLE_EN_ENABLE();
|
||
if (uarts[APP_UART_2] == NULL)
|
||
{
|
||
LL_mDelay(100);
|
||
uarts[APP_UART_2] = uart_create(HART_UART2, TRUE, UART_RXSIZE, hart_rx_cb, TRUE, UART_TXSIZE, NULL);
|
||
uarts[APP_UART_2]->uart_index = APP_UART_2;
|
||
uarts[APP_UART_2]->dma = DMA2;
|
||
uarts[APP_UART_2]->dma_rx_channel = LL_DMA_CHANNEL_2;
|
||
uarts[APP_UART_2]->dma_tx_channel = LL_DMA_CHANNEL_1;
|
||
uart_recv_en(uarts[APP_UART_2]);
|
||
}
|
||
}
|
||
|
||
// 蓝牙模块端口IO口反初始化
|
||
void hart_ble_dinit(void)
|
||
{
|
||
// 关闭蓝牙串口
|
||
BLE_EN_DISABLE();
|
||
LL_APB1_GRP1_DisableClock(LL_APB1_GRP1_PERIPH_UART5);
|
||
LL_USART_Disable(UART5);
|
||
// 端口转成模拟IO口
|
||
GPIO_SET_ANALOG(BLE_PWR_GPIO_Port, BLE_PWR_Pin);
|
||
GPIO_SET_ANALOG(BLE_RST_GPIO_Port, BLE_RST_Pin);
|
||
GPIO_SET_ANALOG(BLE_TX_GPIO_Port, BLE_TX_Pin);
|
||
GPIO_SET_ANALOG(BLE_RX_GPIO_Port, BLE_RX_Pin);
|
||
}
|
||
|
||
// 判断是否闲置的结果
|
||
BOOL app_hart_is_idle(void)
|
||
{
|
||
return hart_idle;
|
||
}
|
||
|
||
|
||
|
||
|