MCAL配置Port

Port配置串口IO模式

Mcu配置时钟,频率307200

代码

由于MCAL没有串口模块,故上面仅实现IO模式及时钟的配置,串口部分使用官方SDL库实现。

定义使用的SCB模块及串口IO:

/* USB-UART Mux */
#define CY_USB_SCB_TYPE                 SCB0
#define CY_USB_SCB_UART_RX_PORT         GPIO_PRT0
#define CY_USB_SCB_UART_RX_PIN          0
#define CY_USB_SCB_UART_RX_MUX          P0_0_SCB0_UART_RX
#define CY_USB_SCB_UART_TX_PORT         GPIO_PRT0
#define CY_USB_SCB_UART_TX_PIN          1
#define CY_USB_SCB_UART_TX_MUX          P0_1_SCB0_UART_TX
#define CY_USB_SCB_UART_PCLK            PCLK_SCB0_CLOCK
#define CY_USB_SCB_UART_IRQN            scb_0_interrupt_IRQn

初始化:

cy_stc_scb_uart_context_t   g_stc_uart_context;
const cy_stc_scb_uart_config_t g_stc_uart_config =
{
    .uartMode = CY_SCB_UART_STANDARD,
    .oversample = 16,
    .dataWidth = 8,
    .enableMsbFirst = false,
    .stopBits = CY_SCB_UART_STOP_BITS_1,
    .parity = CY_SCB_UART_PARITY_NONE,
    .enableInputFilter = false,
    .dropOnParityError = false,
    .dropOnFrameError = false,
    .enableMutliProcessorMode = false,
    .receiverAddress = 0,
    .receiverAddressMask = 0,
    .acceptAddrInFifo = false,
    .irdaInvertRx = false,
    .irdaEnableLowPowerReceiver = false,
    .smartCardRetryOnNack = false,
    .enableCts = false,
    .ctsPolarity = CY_SCB_UART_ACTIVE_HIGH,
    .rtsRxFifoLevel = 0,
    .rtsPolarity = CY_SCB_UART_ACTIVE_HIGH,
    .breakWidth = 0,
    .rxFifoTriggerLevel = 0,
    .rxFifoIntEnableMask = CY_SCB_UART_RX_INTR,
    .txFifoTriggerLevel = 0,
    .txFifoIntEnableMask = CY_SCB_UART_TX_INTR
};

void drv_uartInit(void)
{
    cy_stc_gpio_pin_config_t    stc_port_pin_cfg_uart = {0};
    cy_stc_sysint_irq_t         stc_sysint_irq_cfg_uart;
        Cy_SCB_UART_DeInit(CY_USB_SCB_TYPE);
    Cy_SCB_UART_Init(CY_USB_SCB_TYPE, &g_stc_uart_config, &g_stc_uart_context);
    Cy_SCB_UART_Enable(CY_USB_SCB_TYPE);
}

发送及接收中断服务函数

void Scb_UART_IntrISR(void)
{
    UINT8 u8_data;
    UINT8 u8_num;
  
    if(CY_SCB_RX_INTR & Cy_SCB_GetInterruptCause(CY_USB_SCB_TYPE))
    {
        /** Interrupt from RX interrupt sources */
        //1.First read data
        u8_num = Cy_SCB_ReadArray(CY_USB_SCB_TYPE, &u8_data, 1);
            //2.then clear interrupt request
        Cy_SCB_ClearRxInterrupt(CY_USB_SCB_TYPE, CY_SCB_UART_RX_INTR);
        //3.Valid data into RX buffer
        if(u8_num > 0)
        {
            //receive todo
        }
        else
        {
            /* No data in FIFO. */
        }
    }
    if(CY_SCB_TX_INTR & Cy_SCB_GetInterruptCause(CY_USB_SCB_TYPE))
    {
        /** Interrupt from TX interrupt sources */
        Cy_SCB_ClearTxInterrupt(CY_USB_SCB_TYPE, CY_SCB_UART_TX_INTR);
        //send over todo
    }
}