📄 serial_drv_stm32.c
字号:
p_reg->BRR = (div_int << 4) | /* Set baud rate. */
(div_frac & 0xF);
cr2 = p_reg->CR2;
cr2 &= ~(CR2_CLKEN |
CR2_CPOL |
CR2_LBCL);
cr2 |= CR2_CPHA;
p_reg->CR2 = cr2;
p_reg->CR1 |= CR1_UE; /* En rx'er & tx'er. */
*perr = SERIAL_ERR_NONE;
}
/*$PAGE*/
/*
*********************************************************************************************************
* SerialDrv_Close()
*
* Description : Close a serial device for communication.
*
* Argument(s) : pdev Pointer to device.
*
* perr Pointer to variable that will receive the return error code from this function :
*
* SERIAL_ERR_NONE Device closed.
*
* Return(s) : None.
*
* Caller(s) : Serial_Close() via 'pdev->Drv_API->Close()'.
*
* Note(s) : (1) Interrupts are assumed to be disabled when this function is called.
*********************************************************************************************************
*/
static void SerialDrv_Close (SERIAL_DEV *pdev,
SERIAL_ERR *perr)
{
SERIAL_REG *p_reg;
SERIAL_DEV_CFG *p_cfg;
/* -------------------- RESET UART -------------------- */
p_cfg = pdev->Dev_Cfg;
p_reg = (SERIAL_REG *)p_cfg->BaseAddr;
p_reg->CR1 &= ~CR1_UE; /* Dis rx'er & tx'er. */
p_reg->CR1 &= ~(CR1_RXNEIE | /* Dis rx int. */
CR1_TXEIE); /* Dis tx int. */
p_cfg->BSP_API->ClkDis(perr); /* Dis dev-specific HW clk. */
if (*perr != SERIAL_ERR_NONE) {
return;
}
*perr = SERIAL_ERR_NONE;
}
/*$PAGE*/
/*
*********************************************************************************************************
* SerialDrv_RxStart()
*
* Description : Start receiving data & getting data received interrupts.
*
* Argument(s) : pdev Pointer to device.
*
* perr Pointer to variable that will receive the return error code from this function :
*
* SERIAL_ERR_NONE Device reception started.
*
* Return(s) : None.
*
* Caller(s) : Serial_Open(),
* Serial_IF_RxStart() via 'pdev->Drv_API->RxStart()'.
*
* Note(s) : (1) Interrupts are assumed to be disabled when this function is called.
*********************************************************************************************************
*/
static void SerialDrv_RxStart (SERIAL_DEV *pdev,
SERIAL_ERR *perr)
{
SERIAL_REG *p_reg;
SERIAL_DEV_CFG *p_cfg;
p_cfg = pdev->Dev_Cfg;
p_reg = (SERIAL_REG *)p_cfg->BaseAddr;
p_reg->CR1 |= CR1_RXNEIE; /* En rx int. */
*perr = SERIAL_ERR_NONE;
}
/*$PAGE*/
/*
*********************************************************************************************************
* SerialDrv_RxStop()
*
* Description : Stop receiving data and data received interrupts.
*
* Argument(s) : pdev Pointer to device.
*
* perr Pointer to variable that will receive the return error code from this function :
*
* SERIAL_ERR_NONE Device reception stopped.
*
* Return(s) : None.
*
* Caller(s) : Serial_Close(),
* Serial_IF_Rx(),
* Serial_IF_RxStop() via 'pdev->Drv_API->RxStop()'.
*
* Note(s) : (1) Interrupts are assumed to be disabled when this function is called.
*********************************************************************************************************
*/
static void SerialDrv_RxStop (SERIAL_DEV *pdev,
SERIAL_ERR *perr)
{
SERIAL_REG *p_reg;
SERIAL_DEV_CFG *p_cfg;
p_cfg = pdev->Dev_Cfg;
p_reg = (SERIAL_REG *)p_cfg->BaseAddr;
p_reg->CR1 &= ~CR1_RXNEIE; /* Dis rx int. */
*perr = SERIAL_ERR_NONE;
}
/*$PAGE*/
/*
*********************************************************************************************************
* SerialDrv_RxOctet()
*
* Description : Receive data octet.
*
* Argument(s) : pdev Pointer to device.
*
* pdatum Pointer to variable that will receive the received data octet.
*
* perr Pointer to variable that will receive the return error code from this function :
*
* SERIAL_ERR_NONE Device octet transmitted,
* SERIAL_ERR_DRV_IO_ERR Device octet NOT transmitted.
*
* Return(s) : None.
*
* Caller(s) : Serial_IF_Rx() via 'pdrv_api->RxOctet()'.
*
* Note(s) : (1) Interrupts are assumed to be disabled when this function is called.
*********************************************************************************************************
*/
static void SerialDrv_RxOctet (SERIAL_DEV *pdev,
CPU_INT08U *pdatum,
SERIAL_ERR *perr)
{
SERIAL_REG *p_reg;
SERIAL_DEV_CFG *p_cfg;
p_cfg = pdev->Dev_Cfg;
p_reg = (SERIAL_REG *)p_cfg->BaseAddr;
if ((p_reg->SR & SR_RXNE) == 0) { /* If rx not rdy, return err. */
*perr = SERIAL_ERR_DRV_IO_ERR;
return;
}
*pdatum = p_reg->DR & 0xFF;
*perr = SERIAL_ERR_NONE;
}
/*$PAGE*/
/*
*********************************************************************************************************
* SerialDrv_TxStart()
*
* Description : Start transmitting data & getting data transmitted interrupts.
*
* Argument(s) : pdev Pointer to device.
*
* perr Pointer to variable that will receive the return error code from this function :
*
* SERIAL_ERR_NONE Device transmission started.
*
* Return(s) : None.
*
* Caller(s) : Serial_IF_Tx(),
* Serial_WrStart() via 'pdev->Drv_API->TxStart()'.
*
* Note(s) : (1) Interrupts are assumed to be disabled when this function is called.
*********************************************************************************************************
*/
static void SerialDrv_TxStart (SERIAL_DEV *pdev,
SERIAL_ERR *perr)
{
SERIAL_REG *p_reg;
SERIAL_DEV_CFG *p_cfg;
p_cfg = pdev->Dev_Cfg;
p_reg = (SERIAL_REG *)p_cfg->BaseAddr;
p_reg->CR1 |= CR1_TCIE; /* En tx int. */
*perr = SERIAL_ERR_NONE;
}
/*$PAGE*/
/*
*********************************************************************************************************
* SerialDrv_TxStop()
*
* Description : Stop transmitting data & getting data transmitted interrupts.
*
* Argument(s) : pdev Pointer to device.
*
* perr Pointer to variable that will receive the return error code from this function :
*
* SERIAL_ERR_NONE Device transmission stopped.
*
* Return(s) : None.
*
* Caller(s) : Serial_Close(),
* Serial_IF_Tx(),
* Serial_WrStartNext() via 'pdev->Drv_API->TxStop()'.
*
* Note(s) : (1) Interrupts are assumed to be disabled when this function is called.
*********************************************************************************************************
*/
static void SerialDrv_TxStop (SERIAL_DEV *pdev,
SERIAL_ERR *perr)
{
SERIAL_REG *p_reg;
SERIAL_DEV_CFG *p_cfg;
p_cfg = pdev->Dev_Cfg;
p_reg = (SERIAL_REG *)p_cfg->BaseAddr;
p_reg->CR1 &= ~CR1_TCIE; /* Dis tx int. */
*perr = SERIAL_ERR_NONE;
}
/*$PAGE*/
/*
*********************************************************************************************************
* SerialDrv_TxOctet()
*
* Description : Transmit data octet.
*
* Argument(s) : pdev Pointer to device.
*
* datum Data octet to transmit.
*
* perr Pointer to variable that will receive the return error code from this function :
*
* SERIAL_ERR_NONE Device octet transmitted,
* SERIAL_ERR_DRV_IO_ERR Device octet NOT transmitted.
*
* Return(s) : None.
*
* Caller(s) : Serial_IF_Tx() via 'pdrv_api->TxOctet()',
* Serial_WrStart() via 'pdev->Drv_API->TxOctet()'.
*
* Note(s) : (1) Interrupts are assumed to be disabled when this function is called.
*********************************************************************************************************
*/
static void SerialDrv_TxOctet (SERIAL_DEV *pdev,
CPU_INT08U datum,
SERIAL_ERR *perr)
{
SERIAL_REG *p_reg;
SERIAL_DEV_CFG *p_cfg;
p_cfg = pdev->Dev_Cfg;
p_reg = (SERIAL_REG *)p_cfg->BaseAddr;
if ((p_reg->SR & SR_TXE) == 0) { /* If tx not rdy, return err. */
*perr = SERIAL_ERR_DRV_IO_ERR;
return;
}
p_reg->DR = datum; /* Tx octet. */
*perr = SERIAL_ERR_NONE;
}
/*$PAGE*/
/*
*********************************************************************************************************
* SerialDrv_ISR_Handler()
*
* Description : Handle serial interface's device interrupt service routine (ISR) function(s).
*
* Argument(s) : pdev Pointer to device.
*
* type Device interrupt type(s) to handle :
*
* SERIAL_ISR_TYPE_UNKNOWN Handle unknown device ISR(s).
* SERIAL_ISR_TYPE_RX Handle device receive ISR(s).
* SERIAL_ISR_TYPE_RX_OVERRUN Handle device receive overrun ISR(s).
* SERIAL_ISR_TYPE_TX_RDY Handle device transmit ready ISR(s).
* SERIAL_ISR_TYPE_TX_COMPLETE Handle device transmit complete ISR(s).
* SERIAL_ISR_TYPE_ERR Handle device error ISR(s).
*
* Return(s) : None.
*
* Caller(s) : Device driver(s)' Board Support Package (BSP) Interrupt Service Routine (ISR) handler(s).
*
* Note(s) : None.
*********************************************************************************************************
*/
static void SerialDrv_ISR_Handler (SERIAL_DEV *pdev,
CPU_INT08U type)
{
SERIAL_REG *p_reg;
SERIAL_DEV_CFG *p_cfg;
CPU_INT08U datum;
CPU_INT16U status;
CPU_INT16U mask;
(void)&type;
p_cfg = pdev->Dev_Cfg;
p_reg = (SERIAL_REG *)p_cfg->BaseAddr;
status = p_reg->SR;
mask = p_reg->CR1;
/* --------------- HANDLE WR COMPLETION --------------- */
if (DEF_BIT_IS_SET(status, SR_TC) &&
DEF_BIT_IS_SET(mask, CR1_TCIE)) {
SerialIF_Tx(pdev); /* Inform serial core of wr completion. */
}
/* --------------- HANDLE RD COMPLETION --------------- */
if (DEF_BIT_IS_SET(status, SR_RXNE) &&
DEF_BIT_IS_SET(mask, CR1_RXNEIE)) {
datum = p_reg->DR & 0xFF;
SerialIF_Rx(pdev, datum); /* Inform serial core of rx completion. */
} else if (DEF_BIT_IS_SET(status, SR_ORE)) { /* Clr overrun condition. */
datum = p_reg->DR & 0xFF;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -