84 lines
2.1 KiB
C
84 lines
2.1 KiB
C
#include "usart.h"
|
|
#include <string.h>
|
|
#include "cmd.h"
|
|
#include "log.h"
|
|
#include "main.h"
|
|
#include "dma.h"
|
|
#include <stdint.h>
|
|
#include "stm32l4xx_hal_uart.h"
|
|
#include "flash.h"
|
|
#include <stdio.h>
|
|
|
|
uint8_t cmdData[32];
|
|
uint8_t uart1len = 0;
|
|
extern DMA_HandleTypeDef hdma_usart1_rx;
|
|
|
|
FlashConfig_t *currentConfig;
|
|
|
|
|
|
void UART_CommandHandler(char *data, uint16_t len)
|
|
{
|
|
data[len] = '\0'; // 确保字符串结束
|
|
|
|
if (strncmp(data, "SETID", 5) == 0)
|
|
{
|
|
uint8_t id;
|
|
if (sscanf(data + 5, "%x", &id) == 1)
|
|
{
|
|
|
|
currentConfig = Flash_ReadConfig();
|
|
if(currentConfig->can_id != id)
|
|
{
|
|
_dbg_printf("Current ID: 0x%02X, New ID: 0x%02X\n", currentConfig->can_id, id);
|
|
currentConfig->can_id = id;
|
|
currentConfig->crc = id ^ 0xFF; // 简单校验
|
|
Flash_WriteConfig(currentConfig);
|
|
}
|
|
else
|
|
{
|
|
_dbg_printf("CAN ID unchanged: 0x%02X\n", id);
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void init_cmd(void)
|
|
{
|
|
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
|
|
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);
|
|
HAL_UART_Receive_DMA(&huart1, cmdData, sizeof(cmdData));
|
|
}
|
|
|
|
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
|
|
{
|
|
}
|
|
|
|
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
|
|
{
|
|
if (huart->Instance == USART1)
|
|
{
|
|
HAL_UART_DMAStop(huart);
|
|
uart1len = 0;
|
|
memset(cmdData, 0, sizeof(cmdData));
|
|
HAL_UART_Receive_DMA(huart, cmdData, sizeof(cmdData));
|
|
}
|
|
}
|
|
|
|
void usart_irq_dma_process(UART_HandleTypeDef *huart)
|
|
{
|
|
if (huart->Instance == USART1)
|
|
{
|
|
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) == SET)
|
|
{
|
|
__HAL_UART_CLEAR_IDLEFLAG(huart);
|
|
HAL_UART_DMAStop(huart);
|
|
uart1len = sizeof(cmdData) - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
|
|
UART_CommandHandler((char *)cmdData, uart1len);
|
|
memset(cmdData, 0, sizeof(cmdData));
|
|
HAL_UART_Receive_DMA(huart, cmdData, sizeof(cmdData));
|
|
}
|
|
}
|
|
}
|