Release:5.20灰测

This commit is contained in:
2026-05-21 10:01:28 +08:00
parent 8a5a32b139
commit fd65e9c6a2
68 changed files with 4329 additions and 1489 deletions

View File

@@ -0,0 +1,204 @@
/**
* @file drv_air724.c
* @brief 4G模块(AIR724)驱动
* @details 提供通道连接/断开、设置服务器地址、查询SIM/信号/链路状态的接口,
* 以及统一解析4G模块上行响应帧的入口。
*
* 协议55 AA mainCmd subCmd [payload] AA 55
*
* STM32 → 4G:
* 0x03 01 channel 连接请求
* 0x03 02 channel 断开请求
* 0x04 00 ip+port 设置服务器
* 0x05 01|02|03 查询ICCID/IMSI/IMEI
* 0x06 00 查询信号
* 0x07 00 查询链路
*
* 4G → STM32 (0x83):
* 0x83 01 channel 00 已连接
* 0x83 02 channel 00 已断开
* 0x83 03 channel 01 连接失败
*/
#include "drv_air724.h"
#include "drv_usart.h"
Air724_Info_t g_air724_info = {0};
/* ── 内部:构造并发送命令帧 ──────────────────────────── */
static void drv_air724_send_cmd(uint8_t main_cmd, uint8_t sub_cmd,
const uint8_t *payload, uint16_t payload_len)
{
uint8_t frame[256];
uint16_t idx = 0;
frame[idx++] = 0x55;
frame[idx++] = 0xAA;
frame[idx++] = main_cmd;
frame[idx++] = sub_cmd;
if (payload && payload_len > 0) {
memcpy(&frame[idx], payload, payload_len);
idx += payload_len;
}
frame[idx++] = 0xAA;
frame[idx++] = 0x55;
Air724_Message_Send(frame, idx);
}
/* ── 发送函数 ──────────────────────────────────────── */
void drv_air724_set_server(const char *ip, uint16_t port)
{
if (!ip) return;
uint8_t payload[128];
uint8_t ip_len = (uint8_t)strlen(ip);
if (ip_len > 100) ip_len = 100;
payload[0] = ip_len;
memcpy(&payload[1], ip, ip_len);
payload[1 + ip_len] = (uint8_t)((port >> 8) & 0xFF);
payload[2 + ip_len] = (uint8_t)(port & 0xFF);
drv_air724_send_cmd(0x04, 0, payload, 3 + ip_len);
}
void drv_air724_connect_channel(uint8_t channel)
{
if (channel < 1 || channel > AIR724_SOCKET_MAX) {
printf("4G: 通道 %d 无效\r\n", channel);
return;
}
drv_air724_send_cmd(0x03, 0x01, &channel, 1);
printf("4G: 通道 %d 连接请求已发送\r\n", channel);
}
void drv_air724_disconnect_channel(uint8_t channel)
{
if (channel < 1 || channel > AIR724_SOCKET_MAX) {
printf("4G: 通道 %d 无效\r\n", channel);
return;
}
drv_air724_send_cmd(0x03, 0x02, &channel, 1);
printf("4G: 通道 %d 断开请求已发送\r\n", channel);
}
void drv_air724_query_iccid(void)
{
drv_air724_send_cmd(0x05, 0x01, NULL, 0);
}
void drv_air724_query_imsi(void)
{
drv_air724_send_cmd(0x05, 0x02, NULL, 0);
}
void drv_air724_query_imei(void)
{
drv_air724_send_cmd(0x05, 0x03, NULL, 0);
}
void drv_air724_query_signal(void)
{
drv_air724_send_cmd(0x06, 0x00, NULL, 0);
}
void drv_air724_query_link_status(void)
{
drv_air724_send_cmd(0x07, 0x00, NULL, 0);
}
/* ── 统一解析入口 ───────────────────────────────────── */
void drv_air724_parse_response(const uint8_t *frame, uint16_t len)
{
if (!frame || len < 7) return;
uint8_t main_cmd = frame[2];
uint8_t sub_cmd = frame[3];
switch (main_cmd) {
/* ── 0x83: 连接/断开/失败通知 ── */
case 0x83:
if (len >= 7) {
uint8_t socket_id = frame[4];
if (socket_id < 1 || socket_id > AIR724_SOCKET_MAX) break;
switch (sub_cmd) {
case 0x01:
g_air724_info.socket_connected[socket_id - 1] = 1;
printf("4G: 通道 %d 连接成功\r\n", socket_id);
break;
case 0x02:
g_air724_info.socket_connected[socket_id - 1] = 0;
printf("4G: 通道 %d 已断开\r\n", socket_id);
break;
case 0x03:
g_air724_info.socket_connected[socket_id - 1] = 0;
printf("4G: 通道 %d 连接失败\r\n", socket_id);
break;
}
}
break;
/* ── 0x84: SIM信息响应 ── */
case 0x84: {
if (len < 5) break;
uint8_t data_len = frame[4];
if (data_len == 0 || len < (uint16_t)(5 + data_len)) break;
switch (sub_cmd) {
case 0x01:
memcpy(g_air724_info.iccid, &frame[5], data_len < 23 ? data_len : 23);
g_air724_info.iccid[data_len < 23 ? data_len : 23] = '\0';
printf("4G: ICCID=%s\r\n", g_air724_info.iccid);
break;
case 0x02:
memcpy(g_air724_info.imsi, &frame[5], data_len < 15 ? data_len : 15);
g_air724_info.imsi[data_len < 15 ? data_len : 15] = '\0';
printf("4G: IMSI=%s\r\n", g_air724_info.imsi);
break;
case 0x03:
memcpy(g_air724_info.imei, &frame[5], data_len < 15 ? data_len : 15);
g_air724_info.imei[data_len < 15 ? data_len : 15] = '\0';
printf("4G: IMEI=%s\r\n", g_air724_info.imei);
break;
}
break;
}
/* ── 0x85: 信号强度响应 ── */
case 0x85:
if (len >= 7) {
g_air724_info.csq = frame[4];
g_air724_info.ber = frame[5];
printf("4G: CSQ=%d, BER=%d\r\n", g_air724_info.csq, g_air724_info.ber);
}
break;
/* ── 0x86: 链路状态响应 ── */
case 0x86: {
uint8_t count = (len - 6) < AIR724_SOCKET_MAX ? (len - 6) : AIR724_SOCKET_MAX;
for (uint8_t i = 0; i < count; i++) {
g_air724_info.socket_connected[i] = frame[4 + i];
}
printf("4G: 链路[");
for (uint8_t i = 0; i < AIR724_SOCKET_MAX; i++) {
printf("%d", g_air724_info.socket_connected[i]);
}
printf("]\r\n");
break;
}
/* ── 0x87: 服务器配置结果 ── */
case 0x87:
if (len >= 6) {
printf("4G: 服务器配置%s\r\n", frame[4] == 0 ? "成功" : "失败");
}
break;
}
}

View File

@@ -0,0 +1,39 @@
#ifndef __DRVAIR724_H
#define __DRVAIR724_H
/* includes ----------------------------------------------------------------------------------------------*/
#include "global.h"
/* macro ------------------------------------------------------------------------------------------------*/
#define AIR724_SOCKET_MAX 6
/* struct -----------------------------------------------------------------------------------------------*/
typedef struct {
char iccid[24];
char imsi[16];
char imei[16];
uint8_t csq;
uint8_t ber;
uint8_t socket_connected[AIR724_SOCKET_MAX];
} Air724_Info_t;
/* Exported functions prototypes ------------------------------------------------------------------------*/
void drv_all_init(void);
/* ── 查询发送函数STM32 → 4G── */
void drv_air724_set_server(const char *ip, uint16_t port);
void drv_air724_connect_channel(uint8_t channel);
void drv_air724_disconnect_channel(uint8_t channel);
void drv_air724_query_iccid(void);
void drv_air724_query_imsi(void);
void drv_air724_query_imei(void);
void drv_air724_query_signal(void);
void drv_air724_query_link_status(void);
/* ── 统一解析入口4G → STM32── */
void drv_air724_parse_response(const uint8_t *frame, uint16_t len);
/* Exported constants -----------------------------------------------------------------------------------*/
extern Air724_Info_t g_air724_info;
#endif /* __DRVAIR724_H */

View File

@@ -13,31 +13,6 @@
#include "flash_config.h"
/* code -----------------------------------------------------------------------*/
void send_cmd_to_air724(uint8_t *cmd, uint16_t len)
{
Air724_Message_Send(cmd, len);
}
void send_server_address_to_air724(void)
{
char ip[] = YKC_SERVER_IP;
char port[6];
sprintf(port, "%d", YKC_SERVER_PORT);
uint8_t len = strlen(ip) + 1 + strlen(port);
uint8_t config_cmd[256] = {0x55, 0xAA, 0x04, 0x00, len};
uint8_t pos = 5;
memcpy(&config_cmd[pos], ip, strlen(ip));
pos += strlen(ip);
config_cmd[pos++] = 0x00;
memcpy(&config_cmd[pos], port, strlen(port));
pos += strlen(port);
config_cmd[pos++] = 0xAA;
config_cmd[pos++] = 0x55;
send_cmd_to_air724(config_cmd, pos);
pos = 0;
memset(config_cmd, 0, sizeof(config_cmd));
}
/**
* @brief drv_all_Init所有传感器、外设芯片、外部设备初始化
@@ -49,8 +24,9 @@ void send_server_address_to_air724(void)
* @retval none
*/
void drv_all_Init(void)
void drv_all_init(void)
{
AIR724_RESET(); /* AIR724 复位 */
stm_flash_init();/* 初始化flash */
drv_usart_init();/* 初始化所有串口 */
stm_flash_init();/* 初始化flash管理器 */
}

View File

@@ -8,7 +8,7 @@
/* Exported functions prototypes ------------------------------------------------------------------------*/
void drv_all_Init(void);
void drv_all_init(void);
#endif /* __DRVINIT_H */

View File

@@ -0,0 +1,147 @@
/**
******************************************************************************
* @file user\hal\_hal_usart.c
* @author luhuaishuai
* @version v0.1
* @date 2026-1-12
* @brief Briefly describe the function of your function
******************************************************************************
*/
/* Includes -------------------------------------------------------------------*/
#include "drv_usart.h"
/* variables ------------------------------------------------------------------*/
uint8_t uart1_rx_buffer[UART1_RX_BUFFER_SIZE];
uint8_t uart1_tx_buffer[UART1_TX_BUFFER_SIZE];
uint8_t uart3_rx_buffer[UART3_RX_BUFFER_SIZE];
uint8_t uart3_tx_buffer[UART3_TX_BUFFER_SIZE];
static SemaphoreHandle_t air724_tx_mutex = NULL;
/* code -----------------------------------------------------------------------*/
/**
* @brief fputcprintf映射
*
* @note none
*
* @param none
*
* @retval none
*/
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart6, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
/**
* @brief Air724_Message_Send4G数据发送
*
* @note none
*
* @param none
*
* @retval none
*/
void Air724_Message_Send(uint8_t *data, uint16_t len)
{
if (air724_tx_mutex != NULL)
{
if (xSemaphoreTake(air724_tx_mutex, portMAX_DELAY) == pdTRUE)
{
HAL_UART_Transmit(&huart1, data, len, HAL_MAX_DELAY);
xSemaphoreGive(air724_tx_mutex);
}
}
else
{
HAL_UART_Transmit(&huart1, data, len, HAL_MAX_DELAY);
}
}
void Rs485_Message_Send(uint8_t *data, uint16_t len)
{
RS485_EN(1);
HAL_UART_Transmit(&huart3, data, len, HAL_MAX_DELAY);
RS485_EN(0);
}
/**
* @brief drv_usart_init所有串口初始化
*
* @note none
*
* @param none
*
* @retval none
*/
void drv_usart_init(void)
{
air724_tx_mutex = xSemaphoreCreateMutex();
/* 初始化串口1 */
Air724_Message_Queue_Init(); // 初始化4G数据接收队列
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart1, uart1_rx_buffer, UART1_RX_BUFFER_SIZE);
/* 初始化串口3 */
RS485_Message_Queue_Init(); // 初始化RS485数据接收队列
__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart3, uart3_rx_buffer, UART3_RX_BUFFER_SIZE);
RS485_EN(0);
}
/**
* @brief HAL_UARTEx_RxEventCallback串口接收完成中断处理函数
*
* @note none
*
* @param none
*
* @retval none
*/
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if (huart->Instance == USART1)
{
SCB_InvalidateDCache_by_Addr((uint32_t *)uart1_rx_buffer, UART1_RX_BUFFER_SIZE);
air724_callback_fun();
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, (uint8_t *)uart1_rx_buffer, UART1_RX_BUFFER_SIZE);
}
else if (huart->Instance == USART3)
{
SCB_InvalidateDCache_by_Addr((uint32_t *)uart3_rx_buffer, UART3_RX_BUFFER_SIZE);
rs485_callback_fun();
HAL_UARTEx_ReceiveToIdle_DMA(&huart3, (uint8_t *)uart3_rx_buffer, UART3_RX_BUFFER_SIZE);
}
}
/**
* @brief air724_callback_fun4G数据接收回调函数
*
* @note none
*
* @param none
*
* @retval none
*/
void air724_callback_fun()
{
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
xQueueSendFromISR(Air724_Message_Queue, uart1_rx_buffer, &xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
memset(uart1_rx_buffer, 0, UART1_RX_BUFFER_SIZE);
}
void rs485_callback_fun()
{
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
xQueueSendFromISR(RS485_Message_Queue, uart3_rx_buffer, &xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
memset(uart3_rx_buffer, 0, UART3_RX_BUFFER_SIZE);
}

View File

@@ -0,0 +1,35 @@
#ifndef __DRV_USART_H
#define __DRV_USART_H
/* Suppress warning messages */
#if defined(__CC_ARM)
// Suppress warning message: extended constant initialiser used
#pragma diag_suppress 1296
#elif defined(__ICCARM__)
#elif defined(__GNUC__)
#endif
/* includes ----------------------------------------------------------------------------------------------*/
#include "global.h"
/* macro ------------------------------------------------------------------------------------------------*/
#define UART1_TX_BUFFER_SIZE 512
#define UART1_RX_BUFFER_SIZE 512
#define UART3_TX_BUFFER_SIZE 256
#define UART3_RX_BUFFER_SIZE 256
/* global variable ---------------------------------------------------------------------------------------*/
extern uint8_t uart1_rx_buffer[UART1_RX_BUFFER_SIZE];
extern uint8_t uart1_tx_buffer[UART1_TX_BUFFER_SIZE];
extern uint8_t uart3_rx_buffer[UART3_RX_BUFFER_SIZE];
extern uint8_t uart3_tx_buffer[UART3_TX_BUFFER_SIZE];
/* function prototype ------------------------------------------------------------------------------------*/
extern void drv_usart_init(void); // 初始化所有串口
extern void air724_callback_fun(void); // 4G数据接收回调函数
extern void rs485_callback_fun(void); // RS485数据接收回调函数
extern void Air724_Message_Send(uint8_t *data, uint16_t len); // 4G数据发送函数
extern void Rs485_Message_Send(uint8_t *data, uint16_t len); // RS485数据发送函数
#endif /* __DRV_USART_H */

View File

@@ -102,19 +102,8 @@ uint8_t flash_sector_erase(uint32_t addr)
return 1;
}
flash_manage_t stm_flash_manage = {0};
/* demo */
// stm_flash_read(data[0], 1);
// stm_flash_read(data[1], 0);
// stm_flash_read(data[0], 1);
// stm_flash_read(data[1], 0);
// stm_flash_write("12345678912345678912345678912345678912345", 41, 1);
// stm_flash_write("abcdef", 6, 0);
// stm_flash_write("12345678912345678912345678912345678912345", 41, 1);
// stm_flash_write("abcdef", 6, 0);
void stm_flash_init(void)
{
stm_flash_manage.align_num = 32;