⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serial_drv_stm32.c

📁 STM3240G-Eval_uCOS-III
💻 C
📖 第 1 页 / 共 2 页
字号:

    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 + -