From f29631c2b4a11f72fe7205e2a082182869c1eedb Mon Sep 17 00:00:00 2001 From: zhaohe Date: Mon, 1 Jul 2024 19:09:59 +0800 Subject: [PATCH] update --- stm32/gins.h | 4 ++++ stm32/stm32irq.c | 26 +++++++++++++++++++++++++- zqueue.cpp | 41 ----------------------------------------- zqueue.hpp | 34 ++++++++++++++++++++++++++++------ 4 files changed, 57 insertions(+), 48 deletions(-) diff --git a/stm32/gins.h b/stm32/gins.h index 24a7e0e..1f9d1a1 100644 --- a/stm32/gins.h +++ b/stm32/gins.h @@ -75,6 +75,10 @@ EXTERN_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart3_tx); EXTERN_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart4_rx); EXTERN_GLOBAL_PTR(DMA_HandleTypeDef, hdma_usart4_tx); + +// void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size); + + #ifdef __cplusplus } #endif diff --git a/stm32/stm32irq.c b/stm32/stm32irq.c index 62e11ae..b199ef8 100644 --- a/stm32/stm32irq.c +++ b/stm32/stm32irq.c @@ -51,4 +51,28 @@ void UART4_IRQHandler(void) { HAL_UART_IRQHandler(&huart4); } /*********************************************************************************************************************** * EXT * - ***********************************************************************************************************************/ \ No newline at end of file + ***********************************************************************************************************************/ + +void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { // + huart->USR_DMARxSize = Size; +} +void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { + + + static uint8_t rx; + if (huart->USR_UartITRxing) { + if (huart->USR_UartITRxOff < huart->USR_UartITRxBufSize) { + huart->USR_UartITRxBuf[huart->USR_UartITRxOff] = huart->USR_UartITRxBufCache; + huart->USR_UartITRxOff++; + } else { + } + huart->USR_UartITLastRxTicket = HAL_GetTick(); + HAL_UART_Receive_IT(huart, &huart->USR_UartITRxBufCache, 1); + } +} + +void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) { + if (huart->USR_UartITRxing) { + HAL_UART_Receive_IT(huart, &huart->USR_UartITRxBufCache, 1); + } +} diff --git a/zqueue.cpp b/zqueue.cpp index caffb21..7ae844c 100644 --- a/zqueue.cpp +++ b/zqueue.cpp @@ -3,44 +3,3 @@ #include "logger.h" using namespace iflytop; #define TAG "ZQueue" -void ZQueue::initialize(int32_t num, int32_t eachsize) { // - xQueue = xQueueCreate(num, eachsize); - ZASSERT(xQueue); -} -void ZQueue::clear() { xQueueReset(xQueue); } - -bool ZQueue::send(uint8_t *data, size_t len, int32_t overtime) { - BaseType_t xStatus; - xStatus = xQueueSend(xQueue, data, overtime); - if (xStatus == pdPASS) { - return true; - } else { - return false; - } -} -bool ZQueue::receive(uint8_t *data, size_t *len, int32_t overtime) { - BaseType_t xStatus; - xStatus = xQueueReceive(xQueue, data, overtime); - if (xStatus == pdPASS) { - return true; - } else { - return false; - } -} - -bool ZQueue::isFull() { - BaseType_t xStatus = xQueueIsQueueFullFromISR(xQueue); - if (xStatus == pdTRUE) { - return true; - } else { - return false; - } -} -bool ZQueue::isEmpty() { - BaseType_t xStatus = xQueueIsQueueEmptyFromISR(xQueue); - if (xStatus == pdTRUE) { - return true; - } else { - return false; - } -} \ No newline at end of file diff --git a/zqueue.hpp b/zqueue.hpp index 463d1e0..d8cf19e 100644 --- a/zqueue.hpp +++ b/zqueue.hpp @@ -1,6 +1,8 @@ #pragma once #include "cmsis_os.h" +#include "logger.h" namespace iflytop { +template class ZQueue { private: int32_t m_num = 0; @@ -8,13 +10,33 @@ class ZQueue { QueueHandle_t xQueue; public: - void initialize(int32_t num, int32_t eachsize); - void clear(); - bool send(uint8_t *data, size_t len, int32_t overtime); - bool receive(uint8_t *data, size_t *len, int32_t overtime); + void initialize(int32_t num, int32_t eachsize) { + xQueue = xQueueCreate(num, eachsize); + ZASSERT(xQueue); + } + void clear() { xQueueReset(xQueue); } - bool isFull(); - bool isEmpty(); + bool send(T *data, int32_t overtime) { return _send((uint8_t *)data, sizeof(T), overtime); } + bool receive(T *data, int32_t overtime) { return _receive((uint8_t *)data, overtime); } + + bool isFull() { + BaseType_t xStatus = xQueueIsQueueFullFromISR(xQueue); + return xStatus == pdTRUE; + } + bool isEmpty() { + BaseType_t xStatus = xQueueIsQueueEmptyFromISR(xQueue); + return xStatus == pdTRUE; + } + + private: + bool _send(uint8_t *data, int32_t len, int32_t overtime) { + BaseType_t xStatus = xQueueSend(xQueue, data, overtime); + return xStatus == pdPASS; + } + bool _receive(uint8_t *data, int32_t overtime) { + BaseType_t xStatus = xQueueReceive(xQueue, data, overtime); + return xStatus == pdPASS; + } }; } // namespace iflytop