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