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