This repository has been archived on 2025-02-28. You can view files and clone it, but cannot push or open issues or pull requests.
controller-hd/User/app_hart.c

225 lines
5.7 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @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;
}