不含stm32 底层的代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MyStm32Code/bsp/Src/bsp_uart.c

213 lines
5.4 KiB

2 years ago
#include "bsp_uart.h"
2 years ago
#include "elog.h"
2 years ago
2 years ago
UART_HELPER_TypeDef * UART_HELPER_Init( )
2 years ago
{
2 years ago
UART_HELPER_TypeDef *Handle = (UART_HELPER_TypeDef *)malloc(sizeof(UART_HELPER_TypeDef));
2 years ago
if (Handle == NULL)
{
return NULL;
}
2 years ago
Handle->interface_type = Uart_Interface_Default;
Handle->enable_idle_it = Uart_IDLE_IT_DISABLE;
Handle->trans_mode = Uart_Trans_Polling;
Handle->rcv_mode = Uart_Trans_Polling;
Handle->trans_record = (Record_Trans_Rcv_TypeDef *)malloc(sizeof(Record_Trans_Rcv_TypeDef));
// Handle->rcv_record = (Record_Trans_Rcv_TypeDef *)malloc(sizeof(Record_Trans_Rcv_TypeDef));
2 years ago
Handle->send_flag = 0;
Handle->send_tc_flag = 0;
2 years ago
Handle->transferring = 0;
Handle->enable_trans_gpio =NULL;
Handle->enable_trans_cplt_gpio =NULL;
2 years ago
2 years ago
Handle->obj =NULL;
Handle->callback =NULL;
2 years ago
return Handle;
}
2 years ago
void UART_HELPER_Set_Huart(UART_HELPER_TypeDef * uarthelper, UART_HandleTypeDef *huart)
{
uarthelper->huart = huart;
}
int UART_HELPER_Set_Interface_Type(UART_HELPER_TypeDef * uarthelper, uint8_t interface_type)
2 years ago
{
2 years ago
uarthelper->interface_type = interface_type;
return 0;
2 years ago
}
2 years ago
int UART_HELPER_Setup_Trans_mode( UART_HELPER_TypeDef * uarthelper, uint8_t trans_mode )
2 years ago
{
/* 0 :polling, 1: IT 2: DMA*/
2 years ago
uarthelper->trans_mode = trans_mode;
uarthelper->rcv_mode = trans_mode;
2 years ago
return 0;
}
2 years ago
int UART_HELPER_Setup_Rcv_mode( UART_HELPER_TypeDef * uarthelper, uint8_t rcv_mode )
{
/* 0 :polling, 1: IT 2: DMA*/
uarthelper->rcv_mode = rcv_mode;
return 0;
}
int UART_HELPER_Set_trans_GPIO( UART_HELPER_TypeDef * uarthelper, enable_func_gpio trans_gpio_func )
2 years ago
{
2 years ago
uarthelper->enable_trans_gpio = trans_gpio_func;
2 years ago
return 0;
}
2 years ago
int UART_HELPER_Set_trans_cplt_GPIO( UART_HELPER_TypeDef * uarthelper, enable_func_gpio trans_cplt_gpio_func )
2 years ago
{
2 years ago
// enable rcv
uarthelper->enable_trans_cplt_gpio = trans_cplt_gpio_func;
2 years ago
return 0;
}
2 years ago
int UART_HELPER_Set_enable_idle( UART_HELPER_TypeDef * uarthelper, uint8_t enable_idle)
2 years ago
{
2 years ago
uarthelper->enable_idle_it = enable_idle;
return 0;
2 years ago
}
2 years ago
int UART_HELPER_Set_Rcv_Buf( UART_HELPER_TypeDef * uarthelper, uint8_t * buf, uint16_t size)
2 years ago
{
2 years ago
uarthelper->rcv_buf = buf;
uarthelper->rcv_size = size;
// uarthelper->rcv_record->buf = buf;
// uarthelper->rcv_record->size = size;
return 0;
2 years ago
}
2 years ago
int UART_HELPER_Set_Trans_Buf( UART_HELPER_TypeDef * uarthelper, uint8_t * buf, uint16_t size)
{
// uarthelper->trans_buf = buf;
// uarthelper->trans_size = size;
2 years ago
2 years ago
uarthelper->trans_record->buf = buf;
uarthelper->trans_record->size = size;
return 0;
}
int UART_HELPER_Set_Callback( UART_HELPER_TypeDef * uarthelper, void *obj, callback_fun func)
{
uarthelper->obj = obj;
uarthelper->callback = func;
return 0;
}
int UART_HELPER_Start_Rcv(UART_HELPER_TypeDef * uarthelper, uint8_t *buf, uint16_t size)
2 years ago
{
int st;
2 years ago
switch ( uarthelper->rcv_mode)
2 years ago
{
case 0:
2 years ago
st = HAL_UART_Receive(uarthelper->huart, buf, size , 0xFFFF);
2 years ago
return st;
break;
case 1:
2 years ago
st = HAL_UART_Receive_IT(uarthelper->huart, buf, size);
2 years ago
return st;
break;
case 2:
/* 会出现 st ==2 huart->gState != HAL_UART_STATE_READY */
2 years ago
if (uarthelper->enable_idle_it == 1)
2 years ago
{
2 years ago
// log_i("dma rcv idle en... ");
__HAL_UART_ENABLE_IT(uarthelper->huart, UART_IT_IDLE);
2 years ago
}
2 years ago
st = HAL_UART_Receive_DMA(uarthelper->huart, buf, size);
// log_i("dma rcv ... ");
2 years ago
return st;
break;
default:
break;
}
2 years ago
return st;
2 years ago
}
2 years ago
int UART_HELPER_Trans(UART_HELPER_TypeDef * uarthelper, uint8_t *buf, uint16_t size )
2 years ago
{
int st;
2 years ago
uarthelper->transferring = 1;
if (uarthelper->enable_trans_gpio != NULL)
2 years ago
{
2 years ago
uarthelper->enable_trans_gpio();
2 years ago
}
2 years ago
switch ( uarthelper->trans_mode)
2 years ago
{
case 0:
2 years ago
st = HAL_UART_Transmit(uarthelper->huart, buf, size , 0xFFFF);
2 years ago
return st;
break;
case 1:
2 years ago
st = HAL_UART_Transmit_IT(uarthelper->huart, buf, size);
2 years ago
return st;
break;
case 2:
/* 会出现 st ==2 huart->gState != HAL_UART_STATE_READY */
2 years ago
st = HAL_UART_Transmit_DMA(uarthelper->huart, buf, size);
2 years ago
return st;
break;
default:
break;
}
2 years ago
return st;
2 years ago
}
2 years ago
int UART_HELPER_Trans_TxCplt_Callback( UART_HELPER_TypeDef * uarthelper )
2 years ago
{
2 years ago
// log_i( " uarthelper tc callback...........");
uarthelper->transferring = 0;
if (uarthelper->enable_trans_cplt_gpio != NULL)
2 years ago
{
2 years ago
// log_i( " uarthelper tc callback... not null........");
uarthelper->enable_trans_cplt_gpio();
2 years ago
}
return 0;
}
2 years ago
int UART_HELPER_RCV_Cplt_Callback( UART_HELPER_TypeDef * uarthelper )
{
log_i( " UART_HELPER_RCV_Cplt_Callback ........");
// TODO
if (uarthelper->enable_idle_it == 0)
{
uarthelper->callback( uarthelper->obj, uarthelper->rcv_buf,uarthelper->rcv_size);
}
if (uarthelper->enable_idle_it == 1)
{
// idle 中断处理, do nothing
}
return 0;
}
int UART_HELPER_RCV_IDLE_Callback( UART_HELPER_TypeDef * uarthelper, uint16_t size )
{
// TODO
// if (uarthelper->rcv_mode == 0)
// {
// HAL_UART_DMAStop( uarthelper->huart );
// }
HAL_UART_DMAStop( uarthelper->huart );
uarthelper->callback( uarthelper->obj, uarthelper->rcv_buf, size);
UART_HELPER_Start_Rcv(uarthelper, uarthelper->rcv_buf, uarthelper->rcv_size);
return 0;
}