190 lines
5.2 KiB
C
190 lines
5.2 KiB
C
/** ##########################################################################
|
||
** 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;
|
||
}
|
||
}
|
||
|