LCD_ExternApp/ASW/uartapp.c
2025-05-26 10:35:10 +08:00

190 lines
5.2 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.

/** ##########################################################################
** Filename :
** Project :
** Module :
** Processor :
** Version : 1.0
** Compiler :
** Date/Time :
** Abstract :
** Contents :
** Note : 此文档用于规范代码书写;
* 注意,
* 1.所有文件用UTF-8格式
* 2.tab键空格4个
* 3.各模块,都要有 初始化函数 init, 反初始化函数 deinit,
* 周期任务task,进入休眠goto sleep,
* 唤醒后 goto wake ,判断是否可休眠judge_pre_sleep 等主要函数接口
* 4.
**
** (c) Copyright dmdz Co.,Ltd
** --------------------------------------------------------------------------
** R E V I S I O N H I S T O R Y
** --------------------------------------------------------------------------
** Date Ver Author Description
** -20191106- --V01-- --LYJ--- --初版--
** -20230602- --V1.0-- --mingyea--- --修改--
** #########################################################################*/
/*---------------------------------------------------------------------------
- I N C L U D E F I L E S
----------------------------------------------------------------------------*/
#include "uartapp.h"
#include "stdio.h"
#include "hardware.h"
#include <stdint.h>
#include "ud_31.h"
#include "ud_10.h"
/*---------------------------------------------------------------------------
- D E F I N E S / M A C R O S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
- T Y P E D E F I N I T I O N S
----------------------------------------------------------------------------*/
typedef enum
{
UARTAPP_INIT = 0,
UARTAPP_IDLE,
UARTAPP_RXCMD,
UARTAPP_STATENUM,
} uartapp_mainstate_type;
/*---------------------------------------------------------------------------
- S T A T I C V A R I A B L E S
----------------------------------------------------------------------------*/
static uartapp_mainstate_type task_state;
static uint8_t rxCpltFlag = 0;
static uint8_t rxbuf[512];
static uint16_t rxsize = 0, timeout_count = 0;
/*---------------------------------------------------------------------------
* G L O B A L V A R I A B L E S
----------------------------------------------------------------------------*/
extern UART_HandleTypeDef huart1;
extern uint32_t delaytest;
/*---------------------------------------------------------------------------
- C O N S T A N T S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
- F U N C T I O N P R O T O T Y P E
----------------------------------------------------------------------------*/
static void uartapp_cmdpro(uint8_t* data, uint16_t len);
// 重定向用于printf
#if __GNUC__
int _write(int fd, char* ptr, int len)
{
(void)fd;
// toggle_led(); // 这里测试是否走通
HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, HAL_MAX_DELAY);
return len;
}
#else
int __write(int handle, char* buf, int size)
{
if (handle == 1 || handle == 2)
{ // stdout 或 stderr
HAL_UART_Transmit(&huart1, (uint8_t*)buf, size, HAL_MAX_DELAY);
return size;
}
return -1;
}
#endif
void uartapp_init(void)
{
setvbuf(stdout, NULL, _IONBF, 0); // 禁用 stdout 缓冲printf 立即输出
task_state = UARTAPP_INIT;
}
static void maintask_gotoidle(void)
{
task_state = UARTAPP_IDLE;
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, rxbuf, 512);
rxCpltFlag = 0;
rxsize = 0;
timeout_count = 0;
}
void uartapp_maintask(void)
{
switch (task_state)
{
case UARTAPP_INIT:
__HAL_DMA_DISABLE_IT(huart1.hdmarx, DMA_IT_HT);
maintask_gotoidle();
break;
case UARTAPP_IDLE:
if (rxCpltFlag == 1)
{
task_state = UARTAPP_RXCMD;
timeout_count = 0;
}
timeout_count++;
if (timeout_count > 5000)
{
maintask_gotoidle();
// HAL_UART_Transmit(&huart1,txbuf,3,1000);
}
break;
case UARTAPP_RXCMD:
if (rxbuf[0] == 0x55 && rxbuf[1] == 0xaa && rxsize > 3)
{
uartapp_cmdpro(rxbuf + 2, rxsize - 2);
}
else
{
printf("err rxsize=%d\n", rxsize);
}
maintask_gotoidle();
break;
default:
break;
}
}
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef* huart, uint16_t Size)
{
if (huart->Instance == USART1)
{
rxCpltFlag = 1;
rxsize = Size;
toggle_led();
}
}
static void uartapp_cmdpro(uint8_t* data, uint16_t len)
{
switch (data[0]) // sid
{
case 0x31:
uartapp_cmd31(data + 1, len - 1);
break;
case 0x10:
uartapp_cmd10(data + 1, len - 1);
break;
default:
break;
}
}