TC264学习(3)

串口

//*  函数名称:void UART_Init(void)
//*  功能说明:UART初始化函数
void UART0_Init(void)
{
	//关闭CPU中断
	IfxCpu_disableInterrupts();

	//新建串口配置结构体
	IfxAsclin_Asc_Config ascConfig;
	//初始化模块
	IfxAsclin_Asc_initModuleConfig(&ascConfig, &MODULE_ASCLIN0);

	//设置波特率
	ascConfig.baudrate.prescaler = 1;    //分频值
	ascConfig.baudrate.baudrate  = 115200; //波特率
	//ascConfig.baudrate.oversampling =IfxAsclin_OversamplingFactor_8; //LQ

	ascConfig.frame.frameMode  = IfxAsclin_FrameMode_asc;//数据帧模式
	ascConfig.frame.dataLength = IfxAsclin_DataLength_8; //数据长度
	ascConfig.frame.stopBit = IfxAsclin_StopBit_1;       //停止位
	ascConfig.frame.shiftDir = IfxAsclin_ShiftDirection_lsbFirst;//移位方向
	ascConfig.frame.parityBit = FALSE;//无奇偶校验

    //中断优先级配置
	ascConfig.interrupt.txPriority = IFX_INTPRIO_ASCLIN0_TX;
    ascConfig.interrupt.rxPriority = IFX_INTPRIO_ASCLIN0_RX;
    ascConfig.interrupt.erPriority = IFX_INTPRIO_ASCLIN0_ER;
	ascConfig.interrupt.typeOfService =   IfxSrc_Tos_cpu0;
	//ascConfig.interrupt.typeOfService = (IfxSrc_Tos)IfxCpu_getCoreId();//LQ
	//ascConfig.interrupt.typeOfService =IfxCpu_Irq_getTos(IfxCpu_getCoreIndex());

	//接收和发送FIFO的配置
	ascConfig.txBuffer = &ascTxBuffer;
	ascConfig.txBufferSize = ASC_TX_BUFFER_SIZE;
	ascConfig.rxBuffer = &ascRxBuffer;
	ascConfig.rxBufferSize = ASC_RX_BUFFER_SIZE;

	//管脚配置
	ascConfig.pins = &uart_pins;

	//调用上面结构体所预设的参数,完成模块的初始化
	IfxAsclin_Asc_initModule(&asc, &ascConfig);

	//接收,发送和错误中断配置
	IfxCpu_Irq_installInterruptHandler(&asclin0TxISR, IFX_INTPRIO_ASCLIN0_TX);
	IfxCpu_Irq_installInterruptHandler(&asclin0RxISR, IFX_INTPRIO_ASCLIN0_RX);
	IfxCpu_Irq_installInterruptHandler(&asclin0ErISR, IFX_INTPRIO_ASCLIN0_ER);

	//开启CPU中断
	IfxCpu_enableInterrupts();
}

//ASC模块中断参数获取
IfxAsclin_Asc* UART_GetHandle(void)
{
	return &asc;
}
//*  函数名称:uint8 UART_ReadByte(void)
//*  功能说明:UART读取字节
uint8 UART_ReadByte(void)
{
	uint8 data=0;
	Ifx_SizeT count = 1;
	IfxAsclin_Asc_read(&asc, &data, &count, TIME_INFINITE);
	return 	data;
}
//*  函数名称:void UART_WriteByte(uint8 data)
//*  功能说明:UART发送字节函数
void UART_WriteByte(uint8 data)
{
	IfxAsclin_Asc_blockingWrite(&asc, data);
}

/*************************************************************************
*  函数名称:void UART_WriteStr(uint8 *p_data, Ifx_SizeT count)
*  功能说明:UART发送字符串函数
*************************************************************************/
void UART_WriteStr(uint8 *p_data, Ifx_SizeT count)
{
	uint8 *p_send = p_data;

	if(count > 0)//不是空字符串则发送之
		IfxAsclin_Asc_write(&asc, p_data, &count, TIME_INFINITE);
	else         //空字符串发送null
	{
		while(*p_send != (uint8)'\0')
			UART_WriteByte(*p_send++);
	}
}
/*************************************************************************
*  函数名称:void UART_Put_Str (uint8 *str)
*  功能说明:UART发送字符串函数(遇 NULL 停止发送)
*  备    注:UART_Put_Str("ABC123456\n");
*************************************************************************/
void UART_Put_Str (uint8 *str)
{
    while(*str)
    {
    	UART_WriteByte(*str++);
    }
}
/*************************************************************************
*  函数名称:asclin0TxISR
*  功能说明:UART发送中断函数
*************************************************************************/
IFX_INTERRUPT(asclin0TxISR, 0, IFX_INTPRIO_ASCLIN0_TX)
{
	IfxAsclin_Asc_isrTransmit(UART_GetHandle());
}
/*************************************************************************
*  函数名称:uint8 IfxAsclin_Asc_Receive(IfxAsclin_Asc *asclin)
*  功能说明:UART接收函数
*************************************************************************/
uint8 IfxAsclin_Asc_Receive(IfxAsclin_Asc *asclin)
{
    uint8 ascData=0;

    switch (asclin->dataBufferMode)
    {
    case Ifx_DataBufferMode_normal:
    {
        /* FIXME optimize usage of HW fifo */
        /* FIXME add support for data size != 8 bit */
        IfxAsclin_read8(asclin->asclin, &ascData, 1);


        if (Ifx_Fifo_write(asclin->rx, &ascData, 1, TIME_NULL) != 0)
        {
            /* Receive buffer is full, data is discard */
            asclin->rxSwFifoOverflow = TRUE;
        }

        break;
    }
    case Ifx_DataBufferMode_timeStampSingle:
    {
        Ifx_DataBufferMode_TimeStampSingle packedData;

        packedData.timestamp = now();
        IfxAsclin_read8(asclin->asclin, &ascData, 1);
        packedData.data      = ascData;

        if (Ifx_Fifo_write(asclin->rx, &packedData, sizeof(packedData), TIME_NULL) != 0)
        {
            /* Receive buffer is full, data is discard */
            asclin->rxSwFifoOverflow = TRUE;
        }
    }
    break;
    }
    return ascData;
}
/*************************************************************************
*  函数名称:
*  功能说明:UART接收中断函数,返回接收的数据
*************************************************************************/
IFX_INTERRUPT(asclin0RxISR, 0, IFX_INTPRIO_ASCLIN0_RX)
{
	UART_WriteByte(IfxAsclin_Asc_Receive(UART_GetHandle()));
}
/*************************************************************************
*  函数名称:
*  功能说明:UART错误中断函数
*************************************************************************/
IFX_INTERRUPT(asclin0ErISR, 0, IFX_INTPRIO_ASCLIN0_ER)
{
	IfxAsclin_Asc_isrError(UART_GetHandle());
}

例子

void Test_UART0(void)
{
	GPIO_init(); //GPIO P10.5和P10.6
    UART0_Init();

	while(1)
	{
		UART_WriteByte('B');                       //发送 字节到UART口
		IfxPort_togglePin(&MODULE_P10, 6);          //闪灯
		IfxStm_waitTicks(&MODULE_STM0, 5000000);    //延时等待,注意不要跟别的地方STM中断冲突

		UART_WriteByte('b');                       //发送 字节到UART口
		//UART_WriteByte('\n');                      //发送 字节到UART口
		UART_Put_Str("Bobby\n");                  //发送字符串到上位机

		IfxPort_togglePin(&MODULE_P10, 6);//LED电平翻转,闪烁
		delayms(500);                     //延时等待


	}
}
发布了87 篇原创文章 · 获赞 33 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44146373/article/details/105421676
tc
264