75 lines
2.6 KiB
C
75 lines
2.6 KiB
C
#include "bsp_usart.h"
|
|
#include "stdlib.h"
|
|
|
|
/* usart service instance,modules' info would be recoreded here using ModuleRegister() */
|
|
static usart_instance* instance[DEVICE_USART_CNT];
|
|
|
|
/**
|
|
* @brief usart service will start automatically, after each module registered
|
|
*
|
|
* @param _instance instance owned by module
|
|
*/
|
|
static void USARTServiceInit(usart_instance* _instance)
|
|
{
|
|
HAL_UARTEx_ReceiveToIdle_DMA(_instance->usart_handle, _instance->recv_buff, _instance->recv_buff_size);
|
|
__HAL_DMA_DISABLE_IT(_instance->usart_handle->hdmarx, DMA_IT_HT);
|
|
}
|
|
|
|
void USARTRegister(usart_instance* _instance)
|
|
{
|
|
static instance_idx;
|
|
_instance->recv_buff=(uint8_t*)malloc(_instance->recv_buff_size*sizeof(uint8_t));
|
|
USARTServiceInit(_instance);
|
|
instance[instance_idx++]=_instance;
|
|
}
|
|
|
|
void USARTSend(usart_instance* _instance,uint8_t* send_buf, uint16_t send_size)
|
|
{
|
|
HAL_UART_Transmit_DMA(_instance->usart_handle, send_buf,send_size);
|
|
}
|
|
|
|
/**
|
|
* @brief everytiem when dma/idle happens,this function will be called
|
|
* here, for each uart, specific callback is refered for further process
|
|
* etc:visual protocol resolve/remote control resolve/referee protocol resolve
|
|
*
|
|
* @note because DMA half transfer iterrupt(DMA_IT_HT) would call this function too, so we just
|
|
* disable it when transfer complete using macro: __HAL_DMA_DISABLE_IT(huart->hdmarx,DMA_IT_HT)
|
|
*
|
|
* @param huart uart handle indicate which uart is being handled
|
|
* @param Size not used temporarily
|
|
*/
|
|
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
|
|
{
|
|
for (uint8_t i = 0; i < 3; i++)
|
|
{
|
|
if (huart == instance[i]->usart_handle)
|
|
{
|
|
instance[i]->module_callback();
|
|
HAL_UARTEx_ReceiveToIdle_DMA(instance[i]->usart_handle, instance[i]->recv_buff, instance[i]->recv_buff_size);
|
|
__HAL_DMA_DISABLE_IT(instance[i]->usart_handle->hdmarx, DMA_IT_HT);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief when error occurs in the process of send/receive,this function will be called
|
|
* then just simply restart send/receive.
|
|
*
|
|
* @note most frequent error ex: parity/overrrun/frame error
|
|
*
|
|
* @param huart uart handle type,indicate where error comes from
|
|
*/
|
|
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
|
|
{
|
|
for (uint8_t i = 0; i < 3; i++)
|
|
{
|
|
if (huart == instance[i]->usart_handle)
|
|
{
|
|
HAL_UARTEx_ReceiveToIdle_DMA(instance[i]->usart_handle, instance[i]->recv_buff, instance[i]->recv_buff_size);
|
|
__HAL_DMA_DISABLE_IT(instance[i]->usart_handle->hdmarx, DMA_IT_HT);
|
|
break;
|
|
}
|
|
}
|
|
} |